java入门笔记12

飞机大战

面向对象思想重构飞机类

package feiji;
import java.awt.*;
public class plane  extends GameObject { //要有无参构造器
    @Override
    public  void drawMyself(Graphics g){
        super.drawMyself(g);

        //飞机飞行的算法,可以自行设定
        x+=speed;
    }
    public  plane(Image img,double x,double y,int speed,int width,int height) {
        super(img,x,y,speed,width,height);
    }
   /**
       public  plane(Image img,double x,double y,int speed) {
        super(img,x,y,speed);
    }
    */
}
package feiji;

import java.awt.*;

/**
 * 游戏物体的根类
 */
public class GameObject {

    Image img;  //图片
    double x,y;//物体坐标
    int speed;//物体移动速度
    int     width,height;//物体高度,宽度

    public GameObject(Image img,double x,double y,int speed,int width,int height) {
        this.img = img;
        this.x=x;
        this.y=y;
        this.speed=speed;
        this.width=width;
        this.height=height;
    }

    public GameObject(Image img,double x,double y,int speed) {
        this.img = img;
        this.x=x;
        this.y=y;
        this.speed=speed;
        //物体的宽度和高度是跟图片的高度和宽度一样
        this.width=img.getWidth(null);
        this.height=img.getHeight(null);
    }
   public GameObject(){

    }//需要构造无参方法,才可被子类调用

    public  void drawMyself(Graphics g){
        g.drawImage(img,(int)x,(int)y,width,height,null);
    }

    //所有的物体都是矩形,当你获得对应的矩形的时候,就可以做一些相关判断操作
     public Rectangle getRec(){
        return  new Rectangle((int)x,(int)y,width,height);
     }
}

键盘控制游戏物体运动

package feiji;

import java.awt.*;
import java.lang.*;
import java.awt.event.*;
/**
 * 游戏主窗口
 * @author 86159
 *
 */
public class MyGame extends Frame {


    Image planeImg=Gameu.getImage("images/feiji.png");
      Image bg=Gameu.getImage("images/bj.png");


      plane p1=new plane(planeImg,100,100,3,50,50);

      boolean left,right,up,down;//控制飞机的方向

    @Override
    public void paint(Graphics g) {  //g相当于是一个画笔


       g.drawImage(bg,0,0,500,500,null);

        p1.drawMyself(g);


        if(left){
            p1.x-=p1.speed;
        }
        if(right){
            p1.x+=p1.speed;
        }
        if(up){
            p1.y-=p1.speed;
        }
        if(down){
            p1.y+=p1.speed;
        }

    }
    public void launchFrame() {
        this.setTitle("飞机大战");
        setVisible(true);//窗口是否可见
        setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGH);//窗口大小
        setLocation(100,100);//窗口打开位置

        //增加窗口的关闭动作
        this.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        new PaintThread().start();  //启动重画窗口的线程
        this.addKeyListener(new KeyMonitor()); //启动键盘监听

    }

    /**
     * 定义一个重画窗口的线程类
     * 定义成内部类是为了方便直接使用窗口类的相关方法
     */
    class PaintThread extends Thread{
        @Override
        public void run(){
            while (true){
                repaint();//内部类可以直接使用外部类的成员!

             try{
                 Thread.sleep(50);    //1s画20次(20*50=1000)
             }catch (InterruptedException e){
                 e.printStackTrace();
             }
            }
        }
    }

    //内部类实现键盘的监听处理
    class KeyMonitor extends KeyAdapter{

        @Override
        public  void keyPressed(KeyEvent e){
            System.out.println("按下:"+e.getKeyCode());
            if(e.getKeyCode()==KeyEvent.VK_LEFT){
                left=true;
            }
            if(e.getKeyCode()==KeyEvent.VK_RIGHT){
                right=true;
            }
            if(e.getKeyCode()==KeyEvent.VK_UP){
                up=true;
            }
            if(e.getKeyCode()==KeyEvent.VK_DOWN){
                down=true;
            }
        }

        @Override
        public void keyReleased(KeyEvent e){
            System.out.println("抬起:"+e.getKeyCode());
            //可以使用switch方法
            if(e.getKeyCode()==KeyEvent.VK_LEFT){
                left=false;
            }
            if(e.getKeyCode()==KeyEvent.VK_RIGHT){
                right=false;
            }
            if(e.getKeyCode()==KeyEvent.VK_UP){
                up=false;
            }
            if(e.getKeyCode()==KeyEvent.VK_DOWN){
                down=false;
            }
        }
    }
    public static void main(String[] args) {
        MyGame game=new MyGame();
        game.launchFrame();
    }
    private Image offScreanImage=null;

    public void update(Graphics g){
        if(offScreanImage==null)
            offScreanImage=this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGH);//这是游戏窗口的宽度和高度
        Graphics goff=offScreanImage.getGraphics();
        paint(goff);
        g.drawImage(offScreanImage,0,0,null);
    }
}

