欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java面向对象---原谅帽游戏

程序员文章站 2022-04-15 18:55:53
作品展示类(游戏端)继承Frame;首先要创建一个方法去让游戏开始和结束使用text执行这个游戏的方法(需要有游戏标题和游戏的界面)创建一个背景图片变量(创建静态值static,只出现一遍)定义一个值让他等于背景图片的路径把这个值赋值给我们创建的这个背景图片变量,让他拥有路径创建类CommonUtils(路径方法)给各个类对象里创建游戏窗体属性,创建无参合有参的方法,和get,set方法和画笔方法,游戏端(类)里创建画笔方法各个实现在需要做移动的时候例小丑移动在小丑移动里创建移动方法1...

作品展示

Java面向对象---原谅帽游戏
第一天:类(游戏端)继承Frame;
首先要创建一个方法去让游戏开始和结束
使用text执行这个游戏的方法(需要有游戏标题和游戏的界面)
创建一个背景图片变量(创建静态值static,只出现一遍)
定义一个值让他等于背景图片的路径
把这个值赋值给我们创建的这个背景图片变量,让他拥有路径
创建类CommonUtils(路径方法)
第二天:给各个类对象里创建游戏窗体属性,创建无参合有参的方法,和get,set方法和画笔方法,游戏端(类)里创建画笔方法各个实现
在需要做移动的时候例小丑移动在小丑移动里创建移动方法
第三天:在此基础要知道游戏是无法结束的,添加一个游戏结束的方法
在游戏端start方法中添加一个监听键盘系统(就是让你输出键盘方向可以反映到你控制的人物身上),在小丑这个类里创建一个移动的属性以及赋予get和set方法,将小丑移动方向方法点调进这个键盘系统里,创建一个thread方法,定义一个重新绘制画面的线程,再招一个工人去车间干活,创建游戏窗体并听过构造方法调用,创建润方法设置50毫秒执行一次绘制图像,在游戏系段开启重新绘制线程,创建车间工人,工人听取调度。
第四天:基于第三天成果,小丑人物可以动了,但是属于闪屏模式,首先创建一个解决闪屏的方法。其次我们将昨天的监听键盘系统进行优化,给小丑类里创建四个方向没有按下,将昨天的键位选项粘贴到小丑buffoon键盘按下确定人物移动方向和键盘松开方法里。方法里要有boolean判断。此时小丑可以八个方向动了,在小丑里创建子弹数组(扔帽子)和getset方法,创建让子弹(帽子)扔出去方法,在游戏端里用paint方法画出子弹;
第五天;基于前四天成功,小丑可以发出子弹了,今天我们需要让子弹(帽子)移动,并且需要给小丑设置出现的范围。并对之前的代码进行优化。

1.思路分析

1.发现类(对象)

人物-小丑(友方,敌方):buffoon
子弹-帽子:missile
墙体:wall
爆炸物:explode

2.发现属性

小丑:宽,高,位置(x,y),移动速度
帽子:宽,高,位置(x,y),移动速度
墙体:宽,高,位置(x,y)
爆炸物:宽,高,位置(x,y)

3.发现方法

小丑:
移动
攻击(发子弹)
人物撞边界
子弹:
移动
子弹撞墙子弹撞边界
墙体:
爆炸物:消失

2.难点在哪里

1.如何将图片加载到窗体里

背景图片加载 已完成
人物–小丑加载(已完成)
发射物–帽子加载(已完成)
墙体加载(已完成)
爆炸物加载(已完成)

2. 窗体如何创建

3.子弹如何放射??按键盘 键盘如何触发事件???

3.作品展示

1.创建游戏端方法

 public void start(){
        System.out.println("即将开始游戏,请玩家做好准备");
         this.setTitle("原谅帽"); //设置标题
        this.setBounds(0,0,1100,600);//设置窗口
        this.setVisible(true);//让窗口显示出
        System.out.println("GameOver!!!");
    }

Java面向对象---原谅帽游戏

2.text实现游戏端方法

