J2ME 2D小游戏入门之旅(四) 加入子弹群,实现碰撞运算 - 编程入门网
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |