世界中有刚体的诞生,也就有着刚体的销毁。当一个刚体完成它的使命后,我们便要销毁这个刚体。试想一下,在我们的游戏,如果我们放任这个刚体继续存在,一定时间后,我们的“世界”中会充满着刚体!所以我们要在合适的时间销毁掉刚体,释放资源。
设置刚体的属性
为了方便对刚体进行销毁,我们要在创建刚体时设置如下属性。
public abstract class MyBody {//自定义刚体根类
……
boolean isLive = true; //是否绘制
boolean isDeleted = false; //是否被删除
……
}
销毁步骤
当我们想要销毁一个刚体时,我们分成两个步骤来进行:
1.在任意的一个函数里(如上一章中碰撞函数),将刚体的isLive属性设置为false。
2.在进行下一帧描绘的时候将isDeleted设置为true并销毁刚体。
这里为什么要分成两步完成呢,原因是如果不在每次描绘画布的时候销毁刚体,而在其他函数中销毁,会造成代码的混乱,比如同时碰撞的时候销毁同一个刚体。
具体销毁刚体的代码如下:
for (MyBody mpi : _bl) { //遍历所有刚体
if (mpi instanceof MyRectColor) { //判断mpi是否属于MyRectColor
MyRectColor mrc = (MyRectColor) mpi;//强制转换
if (!mrc.isLive && !mrc.isDeleted) {//判断是否销毁
mrc.isDeleted = true; //设置isDeleted为true
gv.activity.world.destroyBody(mrc.body); //销毁刚体
bl.remove(mpi);//将销毁的刚体移出bl
}else {
if(mrc.isObstacle&&isCreateBullet){//判断是否发动攻击
mrc.isCreateBullet = true;//激活敌人的攻击指令
}
}
}else if(mpi instanceof PlayerBall){//判断是否属于PlayerBall
PlayerBall playerBall = (PlayerBall) mpi;//强制转换
if(!playerBall.isLive&&!playerBall.isDeleted){//判断是否销毁
playerBall.isDeleted = true;//确认销毁
gv.activity.world.destroyBody(playerBall.body);//销毁刚体
bl.remove(mpi);//将销毁的刚体移出bl
}
}else if(mpi instanceof Bullet){//判断是否属于Bullet
Bullet bullet = (Bullet) mpi;//强制转换
if(!bullet.isLive&&!bullet.isDeleted){//判断是否销毁
bullet.isDeleted = true;//确认销毁
gv.activity.world.destroyBody(bullet.body);//销毁刚体
bl.remove(mpi);//将销毁的刚体移出bl
}
}else if (mpi instanceof Prop) {//判断是否属于Prop
Prop prop = (Prop) mpi;//强制转换
if (!prop.isLive && !prop.isDeleted) {//判断是否销毁
prop.isDeleted = true;//确认销毁
gv.activity.world.destroyBody(prop.body);//销毁刚体
bl.remove(mpi);//将销毁的刚体移出bl
}
}
}
总而言之,整体思路便是遍历刚体,将isLive属性为false的刚体销毁掉。
恩~~整个游戏在JBox2D上的的技术实现就差不多是这些了,至于剩下的便是游戏逻辑的设定、界面的设计等,相信这些对于大家来说都不会太难,如果有问题可以向我留言或者私信我。
下面给出源码的下载地址:http://download.csdn.net/detail/black__lotus/9562625
大家可以参考着源码进行学习,希望大家都能够玩转JBox2D~