WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章J2ME技术J2ME基础J2ME 2D小游戏入门之旅(四) 加入子弹群,实现碰撞运算

J2ME 2D小游戏入门之旅(四) 加入子弹群,实现碰撞运算
作者:不详  来源:转载  发布时间:2005-8-2 10:02:09
s[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时,将不在是想象着子弹,飞机什么的,你要思考一个系统。

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

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

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

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

n public void refreshBullets(Sprite planesprite, boolean needcollision)更新子弹数组状态,碰撞检测、处理等逻辑工作的综合

n public void killbullets(Sprite planesprite,int range)//稍后解释



到此为止,我们的游戏已经初具规模了,下一步是加入效果类,嘿嘿有点意思了…

上一页  [1] [2] 

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码