栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java入门笔记12

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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);
    }
   
}
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.*;

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);
    }
   
}
炮弹类的设计
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 
     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;


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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/756142.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号