当前位置:首页 > 网络编程 > 软件语言 > JAVA > J2ME 2D小游戏入门之加入子弹群

J2ME 2D小游戏入门之加入子弹群

点击次数:25 次 发布日期:2008-12-12 13:13:44 作者:源代码网
源代码网推荐 飞机类游戏中子弹是必不可少的,他们数量很多且充斥着整个屏幕,这些随机或者有着一定AI的小物体,实现起来不是总那么容易,有时候你不得不考虑很多和效能有关的问题。

源代码网整理以下

    飞机类游戏中子弹是必不可少的,他们数量很多且充斥着整个屏幕,这些随机或者有着一定AI的小物体,实现起来不是总那么容易,有时候你不得不考虑很多和效能有关的问题。我们之前定义了GameObject,很大程度上就是为了方便的重用Sprite,因为我们有很多的子弹,不可能没增加一个子弹都是一个Sprite,我需要共享同一个Sprite。我们通过继承GameObject来实现。

  下面分析一下这个子弹类:

  它将继承自GameObject;

  记录子弹的个数;

  一个子弹的状态数组,记录各个子弹的类型type,位置x,y,速度vx,vy,是否存活alive等等。
   
  初始化子弹

  一个绘制方法,将子弹画到屏幕上。

  一个碰撞检测方法。

  好了先这样吧,以下是我们子弹类的定义,注意这种思想——重用Sprite,这很重要。(这里参考了tony的很多设计)

  子弹如何表示?

  首先我们用一个二维数组来记录子弹的信息:

  bullets[i][0]表示子弹的类型,有上、下、左、右四种,分别表示子弹飞入屏幕前的四种位置;

  bullets[i][1]表示子弹的x坐标;

  bullets[i][2]表示子弹的y坐标

  bullets[i][3]表示子弹的x方向速度;

  bullets[i][4]表示子弹的y方向速度;

  bullets[i][5]表示子弹的存活状态;

  子弹如何初始化?

  我们首先写了一个初始化单个子弹的方法,然后便利数组调用initBullet (i);来更新整个状态数组。

  子弹如何绘制?

  我们首先写了一个绘制单个子弹的方法,然后便利数组调用paint(g,i);来绘制整个状态数组。

  子弹如何碰撞?

  有很多种方法,其中sprite本身就提供了边框碰撞检测和基于像素的碰撞检测。前者不太适合我们的游戏,我们的飞机是不规则物体,且飞行游戏对碰撞比较敏感;而后者的效率又得不到我们的信赖,所以我们是用一种半径检测,把飞机近似的看成圆,选取恰当的半径,Math.abs(planeXCenter-bulletXCenter) <range则表明碰撞。

  碰撞看似简单,其实是很复杂的问题,值得庆幸的是,二维碰撞相比三维碰撞简单得多。一个小技巧是,宁可让膨胀检测半径变小也不要他变得大——漏掉检测,总比误检测要好得多。

  子弹更新?

  我们利用refreshBullets进行更新,这是主要逻辑部分。这个方法负责便利数组检测碰撞,如果碰撞就将处于碰撞位置的子弹杀死,并作相应的处理,这里是结束游戏并爆炸飞机;否则更新子弹的位置。

  我们只是线性的遍历整个的数组,进行碰撞检测,之后是更新位置;但是这样做有一个前提,就是碰撞检测简单而且处理部分也很简单:在这个游戏中,碰撞检测只是子弹群和飞机的检测,碰撞检测在游戏结束后就不执行了(通过控制boolean needcollision);而处理更是简单了一些——直接结束了游戏。如果不是如此,比如处理后并不是简单的结束游戏,我们就不得不设计的复杂一些。可能就不是将碰撞简单的以飞机为中心了。我们需要设计好游戏事件,设计好碰撞系统。

  如果碰撞本身比较复杂,或者子弹数量,种类增加时,我们线性的遍历数组就不能总是对所有的子弹都检测,可能屏幕需要分区,不处于一个区域的单位不检测。

  总之当你想想你的1934时,将不在是想象着子弹,飞机什么的,你要思考一个系统。

  总结一下子弹类的公共接口:

  Bullets(Image img,int picwidth,int picheight,int bulletstotal,int width,int height)构造函数

  public void initBullets()初始化子弹数组

  public void paint(Graphics g) paint子弹数组

  public void refreshBullets(Sprite planesprite, boolean needcoll

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华