面向对象思想重构飞机类的键盘移动

package feiji;

import java.awt.*;
import java.awt.event.KeyEvent;

public class plane  extends GameObject { //要有无参构造器

    boolean left,right,up,down;//控制飞机的方向

    @Override
    public  void drawMyself(Graphics g){
        super.drawMyself(g);

        //飞机飞行的算法,可以自行设定
        //x+=speed;

        if(left){
            x-=speed;
        }
        if(right){
            x+=speed;
        }
        if(up){
            y-=speed;
        }
        if(down){
            y+=speed;
        }
    }

    public void addDiretion(KeyEvent e){
        if(e.getKeyCode()== KeyEvent.VK_LEFT){
            left=true;
        }
        if(e.getKeyCode()==KeyEvent.VK_RIGHT){
            right=true;
        }
        if(e.getKeyCode()==KeyEvent.VK_UP){
            up=true;
        }
        if(e.getKeyCode()==KeyEvent.VK_DOWN){
            down=true;
        }
    }

    public void  minusDirection(KeyEvent e){
        if(e.getKeyCode()==KeyEvent.VK_LEFT){
            left=false;
        }
        if(e.getKeyCode()==KeyEvent.VK_RIGHT){
            right=false;
        }
        if(e.getKeyCode()==KeyEvent.VK_UP){
            up=false;
        }
        if(e.getKeyCode()==KeyEvent.VK_DOWN){
            down=false;
        }
    }

    public  plane(Image img,double x,double y,int speed,int width,int height) {
        super(img,x,y,speed,width,height);
    }
   /**
       public  plane(Image img,double x,double y,int speed) {
        super(img,x,y,speed);
    }
    */
}

炮弹类的设计

package feiji;

import java.awt.*;

/**
 * 炮弹类
 */
public class shell extends GameObject{

    double dagree; //炮弹沿着指定的角度飞行

    public shell(){
        x=200;
        y=200;

        dagree=Math.random()*Math.PI*2; //生成随机角度

        width=10;
        height=10;

        speed=7;
    }

    @Override
    public void drawMyself(Graphics g){
        // super.drawMyself(g);
        Color c=g.getColor();
        g.setColor(Color.red);
        g.fillOval((int)x,(int)y,width,height);

        g.setColor(c);
        //根据自己算法指定移动的路径
        x+=speed*Math.cos(dagree);
        y+=speed*Math.sin(dagree);

        //碰到边界改变方向
        if(y>Constant.GAME_HEIGH-this.height||y<40){
            dagree=-dagree;
        }
        if(x<0||x>Constant.GAME_WIDTH-this.width){
            dagree=Math.PI-dagree;
        }
    }
}

