wraptest.java

来自「java learn PPT java learn PPT java learn」· Java 代码 · 共 229 行

JAVA
229
字号
     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:
                    case KeyEvent.VK_DOWN:
                         accel.setX(0.0);
                         accel.setY(0.0);      
                         break;
                          
                    default: break;
               }
          }

     }    // WrapTest

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?