public static void main(String[] args) {        //text测试运行游戏端开始和结束
        GameClient gameClient=new GameClient();
        gameClient.start();
    }

Java面向对象---原谅帽游戏

3.创建背景图片并且对背景图片增加路径

public static final String BG_PATH="images/bg.png";//定义一个量设置图片路径
private static Image image;//定义图片背景
    static {
          image= CommonUtils.getImage(BG_PATH);
    }    //静态块只需要加载一次

Java面向对象---原谅帽游戏

4.创建类CommonUtils

public class CommonUtils {
    /**
     * 读取图片资源, 转变为Java对象 Image
     * @param imgPath  图片路径
     * @return Image对象
     */
    public static Image getImage(String imgPath) {
        ImageIcon imageIcon = new ImageIcon(imgPath);
        return imageIcon.getImage();
    }

}

Java面向对象---原谅帽游戏

5.各个(类)里创建游戏窗体属性

//游戏窗体属性 因为小丑要在窗体中画画
    protected GameClient  gameClient;

Java面向对象---原谅帽游戏

6.各个(类)里创建有参无参方法

//无参构造
    public  Buffoon(){}
    //带参构造
    public  Buffoon(int x,int y,GameClient  gameClinet){
        this.x=x;
        this.y=y;
        this.width=50;
        this.height=50;
        this.speed=5;
        this.gameClient=gameClinet;

    }

Java面向对象---原谅帽游戏

7.各个(类)里创建paint画笔方法

 /**
     * 小丑里有自己的画画方法
     */
    public void paint(Graphics g){
        g.drawImage(buffoon_Image,this.x,this.y,this.width,this.height,this.gameClient);
    }

Java面向对象---原谅帽游戏

8.各个(类)里创建get set方法

public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

}

Java面向对象---原谅帽游戏

9.游戏端创建各个类的对象

 private Buffoon buffoon=new Buffoon(570,300,this);
    private Missile missile=new Missile(550,300,this);
    private Wall wall=new Wall(300,80,this);
    private Wall wall1=new Wall(800,50,this);
    private Wall wall2=new Wall(300,350,this);
    private Wall wall3=new Wall(800,350,this);
    private Wall1 wall4=new Wall1(500,260,this);
    private Explode explode=new Explode(200,300,this);

Java面向对象---原谅帽游戏

10.游戏端创建paint方法实现

public void paint(Graphics g) {
        //画背景图
        g.drawImage(image,0,0,1100,600,this);
        //画人物-小丑图
        buffoon.paint(g);
        //画发射物-帽子
       missile.paint(g);
        //画墙-横墙
       wall.paint(g);
       wall1.paint(g);
       wall2.paint(g);
       wall3.paint(g);
        //花墙-画竖墙
       wall4.paint(g);
        //画-爆炸物
      explode.paint(g);
    }

Java面向对象---原谅帽游戏