容器或数组产生多发炮弹

      shell[] s1=new shell[50];

        //画炮弹
        for(int i=0;i<50;i++){
            s1[i].drawMyself(g);
     
        //初始化50个炮弹对象
        for(int i=0;i<50;i++){
            s1[i]=new shell();
      }

飞机和炮弹碰撞实现

//画炮弹
        for(int i=0;i<s1.length;i++){
            s1[i].drawMyself(g);

            boolean peng = s1[i].getRec().intersects(p1.getRec());
            //碰撞检测,进行矩形检测
            if(peng){
               // System.out.println("飞机击中了!!");
                p1.live=false;
            }

        }
/**
在飞机类中定义live这个属性
*/
     boolean live=true;//看飞机是否活着
    @Override
    public  void drawMyself(Graphics g){

        if(live){   //如果飞机没有活着,碰撞之后就会消失
            super.drawMyself(g);

            //飞机飞行的算法,可以自行设定
            //x+=speed;

            if(left){
                x-=speed;
            }
            if(right){
                x+=speed;
            }
            if(up){
                y-=speed;
            }
            if(down){
                y+=speed;
            }
        }

    }

爆炸类图片的实现

package feiji;

import java.awt.*;

/**
 * 爆炸类
 */
public class Explode {
    //位置
    double x,y;
    //一组图片
    static  Image[] imgs=new  Image[3];
    int count;
    static {

        for (int i=0;i<3;i++){
            imgs[i]=Gameu.getImage("images/explode/"+(i+1)+".png");
            //imgs[i].getWidth(null); //解决懒加载问题,目前加和不加没有问题
        }
    }

    public void drawMyself(Graphics g){

        if(count<3){   //为了更好的判断画了几次
            g.drawImage(imgs[count],(int)x,(int)y,null);
            count++;
        }
    }

    public  Explode(){

    }
    public  Explode(double x,double y){
        this.x=x;
        this.y=y;
    }
}

程序计时功能

package feiji;

import java.awt.*;
import java.lang.*;
import java.awt.event.*;
import java.util.Date;

/**
 * 游戏主窗口
 * @author 86159
 *
 */
public class MyGame extends Frame {

      Image planeImg=Gameu.getImage("images/feiji.png");
      Image bg=Gameu.getImage("images/bj.png");

      plane p1=new plane(planeImg,100,100,7,70,70);

      shell[] s1=new shell[3];

      Explode explode;//爆炸

       Date start=new Date();  //游戏开始时间,设置为当前时刻
       Date end;    //游戏结束时间,飞机死的那一刻
       long  period=0;//玩了多少秒


     @Override
     public void paint(Graphics g) {  //g相当于是一个画笔

      //画背景
       g.drawImage(bg,0,0,500,500,null);

       //画时间
         g.setColor(Color.black);
         if(p1.live){
             period=(System.currentTimeMillis()-start.getTime())/1000;
             g.drawString("坚持:"+period,10,70);

         }else{
             if(end==null){
                 end=new Date();
                 period=(end.getTime()-start.getTime())/1000;
             }
             g.setFont(new Font("微软雅黑",Font.BOLD,30));
             g.drawString("最终时间:"+period,150,250);
         }
         
             p1.drawMyself(g);

             //画炮弹
             for (int i = 0; i < s1.length; i++) {
                 s1[i].drawMyself(g);

                 boolean peng = s1[i].getRec().intersects(p1.getRec());
                 //碰撞检测,进行矩形检测
                 if (peng) {
                     // System.out.println("飞机击中了!!");
                     p1.live = false;

                     //处理爆炸效果
                     if (explode == null) {
                         explode = new Explode(p1.x, p1.y);
                     }

                     explode.drawMyself(g);
                 }

             }

         }
    //初始化窗口
    public void launchFrame()  {
        this.setTitle("飞机大战");
        setVisible(true);//窗口是否可见
        setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGH);//窗口大小
        setLocation(100,100);//窗口打开位置

        //增加窗口的关闭动作
        this.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        new PaintThread().start();  //启动重画窗口的线程
        this.addKeyListener(new KeyMonitor()); //启动键盘监听

        //初始化50个炮弹对象
        for(int i=0;i<s1.length;i++){
            s1[i]=new shell();
        }

    }

    /**
     * 定义一个重画窗口的线程类
     * 定义成内部类是为了方便直接使用窗口类的相关方法
     */
    class PaintThread extends Thread{
        @Override
        public void run(){
            while (true){
                repaint();//内部类可以直接使用外部类的成员!

             try{
                 Thread.sleep(50);    //1s画20次(20*50=1000)
             }catch (InterruptedException e){
                 e.printStackTrace();
             }
            }
        }
    }

    //内部类实现键盘的监听处理
    class KeyMonitor extends KeyAdapter{

        @Override
        public  void keyPressed(KeyEvent e){
            System.out.println("按下:"+e.getKeyCode());
            p1.addDiretion(e);
        }

        @Override
        public void keyReleased(KeyEvent e){
            System.out.println("抬起:"+e.getKeyCode());
            p1.minusDirection(e);
        }
    }
    public static void main(String[] args) {
        MyGame game=new MyGame();
        game.launchFrame();
    }
    private Image offScreanImage=null;

    public void update(Graphics g){
        if(offScreanImage==null)
            offScreanImage=this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGH);//这是游戏窗口的宽度和高度
        Graphics goff=offScreanImage.getGraphics();
        paint(goff);
        g.drawImage(offScreanImage,0,0,null);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值