这一篇就说说导弹发射与碰撞部分的代码,总体来说就和一个微型的飞行射击游戏差不多,但是在这部分内容里,游戏运用了一些碰撞后的特效代码如:背景闪烁、地面出现弹坑……不过貌似cocos2d-x没有完全封装chipmunk,所以示例中有些功能实现起来过于麻烦,如地面的碰撞线段按边缘附加本来可用的marchAllWithBorder,这样的方法就得替换成手动设置……因此像弹坑这样的效果就不打算再做了,反正弹坑效果也就是混合效果,主要是混合图形后产生新的碰撞线段没什么办法,可以在日后学习box2d后再自己玩下……这里只演示导弹撞击墙体后的爆炸效果:
1.首先需要定义一个炮弹的物理精灵,在原例中,通过自定义导弹对象的实现代码赋予了导出isTracking追踪重力点的属性,使得导弹可以在触摸移动时跟着移动的坐标飞行。这部分代码的实现方式我改用了前面用过的代码,把刚体、形状、精灵关联等代码全部封装进了自定义的导弹精灵类里:
//自定义一个物理精灵类,用于定制导弹的自有属性
class Missile :
public cocos2d::extension::CCPhysicsSprite
{
public:
Missile(void);
~Missile(void);
//自定义创建导弹精灵,这里自己加了三个参数,分别是乌云精灵的位置,触屏坐标对应的矢量点和加入到的物理空间
static Missile* create(const char *pszFileName,cocos2d::CCPoint pos,cpVect target,cpSpace* m_pSpace);
//导弹加速度的回调函数
static void
MissileVelocityUpdate(cpBody *cBody, cpVect gravity, cpFloat damping, cpFloat dt);
//是否追踪触屏移动点
bool isTracking;
//触屏点对应的重力矢量点,用于决定导弹发射运行的角度
cpVect target;
};
导弹需要在物理世界里,所以上面继承的是物理精灵类,下面是实现文件:
#include "Missile.h"
#define MISSILE_SIZE 32.0
#define MISSILE_SPEED 200.0
#define MISSILE_TURN_SPEED 6.0
Missile::Missile(void)
{
isTracking=false;
}
Missile::~Missile(void)
{
}
//计算带追踪属性的导弹发射角度对应的矢量点
static cpVect
Turn(cpVect v1, cpVect v2, cpFloat limit)
{
// Angle between the two vectors
cpFloat angle = cpfacos(cpfclamp01(cpvdot(cpvnormalize(v1), cpvnormalize(v2))));
if(angle){
// Performs an nlerp() between two direction vectors.
cpVect direction = cpvnormalize(cpvlerp(v1, v2, cpfmin(limit, angle)/angle));
return cpvmult(direction, MISSILE_SPEED);
} else {
return v1;
}
}
//导弹加速度的回调函数
void Missile::MissileVelocityUpdate(cpBody *cBody, cpVect gravity, cpFloat damping, cpFloat dt)
{
cpBody *abody = cBody;
Missile *missile = (Missile*)abody->data;
//根据导弹是否处于追踪状态决定是否刷新矢量点
if(missile->isTracking){
cpVect targetVelocity = cpvmult(cpvnormalize(cpvsub(missile->target, abody->p)), MISSILE_SPEED);
abody->v = Turn(abody->v,