11.Buffoon类中创建个移动方法

 /**
     * 人物移动
     */
    public void move(String dir){
        //上北
        if("U".equals(dir)){
            this.y=this.y-this.speed;
        }
        //下南
        if("R".equals(dir)){
            this.y=this.y+this.speed;
        }
        //右东
        if("D".equals(dir)){
            this.x=this.x+this.speed;
        }
        //左西
        if("L".equals(dir)){
            this.x=this.x-this.speed;
        }
        //东北
        if("UR".equals(dir)){
            this.x=this.x+this.speed;
            this.y=this.y-this.speed;
        }
        //东南
        if("DR".equals(dir)){
            this.x=this.x+this.speed;
            this.y=this.y+this.speed;
        }
        //西南
        if("LD".equals(dir)){
            this.x=this.x-this.speed;
            this.y=this.y+this.speed;
        }
        //西北
        if("LU".equals(dir)){
            this.x=this.x-this.speed;
            this.y=this.y-this.speed;
        }

Java面向对象---原谅帽游戏

12.创建游戏结束方法

    //关闭游戏 退出游戏
        this.addWindowListener(new WindowAdapter() {


            @Override
            public void windowClosing(WindowEvent e) {
                //退出游戏
                System.out.println("Game Over!!!");
                System.exit(0);
            }

        });

Java面向对象---原谅帽游戏

13.GameClient中start方法中创建监听键盘系统

 //监听键盘系统
        this.addKeyListener(new KeyAdapter() {
            //键盘按下触发
            @Override
            public void keyPressed(KeyEvent e) {
              //获取被按下键对应的数值 如a:67  b:68
                int keyCode=e.getKeyCode();
                switch(keyCode){
                    case KeyEvent.VK_UP:
                        System.out.println("向上走!!!");

                        //向上箭头,给人物的方向设置为向上
                        buffoon.setDir("UP");
                        break;
                    case KeyEvent.VK_DOWN:
                        System.out.println("向下走!!!");
                        buffoon.setDir("DOWN");//  //向下箭头,给人物的方向设置为向下
                        break;
                    case KeyEvent.VK_LEFT:
                        System.out.println("向左走!!!");
                        buffoon.setDir("LEFT");//向左箭头,给人物的方向设置为向左
                        break;
                    case KeyEvent.VK_RIGHT:
                        System.out.println("向右走!!!");
                        buffoon.setDir("RIGHT");//向右箭头,给人物的方向设置为向右
                        break;
                }
                buffoon.move(buffoon.getDir());//人物移动
            }

         //键盘释放松开
            @Override
            public void keyReleased(KeyEvent e) {
                buffoon.setDir("STOP");
            }

        });

Java面向对象---原谅帽游戏

14.小丑(类)里创建移动方向的属性

  //人物方向
    private  String dir;

Java面向对象---原谅帽游戏

15.小丑(类)里把移动方向放在参数方法里赋值

 this.dir="STOP";//表示人物刚创建的时候是静止的

Java面向对象---原谅帽游戏

16.移动方向创建get和set方法

 public String getDir() {
        return dir;
    }

    public void setDir(String dir) {
        this.dir = dir;
    }

Java面向对象---原谅帽游戏

17在小丑(类)移动方向方法点调GameClient键盘系统里

    buffoon.move(buffoon.getDir());//人物移动

Java面向对象---原谅帽游戏

18创建一个thread类,接口Runnable方法,创建游戏端属性以及构造参数

public class RepaintThread implements  Runnable {
    //游戏窗体
    private GameClient gameClient;

    //通过构造
    public RepaintThread(GameClient gameClient) {
        this.gameClient = gameClient;
    }

Java面向对象---原谅帽游戏

19.thread类中创建run方法,重新绘制图像,控制秒数

 while (true){
           try {
               Thread.sleep(50);
               //重新绘制图像
               gameClient.repaint();
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }

Java面向对象---原谅帽游戏

20.GameClient(类)start方法里里开启重新绘制线程,创建车间工人

 //开启重新绘制线程
        RepaintThread repaintThread=new RepaintThread(this);
        //创建车间工人
        Thread thread=new Thread(repaintThread);
        //工人听取调度
        thread.start();

Java面向对象---原谅帽游戏

21防抖动,防闪屏

 /**
     * 防抖动,防闪屏
     */
    @Override
    public void update(Graphics g) {
        // 创建图形缓冲区
        Image imageBg = createImage(1100,700);
        // 获取图形缓冲区的上下文
        Graphics newGraphics = imageBg.getGraphics();
        // 用paint方法对图形缓冲区绘图
        paint(newGraphics);
        // 释放图形上下文资源
        newGraphics.dispose();
        // 将图形缓冲区绘制到屏幕上
        g.drawImage(imageBg, 0, 0 , 1100,700, this);

Java面向对象---原谅帽游戏

22.小丑类里创建属性四个方向都没有按下

  //默认四个方向,都没有被按下
    boolean up=false;
    boolean right=false;
    boolean left=false;
    boolean down=false;

Java面向对象---原谅帽游戏

23.小丑类里创建监听键盘系统(按下确定人物方向)

   /**
     * 键盘按下确定人物移动方向
     */
    public  void okDirPressed(int keyCode){
        //TODO 确定方向

        switch(keyCode){
            case KeyEvent.VK_UP:
                System.out.println("向上走!!!");

                //向上箭头,给人物的方向设置为向上
                this.setDir("UP");
                up=true;
                break;
            case KeyEvent.VK_DOWN:
                System.out.println("向下走!!!");
                this.setDir("DOWN");//  //向下箭头,给人物的方向设置为向下
                down=true;
                break;
            case KeyEvent.VK_LEFT:
                System.out.println("向左走!!!");
                this.setDir("LEFT");//向左箭头,给人物的方向设置为向左
                left=true;
                break;
            case KeyEvent.VK_RIGHT:
                System.out.println("向右走!!!");
                right=true;
                this.setDir("RIGHT");//向右箭头,给人物的方向设置为向右
                break;

Java面向对象---原谅帽游戏

24.小丑类里创建监听键盘系统(按下确定人物方向)

 /**
     * 按键松开时,确定人物方向
     * @param keyCode
     */
    public  void okDirReleased(int keyCode){
        switch(keyCode){
            case KeyEvent.VK_UP:
                up=false;
                break;
            case KeyEvent.VK_DOWN:
                down=false;
                break;
            case KeyEvent.VK_LEFT:
                left=false;
                break;
            case KeyEvent.VK_RIGHT:
                right=false;
                break;
        }
    }

Java面向对象---原谅帽游戏

25.游戏段里引用小丑类里的监听键盘系统


        //监听键盘系统
        this.addKeyListener(new KeyAdapter() {
            //键盘按下触发
            @Override
            public void keyPressed(KeyEvent e) {
              //获取被按下键对应的数值 如a:67  b:68
                int keyCode=e.getKeyCode();
                //调动人物的 确定方向  方法
             buffoon.okDirPressed(keyCode);
                buffoon.move(buffoon.getDir());//人物移动
            }

         //键盘释放松开
            @Override
            public void keyReleased(KeyEvent e) {
                //获取键盘松开的值
                int keyCode=e.getKeyCode();
               buffoon.okDirReleased(keyCode);
            }

Java面向对象---原谅帽游戏

26.小丑类里创建监听键盘系统(按下确定人物方向)判断用户到底按了哪个键位

   //判断用户到底按了哪个键位
        if(up&&right){
            this.setDir("UR");
        }
        if(up&&left){
            this.setDir("UL");
        }
        if(down&&right){
            this.setDir("DR");
        }
        if(down&&left){
            this.setDir("DL");
        }
        this.move((this.getDir()));

Java面向对象---原谅帽游戏

27.创建子弹(绿帽子)数组

   //子弹数组
    private List<Missile> missileList=new ArrayList<Missile>();

Java面向对象---原谅帽游戏

28.创建子弹的(绿帽子)get和set方法

    public List<Missile> getMissileList() {
        return missileList;
    }

    public void setMissileList(List<Missile> missileList) {
        this.missileList = missileList;
    }

Java面向对象---原谅帽游戏

29.创建子弹的(绿帽子)扔出去方法


    /**
     * 开火 发射子弹
     */
    public Missile fire(){

        return new Missile(this.x,this.y,this.gameClient);
    }

Java面向对象---原谅帽游戏

30 在键盘控制系统里将扔子弹(帽子)方法放进去

    case KeyEvent.VK_CONTROL:
                //打桩
                System.out.println("发子弹");
                Missile missile=this.fire();
                //将子弹扔到容器中
                this.missileList.add(missile);
                //看一看容器中有多少子弹了
                System.out.println("this.missileList()="+this.missileList.size());
                break;
        }

Java面向对象---原谅帽游戏

31在游戏端方法里paint方法里画下子弹

  //画子弹
        int size=buffoon.getMissileList().size();
        for(int i=0;i<size;i++){
            //将容器中子弹拿出来
            Missile missile=buffoon.getMissileList().get(i);
            //画到屏幕上
            missile.paint(g);
       }

Java面向对象---原谅帽游戏

32.在子弹类里设置子弹发射方向方法

 /**
     * 子弹移动
     * @param
     */

    public void move(){
        switch (this.dir){
            case"UP":
                this.y=this.y-this.speed;
                break;
            case"DOWN":
                this.y=this.y+this.speed;
                break;
            case"LEFT":
                this.x=this.x-this.speed;
                break;
            case"RIGHT":
                this.x=this.x+this.speed;
                break;

            case"UR":
                this.x=this.x+this.speed;
                this.y=this.y-this.speed;
                break;
            case"DL":
                this.x=this.x-this.speed;
                this.y=this.y+this.speed;
                break;
            case"UL":
                this.x=this.x-this.speed;
                this.y=this.y-this.speed;
                break;
            case"DR":
                this.x=this.x+this.speed;
                this.y=this.y+this.speed;
                break;


        }
    }

Java面向对象---原谅帽游戏

33.给小丑类里设置边界范围

/**
 * 边界判断
 */
    public void checkArea(){
        if(x<190){
         x=190;
      }
        if (y<25){
         y=25;
       }
        if (x>851){
         x=851;
      }
        if (y>420){
        y=420;
   }
    }

Java面向对象---原谅帽游戏

34.设置的边界让其在人物移动时候执行(在人物移动下点方法)

 checkArea();

Java面向对象---原谅帽游戏

35.优化属性

  /**
     * 窗体宽度
     */
    public  static final int CLIENT_WIDTH=1100;
    /**
     * 窗体高度
     */
    public  static final int CLIENT_HEIGHT=700;
    /**
     * 人物尺寸
     */
    public  static final int Buffoon_SIZE=50;
    /**
     * 人物移动速度
     */
    public  static final int Buffoon_SPEED=5;
    /**
     * 人物的x轴
     */
    public  static final int Buffoon_X=500;
    /**
     * 人物的y轴
     */
    public  static final int Buffoon_Y=300;
    /**
     * 子弹尺寸
     */
    public  static final int Missile_Size=25;
    /**
     * 子弹移动速度
     */
    public  static final int Missile_Speed=5;
    /**
     * 0墙的X轴
     */
    public  static final int Wall_X=300;
    /**
     * 墙的y轴
     */
    public  static final int Wall_Y=80;
    /**
     * 1墙的X轴
     */
    public  static final int Wall1_X=800;
    /**
     * 墙的y轴
     */
    public  static final int Wall1_Y=50;
    /**
     * 2墙的X轴
     */
    public  static final int Wall2_X=300;
    /**
     * 墙的y轴
     */
    public  static final int Wall2_Y=350;
    /**
     * 3墙的X轴
     */
    public  static final int Wall3_X=800;
    /**
     * 墙的y轴
     */
    public  static final int Wall3_Y=350;
    /**
     * 4墙的X轴
     */
    public  static final int Wall4_X=500;
    /**
     * 墙的y轴
     */
    public  static final int Wall4_Y=260;
    /**
     * 墙宽度
     */
    public  static final int Wall_WIDTH=80;
    /**
     * 墙高度
     */
    public  static final int Wall_HEIGHT=20;
    /**
     * 墙1宽度
     */
    public  static final int Wall1_WIDTH=80;
    /**
     * 墙1高度
     */
    public  static final int Wall1_HEIGHT=80;
    /**
     * 爆炸物宽度
     */
    public  static final int Explode_Width=80;
    /**
     * 爆炸物高度
     */
    public  static final int Explode_HEIGHT=30;
    /**
     * 爆炸物的x轴
     */
    public  static final int Explode_X=200;
    /**
     * 爆炸物的y轴
     */
    public  static final int Explode_Y=300;


Java面向对象---原谅帽游戏

本文地址:https://blog.csdn.net/cb9165/article/details/109626241

相关标签: 游戏