第一讲面向对象游戏设计1

上传人:沈*** 文档编号:193794397 上传时间:2023-03-12 格式:PPT 页数:29 大小:429KB
收藏 版权申诉 举报 下载
第一讲面向对象游戏设计1_第1页
第1页 / 共29页
第一讲面向对象游戏设计1_第2页
第2页 / 共29页
第一讲面向对象游戏设计1_第3页
第3页 / 共29页
资源描述:

《第一讲面向对象游戏设计1》由会员分享,可在线阅读,更多相关《第一讲面向对象游戏设计1(29页珍藏版)》请在装配图网上搜索。

1、1简单坦克游戏的面向对象实现简单坦克游戏的面向对象实现2简单坦克游戏的面向对象实现简单坦克游戏的面向对象实现 本章的游戏例子涵盖了本章的游戏例子涵盖了Java语言的众多特点,语言的众多特点,比如继承、封装、抽象方法、静态方法和静态变量等比如继承、封装、抽象方法、静态方法和静态变量等等,并结合等,并结合Java画图机制、线程机制和画图机制、线程机制和Java网络通网络通信三部分的知识点。信三部分的知识点。本讲概要本讲概要o坦克游戏复习坦克游戏复习o坦克游戏面向对象设计坦克游戏面向对象设计n 面向对象分析面向对象分析n 坦克的面向对象设计坦克的面向对象设计n 主窗体的设计主窗体的设计坦克游戏复习坦

2、克游戏复习o 坦克:n 圆心坐标:x、yn 半径大小:20n 坦克朝向:diro 子弹:n 圆心坐标、半径、移动方向o 坦克的移动:使用键盘按键机制改变圆心坐标,改变之后刷新画面o 子弹的移动,使用线程机制控制面向对象分析面向对象分析o 分析坦克大战小游戏,如图1所示,一共有三种实体:n 坦克:Tankn 子弹:Bulletn 障碍物:Blocko 除了这三种实体以外,我们还需要实体所在的场景类:n 场景:GameCanvas三种对象三种对象o 为了简单起见,暂不考虑障碍物。在上一讲中开发坦克大战的方法是传统的结构化的思想,本讲我们改用面向对象的方法来实现,可以针对坦克和子弹写各写一个类坦克的

3、面向对象设计坦克的面向对象设计o 对于坦克,把类名设定为Tank,类是由属性和方法构成的,Tank类中的属性和方法如下表所示(代码见例1)Tank类的属性类的属性坦克圆心坐标坦克圆心坐标(x,y)坦克半径坦克半径radius坦克朝向坦克朝向dirTank类的方法类的方法坦克移动坦克移动move()构造方法构造方法Tank()坦克射击坦克射击shoot()例例1:Tank类类public class Tank int x=100,y=100,dir=0,radius=20;public Tank(int x,int y)this.x=x;this.y=y;public void move(int

4、 moveDir)switch(moveDir)case 0:x=x-5;break;/0表示左 case 1:y=y-5;break;/1表示上 case 2:x=x+5;break;/2表示右 case 3:y=y+5;break;/3表示下 面向对象坦克绘制面向对象坦克绘制o 虽然实现了Tank类,但是这个实现有意义吗?接下来要考虑的是如何通过画图机制把坦克表现出来。o 若要画出坦克,必须要使用Frame类的paint()方法,每一次变动的时候调用repaint()方法重绘。o paint()方法中画图的关键部分是Graphics对象g,该对象包含了与画图相关的所有方法,能不能把该对象“

5、拿出来”,传给需要使用它的对象,在绘制图形的时候调用呢?o 答案是肯定的,Frame类提供了一个getGraphics()方法,该方法返回一个Graphics对象,使用这个返回的对象就能在任何地方进行绘图了。Frame类中在得到Graphics对象以后,只要传给Tank对象,Tank对象调用move()方法改变坦克位置以后就可以进行重绘了。面向对象坦克绘制面向对象坦克绘制o 若要画出坦克,必须要使用Frame类的paint()方法每一次变动的时候调用repaint()方法重绘。o paint()方法中画图的关键部分是Graphics对象g,该对象包含了与画图相关的所有方法,能不能把该对象“拿出

