⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 airplane.java

📁 java2 游戏设计书的全部源码
💻 JAVA
字号:
// 程序:火焰中的飞机
// 范例文件:Airplane.java

import java.awt.*;
import java.util.*;
import java.applet.*;
import java.awt.event.*;

abstract class SuperSprite     //这是Sprite父类
{
   int     X,Y,width,height;
   boolean visible,active;

   abstract public void paintSprite(Graphics g);
   abstract public void updateState();

   public int getX()
   {
      return X;
   }

   public int getY()
   {
      return Y;
   }

   public void setLocation(int X,int Y)
   {
      this.X = X;
      this.Y = Y;
   }

   public int getWidth()
   {
      return width;
   }

   public int getHeight()
   {
      return height;
   }

   public void setSize(int width,int height)
   {
      this.width  = width;
      this.height = height;
   }

   public boolean canVisible()
   {
      return visible;
   }

   public void setVisible(boolean v)
   {
      visible = v;
   }

   public boolean canMove()
   {
      return active;
   }

   public void setMove(boolean m)
   {
      active = m;
   }
}

class ImageSprite extends SuperSprite   //图像Sprite
{
   Image  SpriteImage;                  //Sprite本身的图像
   Applet Game;                         //在绘制图像时会用到
  
   public ImageSprite(Image SpriteImage,Applet Game)
   {
      this.SpriteImage   = SpriteImage;
      this.Game          = Game;   
            
      setLocation(0,0);                 //设定起始位置
      setVisible(true);                 //可见
      setMove(true);                    //可移动 
   }

   public void updateState()
   {
  }

   public void paintSprite(Graphics g)  //绘制Sprite
   {
      if(visible == true)      
         g.drawImage(SpriteImage,X,Y,Game);  //在最后一个参数中输入Applet
   }
}

class BulletSprite extends ImageSprite  //子弹Sprite
{
   int AppletWidth,AppletHeight;

   public BulletSprite(Image bullet,Applet Game,int AppletWidth,
                       int AppletHeight)
   {
      super(bullet,Game);               //调用父类的创建方法

      this.AppletWidth  = AppletWidth;
      this.AppletHeight = AppletHeight;

      setVisible(false);               //不可见
      setMove(false);                  //不可移动
   }

   public void updateState()           //转换子弹Sprite的状态
   {
      if(active == true)
      {
         if(X > AppletWidth)           //当子弹穿过右边界时
         {
            setVisible(false);         //设定子弹Sprite为不可见
            setMove(false);            //设定子弹Sprite为不可移动
         }
         else
            X = X + 10;                //向右移动20像素
      }
   }

   public void paintSprite(Graphics g) //绘制子弹Sprite
   {
      if(visible == true)
         g.drawImage(SpriteImage,X,Y,Game);
   }
}

