快速业务通道

J2ME 2D小游戏入门之旅(四) 加入子弹群,实现碰撞运算 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
lic void paint(Graphics g) {//绘画整个子弹组 for (int i = 0; i < bullets.length; i++) { if(bullets[i][5]==0){//死去的子弹不绘画 continue; } sprite.setPosition(bullets[i][1],bullets[i][2]); //更新位置 sprite.paint(g); } } public void refreshBullets(Sprite planesprite, boolean needcollision){//刷新字典数组的状态,并作碰撞处理 for (int i = 0; i < bullets.length; i++) { if(bullets[i][5]==0){ //死去的子弹不更新 continue; } if(needcollision){//如果需要碰撞检测 if (isCollision(planesprite, i, 10)) {//如果碰撞,进行处理 //System.out.println("collision "); Navigate.mc.gameover = true; Navigate.mc.explosion.sprite.setPosition(bullets[i][1] - 16, bullets[i][2] - 16); bullets[i][5] = 0;//杀死碰撞的子弹 continue; } } updata(i);//更新状态 } } private boolean isCollision(Sprite sprite,int i,int range){ //判断是否碰撞 //updataspritepos(i); //return sprite.collidesWith(this.sprite,true); boolean result=false; int planeXCenter=sprite.getX()+12; int planeYCenter=sprite.getY()+12; int bulletXCenter=bullets[i][1]+3; int bulletYCenter=bullets[i][2]+3; if(Math.abs(planeXCenter-bulletXCenter) < range){ if (Math.abs(planeYCenter - bulletYCenter )< range) { result = true; } } return result; } private void updataspritepos(int i){//将sprite更新到i字弹的位置 sprite.setPosition(bullets[i][1],bullets[i][2]); } /* no use now public void resetDeadBullet(){ for (int i = 0; i < bullets.length; i++) { if(bullets[i][5]==0){//dead bullet initBullet(i); } } } */ public void killbullets(Sprite planesprite,int range){杀死一定区域内的子弹 for (int i = 0; i < bullets.length; i++) { if(bullets[i][5]!=0){//alive bullets if(isCollision(planesprite, i, range)){ bullets[i][5]=0; initBullet(i); } } } } }

J2ME 2D小游戏入门之旅(四) 加入子弹群,实现碰撞运算(2)

时间:2011-08-09

子弹如何表示?

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

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

我们只是线

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号