Java面向对象程序设计与系统开发第十章网络坦克大战游戏制作第一讲 面向对象游戏设计(1)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面向对象坦克绘制
若要画出坦克,必须要使用Frame类的paint()方法
每一次变动的时候调用repaint()方法重绘。 paint()方法中画图的关键部分是Graphics对象g,
该对象包含了与画图相关的所有方法,能不能把该对 象“拿出来”,传给需要使用它的对象,在绘制图形 的时候调用呢?
面向对象坦克绘制
答案是肯定的,Frame类提供了一个getGraphics() 方法,该方法返回一个Graphics对象,使用这个返回 的对象就能在任何地方进行绘图了。Frame类中在得 到Graphics对象以后,只要传给Tank对象,Tank对 象调用move()方法改变坦克位置以后就可以进行重
简单坦克游戏的面向对象实现
1
简单坦克游戏的面向对象实现
本章的游戏例子涵盖了Java语言的众多特点,
比如继承、封装、抽象方法、静态方法和静态变量等
等,并结合Java画图机制、线程机制和Java网络通
信三部分的知识点。
2
本讲概要
坦克游戏复习
坦克游戏面向对象设计
面向对象分析
坦克的面向对象设计
主窗体的设计
坦克游戏复习
坦克: Байду номын сангаас 圆心坐标:x、y 半径大小:20 坦克朝向:dir 子弹: 圆心坐标、半径、移动方向 坦克的移动:使用键盘按键机制改变圆心坐标,改变 之后刷新画面 子弹的移动,使用线程机制控制
面向对象分析
分析坦克大战小游戏,如图1所示,一共有三种实体 : 坦克:Tank 子弹:Bullet
面向对象绘制的注意事项
属性g是一个静态属性,需要从外面传进来,
draw()方法使用g对象对坦克进行绘制。
需要对上一讲的GameCanvas类做一定变动,在键
盘按键事件中,直接调用player对象的move()方 法,在move()方法中改变坦克的位置并进行重绘 例10-3给出了GameCanvas的代码和运行结果 GameCanvas类中调用画布的getGraphics()方法 为g赋值。
面向对象坦克绘制
虽然实现了Tank类,但是这个实现有意义吗?接下 来要考虑的是如何通过画图机制把坦克表现出来。
面向对象坦克绘制
若要画出坦克,必须要使用Frame类的paint()方法,每 一次变动的时候调用repaint()方法重绘。
paint()方法中画图的关键部分是Graphics对象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 implements 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);break; } } }
障碍物:Block
除了这三种实体以外,我们还需要实体所在的场景 类: 场景:GameCanvas
三种对象
为了简单起见,暂不考虑障碍物。在上一讲中开发
坦克大战的方法是传统的结构化的思想,本讲我们
改用面向对象的方法来实现,可以针对坦克和子弹 写各写一个类
坦克的面向对象设计
对于坦克,把类名设定为Tank,类是由属性和方法构成
包含了与画图相关的所有方法,能不能把该对象“拿出来 ”,传给需要使用它的对象,在绘制图形的时候调用呢?
答案是肯定的,Frame类提供了一个getGraphics()方法
,该方法返回一个Graphics对象,使用这个返回的对象就 能在任何地方进行绘图了。Frame类中在得到Graphics 对象以后,只要传给Tank对象,Tank对象调用move() 方法改变坦克位置以后就可以进行重绘了。
public void draw() { g.setColor(Color.blue); g.fillOval(x,y,40,40); g.setColor(Color.red); switch(dir) { case 0:g.drawLine(x,y,x20,y);break; case 1:g.drawLine(x,y,x,y20);break; case 2:g.drawLine(x+20,y,x,y);break; case 3:g.drawLine(x,y,x,y+20);break; } } //坦克的射击方法 public void shoot(){} }
的,Tank类中的属性和方法如下表所示(代码见例1)
Tank类的属性 坦克圆心坐标 坦克半径 坦克朝向 坦克移动 (x,y) radius dir Tank类的方法 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 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表示下 } } }
绘了。
需要在Tank类的定义中增加一个Graphics对象和一 个draw()方法,请看例2所示的代码
例2:增加绘制方法的Tank类
import java.awt.*; public 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(); }
相关文档
最新文档