6、来”,传给需要使用它的对象,在绘制图形的时候调用呢?面向对象坦克绘制面向对象坦克绘制o 答案是肯定的,Frame类提供了一个getGraphics()方法,该方法返回一个Graphics对象,使用这个返回的对象就能在任何地方进行绘图了。Frame类中在得到Graphics对象以后,只要传给Tank对象,Tank对象调用move()方法改变坦克位置以后就可以进行重绘了。o 需要在Tank类的定义中增加一个Graphics对象和一个draw()方法,请看例2所示的代码 面向对象坦克绘制面向对象坦克绘制例例2:增加绘制方法的:增加绘制方法的Tank类类import java.awt.*;public

7、 class Tank static Graphics g;int x=100,y=100,dir=0,radius=20;public Tank(int x,int y)this.x=x;this.y=y;public void move(int moveDir)switch(moveDir)case 0:x=x-5;break;/0表示左 case 1:y=y-5;break;/1表示上 case 2:x=x+5;break;/2表示右 case 3:y=y+5;break;/3表示下 draw();public void draw()g.setColor(Color.blue);g.fi

8、llOval(x,y,40,40);g.setColor(Color.red);switch(dir)case 0:g.drawLine(x,y,x-20,y);break;case 1:g.drawLine(x,y,x,y-20);break;case 2:g.drawLine(x+20,y,x,y);break;case 3:g.drawLine(x,y,x,y+20);break;/坦克的射击方法 public void shoot()面向对象绘制的注意事项面向对象绘制的注意事项o 属性g是一个静态属性,需要从外面传进来,draw()方法使用g对象对坦克进行绘制。o 需要对上一讲的Gam

9、eCanvas类做一定变动,在键盘按键事件中,直接调用player对象的move()方法,在move()方法中改变坦克的位置并进行重绘例10-3给出了GameCanvas的代码和运行结果o GameCanvas类中调用画布的getGraphics()方法为g赋值。改造后的改造后的GameCanvas类类import java.awt.*;import java.awt.event.*;public class GameCanvas extends Frame Tank player;public GameCanvas()player=new Tank(100,100);class KL imp

