使用IDEA制作Java面向对象小游戏《原谅帽大作战》 |
您所在的位置:网站首页 › 如何用vb制作小游戏 › 使用IDEA制作Java面向对象小游戏《原谅帽大作战》 |
成果展示
通过继承Frame类实现Java窗体 public class Frame extends Window implements MenuContainerFrame类继承了Window类和MenuContainer接口 如何将图片加载到窗体里步骤1:创建常用工具类CommonUtils,新建getImage方法实现将图片资源转换为Java对象 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方法,实现窗体加载图片 @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(当转换了更多图像时要通知的对象) 对象移动的实现指向标的地图,通常采用“上北下南,左西右东”的规则确定方向。移动的八个方向通常指的是北、东北、东、东南、南、西南、西、西北。因此在定义移动方向时用上、左、下、右、上右、下右、上左、下左来表示 WindowAdapter类: 1.接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。 2.扩展此类可创建 WindowEvent 侦听器并为所需事件重写该方法。(如果要实现 WindowListener 接口,则必须定义该接口内的所有方法。此抽象类将所有方法都定义为 null,所以只需针对关心的事件定义方法。 3.使用扩展的类可以创建侦听器对象,然后使用窗口的 addWindowListener 方法向该窗口注册侦听器。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将 WindowEvent 传递给该方法。 windowAdapter监听器 按键事件触发的实现 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 创建对象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对象的移动对象移动的画面也叫动画,是在屏幕上显示一系列连续动画画面的一帧一帧的图形,然后在间隔很短的时间显示下一帧图形,如此反复,利用人眼的‘视觉暂留’现象主观感觉好像画面的物体在运动。 FPS(Frames Per Second),是每秒钟的帧数。一帧就是一幅静态画像,电影的播放速度是24FPS。帧数越多,所显示的动作就会越流畅。通常,要避免动作不流畅的最低是30FPS。FPS百度百科 动画移动的搬运工-线程(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—线程反复执行的时间间隔 1、使用’While(true)'构造死循环 2、在死循环中执行repaint()重绘图形方法 3、线程中断异常(InterruptedException)是当前线程被中断的表现之一。遇到这个异常时,如果你不知道如何处理,你应当向上抛出。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |