使用IDEA制做Java面向对象小游戏《原谅帽大做战》

成果展现

在这里插入图片描述

制做思路

第1步:发现类(对象)

人物-小丑: Buffoon
子弹-帽子:Missile
墙体:Wall
爆炸物:Explode

第2步:发现属性

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

第3步:发现方法

小丑:移动、攻击、人物撞边界
子弹:移动、子弹撞墙、子弹撞边界
爆炸物:消失

重难点分析

窗体如何建立

public class GameClient extends Frame

经过继承Frame类实现Java窗体html

public class Frame extends Window implements MenuContainer

Frame类继承了Window类和MenuContainer接口java

如何将图片加载到窗体里

步骤1:建立经常使用工具类CommonUtils,新建getImage方法实现将图片资源转换为Java对象api

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

步骤2:调用getImage方法添加对象图片并发

public class GameClient extends Frame { 
    Image bg_image = CommonUtils.getImage("images/bg.png");
    Image explode = CommonUtils.getImage("images/explode.png");
    Image missile = CommonUtils.getImage("images/missile.png");
    Image wall_h = CommonUtils.getImage("images/wall-h.png");
    Image wall_v = CommonUtils.getImage("images/wall-v.png");
    Image buffoon = CommonUtils.getImage("images/body/s-left.png");

步骤3:重写Framed的paint方法,实现窗体加载图片ide

@Override
    public void paint(Graphics g){ 
        //画背景图
        g.drawImage(bg_image,0,0,1100,700,this);
        //画小丑
        g.drawImage(buffoon,300,200,80,80,this);
        //画爆炸物
        g.drawImage(explode,800,400,90,90,this);
        //画原谅帽
        g.drawImage(missile,300,300,60,60,this);
        //画横着的墙体
        g.drawImage(wall_h,400,300,100,20,this);
        //画竖着的墙体
        g.drawImage(wall_v,400,300,20,100,this);

Graphics类的drawImage方法须要提供Image类参数、窗体的x参数、窗体的y参数、Image类的宽度width、Image类的长度length以及observer(当转换了更多图像时要通知的对象)工具

对象移动的实现

指向标的地图,一般采用“上北下南,左西右东”的规则肯定方向。移动的八个方向一般指的是北、东北、东、东南、南、西南、西、西北。所以在定义移动方向时用上、左、下、右、上右、下右、上左、下左来表示动画

林家彬设计的

小丑:移动  move<Orientation类传递方向参数>
'left向左'   :x = x - this.speed;
'right向右'  :x = x + this.speed;
'down向下'   :y = y + this.speed;
'up向上'     :y = y - this.speed;
'ur东北方向'  : x = x + this.speed;
                y = y - this.speed;
'ul西北方向'  : x = x - this.speed;
                y = y - this.speed;
'dr东南方向'  : x = x + this.speed;
                y = y + this.speed;
'dl西南方向'  : x = x - this.speed;
                y = y + this.speed;

窗体关闭的实现

public void start() { 
        //窗体添加侦听方法
        this.addWindowListener(new WindowAdapter() { 
            @Override
            public void windowClosing(WindowEvent e) { 
                super.windowClosing(e);
                //退出游戏
                System.exit(0);
            }
        });

WindowAdapter类
1.接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便建立侦听器对象。
2.扩展此类可建立 WindowEvent 侦听器并为所需事件重写该方法。(若是要实现 WindowListener 接口,则必须定义该接口内的全部方法。此抽象类将全部方法都定义为 null,因此只需针对关心的事件定义方法。
3.使用扩展的类能够建立侦听器对象,而后使用窗口的 addWindowListener 方法向该窗口注册侦听器。当经过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将 WindowEvent 传递给该方法。
windowAdapter监听器



this

按键事件触发的实现

this.addKeyListener(new KeyAdapter() { 
             //键盘按下的时候出发
            @Override
            public void keyPressed(KeyEvent e) { 
                super.keyPressed(e);
            }
            //键盘松开
            @Override
            public void keyReleased(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_RIGHT:
                        System.out.println("向右走");
                        buffoon.setDir("RIGHT");
                        break;
                    case KeyEvent.VK_LEFT:
                        System.out.println("向左走!!");
                        buffoon.setDir("LEFT");
                        break;
                }
                buffoon.move(buffoon.getDir());
            }
        });

按键触发的要点

要点一:‘new KeyAdapter()’ 新建一个按键事件的监听器,并经过addKeyListener()向主窗体注册该监听器;
要点二:重写KeyAdapter的方法,分别是KeyTyped(键入)、KeyPresdded(按下)、KeyReleased(释放)。这里咱们只监听KeyPressed事件并重写该方法,实现对人物方向状态的改变;
要点三:KeyEvent e.getKeyCode返回的是按下按键对应的键值,参考KeyEvent的键值属性。Java 8在线API

url

建立对象Buffoon.move()方法

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

每次监听到按键事件调用move方法实现buffoon对象的移动

每次监听到按键事件调用move方法

对象移动的原理

对象移动的画面也叫动画,是在屏幕上显示一系列连续动画画面的一帧一帧的图形,而后在间隔很短的时间显示下一帧图形,如此反复,利用人眼的‘视觉暂留’现象主观感受好像画面的物体在运动。
FPS(Frames Per Second),是每秒钟的帧数。一帧就是一幅静态画像,电影的播放速度是24FPS。帧数越多,所显示的动做就会越流畅。一般,要避免动做不流畅的最低是30FPS。FPS百度百科
spa

动画移动的搬运工-线程(thread)

什么是线程
线程(thread)是操做系统可以进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运做单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中能够并发多个线程,每条线程并行执行不一样的任务。

/** * 定义一个从新绘制画面的线程,至关于招一个工人专门去从事这项工做 */
public class RePaintThread implements Runnable{ 
    @Override
    //线程操做的全都在run方法中
    public void run() { 
        while (true){ 
            //每50毫秒 执行一次
            try { 
                Thread.sleep(20);
                //从新绘制图像
                gameClient.repaint();
            } catch (InterruptedException e) { 
                e.printStackTrace();
            }
        }
    }

要点一:Runnable接口
public class RePaintThread implements Runnable
使用实现接口 Runnable 的对象建立一个线程时,启动该线程将致使在独立执行的线程中调用对象的 run 方法。
要点二:重写Run方法
方法 run 的常规协定是:它可能执行任何所需的动做。
从新绘制图像
gameClient.repaint();
要点三:Thread.sleep—线程反复执行的时间间隔
一、使用’While(true)'构造死循环
二、在死循环中执行repaint()重绘图形方法
三、线程中断异常(InterruptedException)是当前线程被中断的表现之一。遇到这个异常时,若是你不知道如何处理,你应当向上抛出。
catch从句

相关文章
相关标签/搜索