10、lements KeyListener public void keyPressed(KeyEvent e)public void keyReleased(KeyEvent e)public void keyTyped(KeyEvent e)switch(e.getKeyChar()case a:player.dir=0;player.move(0);break;case w:player.dir=1;player.move(1);break;case d:player.dir=2;player.move(2);break;case s:player.dir=3;player.move(3);

11、break;addKeyListener(new KL();public void paint(Graphics g)Tank.g=this.getGraphics();player.draw();public static void main(String args)GameCanvas game=new GameCanvas();game.setSize(600,400);game.setVisible(true);注意这里的变化改造后的改造后的GameCanvas类运行效果类运行效果坦克移动的尾巴坦克移动的尾巴o从上图可以看到,坦克行动之后会留下一条长长从上图可以看到,坦克行动之后会留下

12、一条长长的的“尾巴尾巴”,这是我们不希望看到的,为了解决这个,这是我们不希望看到的,为了解决这个问题,我们必须在问题,我们必须在Tank类中设置两个变量类中设置两个变量oldX和和oldY,用来记录坦克移动之前的坐标,在移动之后使,用来记录坦克移动之前的坐标,在移动之后使用这两个值擦掉用这两个值擦掉“尾巴尾巴”,具体如例,具体如例10-4所示。所示。修改修改Tank类,使坦克移动后不留下轨迹类,使坦克移动后不留下轨迹 import java.awt.*;public class Tank static Graphics g;int x=100,y=100,dir=0,radius=20;int

13、 oldX,oldY;/保存移动前的坐标 public Tank(int x,int y)this.x=x;this.y=y;public void move(int moveDir)oldX=x;oldY=y;switch(moveDir)case 0:x=x-5;break;/0表示左 case 1:y=y-5;break;/1表示上 case 2:x=x+5;break;/2表示右 case 3:y=y+5;break;/3表示下 draw();public void draw()/擦除移动前的图形 g.setColor(Color.white);g.fillRect(oldX-20,o

14、ldY-20,40,40);g.setColor(Color.blue);g.fillOval(x-20,y-20,40,40);g.setColor(Color.red);switch(dir)case 0:g.drawLine(x,y,x-20,y);break;case 1:g.drawLine(x,y,x,y-20);break;case 2:g.drawLine(x+20,y,x,y);break;case 3:g.drawLine(x,y,x,y+20);break;/坦克的射击方法 public void shoot()子弹射击的面向对象实现子弹射击的面向对象实现o Tank类中

15、的shoot()方法是坦克射击的方法,坦克射击的动作会产生一颗子弹,所以必须在实现子弹类后再来讨论这个方法的实现。右表列出了子弹类Bullet的属性和方法 Bullet类的属性类的属性子弹圆心坐标子弹圆心坐标(x,y)移动前的圆心坐移动前的圆心坐标标(oldX,oldY)子弹方向子弹方向dir子弹半径子弹半径radius是否可以移动是否可以移动canMove绘图对象绘图对象gBullet类的方法类的方法子弹移动子弹移动move()绘图方法绘图方法draw()子弹自动移动子弹自动移动go()Bullet类的代码类的代码import java.awt.*;public class Bullet s

16、tatic Graphics g;int x,y,dir=0,radius=5;int oldX,oldY;/保存移动前的坐标 boolean canMove=true;public Bullet(int x,int y,int dir)this.x=x;this.y=y;this.dir=dir;public void move(int moveDir)oldX=x;oldY=y;switch(moveDir)case 0:x=x-5;break;/0表示左 case 1:y=y-5;break;/1表示上 case 2:x=x+5;break;/2表示右 case 3:y=y+5;brea

17、k;/3表示下 draw();public void draw()/擦除移动前的图形 g.setColor(Color.white);g.fillRect(oldX-5,oldY-5,10,10);if(canMove)g.setColor(Color.red);g.fillOval(x-5,y-5,10,10);public void go()Bullet类的说明类的说明o Bullet类与Tank类的不同之处在于n Bullet没有shoot()方法n 子弹的半径要比坦克的半径小,颜色是红色的n Bullet多了一个布尔变量canMove,该对象的作用是判断子弹是否已经消失,因为子弹击中目

18、标或者移出边界以后,就可以宣告子弹结束了生命周期了,当canMove是true时,子弹还在移动中否则,子弹已经“死亡”Bullet类的说明类的说明o 子弹的产生是由坦克决定的,当我们按下键盘的某个键时候,就会调用坦克的shoot()方法,控制坦克发炮,然后产生一个子弹,子弹自动向前移动。我们设定按下“K”键的时候发射一颗子弹,需要对GameCanva做相应改动。坦克类的坦克类的shoot()方法方法o 按照简单的设想,shoot()方法的流程应该如下:n 第一步:产生一个Bullet对象;n 第二步:调用Bullet对象的go()方法,让子弹自动移动。o 根据这个设想来实现Tank类的shoo

19、t()方法。shoot()方法的代码方法的代码public void shoot()Bullet b=null;switch(dir)case 0:b=new Bullet(x-25,y,dir);break;/左 case 1:b=new Bullet(x,y-25,dir);break;/上 case 2:b=new Bullet(x+25,y,dir);break;/右 case 3:b=new Bullet(x,y+25,dir);break;/下 /让自己go出去,自生自灭吧 b.go();子弹移动子弹移动go()方法方法o 关键的逻辑就在于go()方法了,go()方法是子弹自动移动

20、的方法,涉及到线程机制,应该创建子弹移动线程,在这个线程中调用move()方法定时移动,这个线程类的名字是BulletMovement子弹移动类子弹移动类public class BulletMovement extends Thread Bullet b;public BulletMovement(Bullet b)this.b=b;public void run()while(b.canMove)try /判断子弹是否出了边界 if(b.x580|b.y380)b.canMove=false;b.draw();continue;b.move(b.dir);/每隔50毫秒移动一次 Thread.sleep(50);catch(Exception e)e.printStackTrace();go()方法方法public void go()Thread bm=new BulletMovement(this);bm.start();修改修改GameCanvas类类o 修改事件类中的方法 keyTyped(KeyEvent e)增加发射子弹的键盘操作,空格键操作。代码如下:case :player2.shoot();break;o 修改方法 paint(Graphics g),添加语句 Bullet.g=this.getGraphics();

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!