public class Airplane extends Applet   //此为游戏主类
             implements Runnable,MouseListener,MouseMotionListener
{
   int          AppletWidth,AppletHeight,ImageWidth,ImageHeight,
                currentImage,mouseX,mouseY,X,Y;
   Image        background[],airplane,bullet,OffScreen;
   Random       R;
   Thread       newThread; 
   Graphics     drawOffScreen;
   MediaTracker MT;

   ImageSprite  airplaneSprite,BulletSprite;

   public void init()
   {
      addMouseListener(this);            //注册事件处理方法
      addMouseMotionListener(this);   

      background   = new Image[5];
      MT           = new MediaTracker(this);
      R            = new Random();
      currentImage = 0;
      AppletWidth  = getSize().width;
      AppletHeight = getSize().height;

      //使用MediaTracker取得必要图像
      for(int i=0;i<5;i++)
      {
         background[i] = getImage(getDocumentBase(),"Images/thunder" +
                                  i + ".gif");

         MT.addImage(background[i],0);
      }

      airplane = getImage(getDocumentBase(),"Images/airplane.gif");
      bullet   = getImage(getDocumentBase(),"Images/bullet.gif"); 
      MT.addImage(airplane,0); 
      MT.addImage(bullet,0);

      try
      {
         MT.waitForAll();
      }      
      catch(InterruptedException E){ }   //没有进行异常处理

      ImageWidth     = airplane.getWidth(this);
      ImageHeight    = airplane.getHeight(this);

      //建立Sprite
      airplaneSprite = new ImageSprite(airplane,this);
      BulletSprite   = new BulletSprite(bullet,this,AppletWidth,
                                        AppletHeight);
 
      //建立次画面
      OffScreen      = createImage(AppletWidth,AppletHeight);
      drawOffScreen  = OffScreen.getGraphics();
   }

   public void start()                    //start()方法  
   {
      newThread = new Thread(this);       //建立与启动新线程
      newThread.start();
   }

   public void stop()                     //stop()方法
   {
      newThread = null;                   //将线程设为null
   }

   public void paint(Graphics g)
   {
      //只清除此部分区域的图像
      drawOffScreen.clearRect(0,0,AppletWidth,AppletHeight);

      //注意绘制顺序(Z-Order)
      drawOffScreen.drawImage(background[currentImage],0,0,this);
      airplaneSprite.paintSprite(drawOffScreen);
      BulletSprite.paintSprite(drawOffScreen);
           
      //将次画面贴到主画面上
      g.drawImage(OffScreen,0,0,this); 
   }
  
   public void update(Graphics g)         //update()方法
   {
      paint(g);                           //只单纯调用paint()方法
   }

   public void run()
   {
      while(newThread != null)
      {
         repaint();                       //重绘图像

         try
         {
            Thread.sleep(33);             //暂停33毫秒
         }
         catch(InterruptedException E){ }

         if(R.nextInt(10) < 1)            //转换帧动画
            currentImage = R.nextInt(5);

         BulletSprite.updateState();      //转换子弹Sprite状态
      }
   }

   //=====实作MouseListener界面=======================================
   public void mouseExited(MouseEvent e){}    //鼠标离开Component
   public void mouseClicked(MouseEvent e){}   //鼠标按键被按下后放开
    public void mouseReleased(MouseEvent e){} //鼠标按键放开
   
   public void mouseEntered(MouseEvent e)     //鼠标进入Component
   {
      mouseX = e.getX();
      mouseY = e.getY();

      //设定飞机的边界动作
      if(mouseX < ImageWidth / 2)
         X = ImageWidth / 2;
      else if(mouseX > AppletWidth - (ImageWidth / 2))
         X = AppletWidth - (ImageWidth / 2);
      else
         X = mouseX;

      if(mouseY < ImageHeight / 2)
         Y = ImageHeight / 2;
      else if(mouseY > AppletHeight - (ImageHeight / 2))
         Y = AppletHeight - (ImageHeight / 2);
      else
         Y = mouseY;

      //设定飞机图像的正确位置
      airplaneSprite.setLocation(X - (ImageWidth / 2),Y - (ImageHeight / 2));
   }

   public void mousePressed(MouseEvent e)     //鼠标按键被按下
   {
      //发射子弹
      if(BulletSprite.canVisible() == false && 
         BulletSprite.canMove() == false)
      {
         BulletSprite.setLocation(X + (ImageWidth / 2),Y);
         BulletSprite.setVisible(true);
         BulletSprite.setMove(true);
      }
   }
   
   //=====实作MouseMotionListener界面=================================
   public void mouseMoved(MouseEvent e)       //鼠标移动时
   {
      //移动飞机
      mouseX = e.getX();
      mouseY = e.getY();

      //设定飞机的边界动作
      if(mouseX < ImageWidth / 2)
         X = ImageWidth / 2;
      else if(mouseX > AppletWidth - (ImageWidth / 2))
         X = AppletWidth - (ImageWidth / 2);
      else
         X = mouseX;

      if(mouseY < ImageHeight / 2)
         Y = ImageHeight / 2;
      else if(mouseY > AppletHeight - (ImageHeight / 2))
         Y = AppletHeight - (ImageHeight / 2);
      else
         Y = mouseY;

      //设定飞机图像的正确位置
      airplaneSprite.setLocation(X - (ImageWidth / 2),Y - (ImageHeight / 2));  
   }  
 
   public void mouseDragged(MouseEvent e)     //鼠标拖曳时 
   {
   }
}

⌨️ 快捷键说明

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