cocos2d-x 菜鸟学习笔记十六(简单的碰撞检测 实践篇 中)

这一篇就说说导弹发射与碰撞部分的代码,总体来说就和一个微型的飞行射击游戏差不多,但是在这部分内容里,游戏运用了一些碰撞后的特效代码如:背景闪烁、地面出现弹坑……不过貌似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, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值