【Java开源代码栏目提醒】:网学会员为广大网友收集整理了,WrapTest.java,希望对大家有所帮助!
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class WrapTest extends Applet implements Runnable, KeyListener
{
// 动画线程
private Thread animation;
private BufferedGraphics offscreen;
// 跟踪飞船的加速
private Vector2D accel;
private final double MAX_ACCEL = 5.0f;
// 旋转一度
private final double ONE_RADIAN = Math.toRadians(1.0);
// 充当回转物的actor
private Actor2D ship;
public void init()
{
// 创建飞船和它的角色组
StaticActorGroup group = new StaticActorGroup("ship.gif");
group.init(this);
ship = new StaticActor(group);
addKeyListener(this);
accel = new Vector2D.Double();
offscreen = new VolatileGraphics(this);
animation = new Thread(this);
AnimationStrip.observer = this;
} // init
public void start()
{
// 启动动画线程
animation.start();
}
public void stop()
{
animation = null;
}
public void run()
{
Thread t = Thread.currentThread();
while (t == animation)
{
repaint();
try
{
Thread.sleep(10);
}
catch(InterruptedException e)
{
break;
}
}
} // run
public void update(Graphics g)
{
double accelX = accel.getX();
double accelY = accel.getY();
// 分别对物体的x,y坐标进行加速
// 再次检查最大值
if(accelX != 0)
{
ship.accelerate(accelX, 0);
if(ship.getVel().getX() > MAX_ACCEL)
{
ship.getVel().setX(MAX_ACCEL);
}
else if(ship.getVel().getX() < -MAX_ACCEL)
{
ship.getVel().setX(-MAX_ACCEL);
}
}
if(accelY != 0)
{
ship.accelerate(0, accelY);
if(ship.getVel().getY() > MAX_ACCEL)
{
ship.getVel().setY(MAX_ACCEL);
}
else if(ship.getVel().getY() < -MAX_ACCEL)
{
ship.getVel().setY(-MAX_ACCEL);
}
}
// 如果不再加速的话,让飞船慢下来
if(! ship.getVel().equals(Vector2D.ZERO_VECTOR) &&
accelX == 0 && accelY == 0)
{
Vector2D drag = ship.getVel();
drag.normalize();
ship.accelerate(-drag.getX(), -drag.getY());
}
// 更新飞船的位置,并在需要时回转
ship.update();
int x = (int) ship.getX();
int y = (int) ship.getY();
int h = (int) ship.getHeight();
int w = (int) ship.getWidth();
if(x > getSize().width)
{
ship.setX(-w+1);
}
else if(x < -w)
{
ship.setX(getSize().width-1);
}
if(y > getSize().height)
{
ship.setY(-h+1);
}
else if(y < -h)
{
ship.setY(getSize().height-1);
}
// 在状态栏中显示飞船的状态
showStatus(ship.getPos() + " " + (int)Math.toDegrees(ship.getRot()) + " " + ship.getVel());
paint(g);
}
public void paint(Graphics g)
{
Graphics2D bg = (Graphics2D)offscreen.getValidGraphics();
bg.setBackground(Color.BLACK);
bg.clearRect(0, 0, getSize().width, getSize().height);
// 绘制飞船
ship.paint(bg);
g.drawImage(offscreen.getBuffer(), 0, 0, this);
} // paint
public void keyTyped(KeyEvent e)
{
}
// 监视键按下事件,并在需要时对飞船进行加速和旋转
public void keyPressed(KeyEvent e)
{
if(ship == null) return;
switch(e.getKeyCode())
{
// 根据"前进"方向对飞船加速或者减速
case KeyEvent.VK_UP:
accel.setX(Math.cos(ship.getRot()));
accel.setY(Math.sin(ship.getRot()));
accel.normalize();
break;
case KeyEvent.VK_DOWN:
accel.setX(-Math.cos(ship.getRot()));
accel.setY(-Math.sin(ship.getRot()));
accel.normalize();
break;
// 旋转飞船并更新它的前进速度
case KeyEvent.VK_LEFT:
ship.rotate(-5*ONE_RADIAN);
if(! ship.getVel().equals(Vector2D.ZERO_VECTOR))
{
accel.setX(Math.cos(ship.getRot()));
accel.setY(Math.sin(ship.getRot()));
accel.normalize();
}
break;
case KeyEvent.VK_RIGHT:
ship.rotate(+5*ONE_RADIAN);
if(! ship.getVel().equals(Vector2D.ZERO_VECTOR))
{
accel.setX(Math.cos(ship.getRot()));
accel.setY(Math.sin(ship.getRot()));
accel.normalize();
}
break;
default: break;
}
}
public void keyReleased(KeyEvent e)
{
if(ship == null) return;
switch(e.getKeyCode())
{
// 只要向上/向下箭头键松开则停止加速
case KeyEvent.VK_UP:
cas