cocos2d-x 十五(简单的碰撞检测 实践篇 上)

这里以chipmunk官方的一个例子来展示一下物理引擎在游戏中的具体应用,例子名称是Cloud Bomber,虽然只有obj-c的源码,但还是本着看看编程思想的心态学习了一下。掌握这个例子核心的内容也就能证明自己算是正式入门了……这里只按实现逻辑将核心部分代码转换成C++代码,因为时间有限,所以分三篇来写吧……

首先是第一部分的内容,在例子里用到了自定义的精灵,这种自定义的精灵可以用来定制精灵的各种属性,比如精灵的活动方式、范围、自有的独立属性……所以熟练运用自定义精灵对于制作复杂的游戏来说是非常必要的。就拿例子中的乌云来说吧,乌云的眼睛和眉毛、运动方式以及转动眼睛的检测更新都是被封装在了乌云精灵类里,所以每创建一个乌云精灵,它都会拥有被我们赋予的属于它的自有属性。看代码:

class cloud :
	public cocos2d::CCSprite
{
public:
	cloud(void);
	~cloud(void);
	virtual bool init(void);
	//static cloud* spriteWithFile(const char *pszFileName, const cocos2d::CCRect& rect);  
	static cloud* create(const char *pszFileName);
    //static cloud* spriteWithBatchNode(cocos2d::CCSpriteBatchNode *batchNode, const cocos2d::CCRect& rect);

	//计时器刷新回调
	void update(float dt);
private:
	//移动速率参数
	float fixed_time;
	//眼睛精灵
	CCSprite* leftEye, *rightEye;
	//眼睛用的坐标
	cocos2d::CCPoint lookAt;

	//CREATE_FUNC(cloud);
};
建立自定义的精灵理所当然的是继承精灵类CCSprite,需要什么样的方法函数或者参数都可以参考CCSprite的源代码在里面自己定义。然后是实现和重写代码:
#include "cloud.h"

using namespace cocos2d;

cloud::cloud(void)
{
//初始化
fixed_time=0;
leftEye=NULL;
rightEye=NULL;
lookAt=ccp(240,0);
}


cloud::~cloud(void)
{
}

bool cloud::init(){

	//添加乌云
	//initWithFile("Cloud.png");
	//this->setPosition(ccp(240,280));
	//添加眼睛
	leftEye = CCSprite::create("Eye.png");
	leftEye->setPosition(ccp(60,67));
	this->addChild(leftEye);
	//
	rightEye= CCSprite::create("Eye.png");
	rightEye->setPosition(ccp(140,67));
	this->addChild(rightEye);

	//添加皱眉
	CCSprite* eyeBrow = CCSprite::create("EyeBrow.png");
	eyeBrow->setPosition(ccp(95,90));
	addChild(eyeBrow);


	//加入计时器
	scheduleUpdate();
return this;	
}

//重写创建的过程
cloud* cloud::create(const char *pszFileName)
{
    cloud *pobSprite = new cloud();
    if (pobSprite && pobSprite->initWithFile(pszFileName))
    {
		//在这里加入自己的精灵初始化代码
		pobSprite->init();
        pobSprite->autorelease();
        return pobSprite;
    }
    CC_SAFE_DELETE(pobSprite);

    return NULL;
}



//计时更新乌云的位置及眼神
void cloud::update(float dt){
	float fixed_dt =  cocos2d::CCDirector::sharedDirector()->getAnimationInterval();
	fixed_time+=fixed_dt;
	this->setPosition(ccp(240+200*sinf(fixed_time/2.0),this->getPosition().y));
	//CCLog(",,",fixed_time,fixed_dt,sinf(fixed_time/2.0));
	leftEye->setRotation(leftEye->getRotation()-CC_RADIANS_TO_DEGREES(ccpToAngle(leftEye->convertToNodeSpaceAR(lookAt))));
	rightEye->setRotation(rightEye->getRotation()-CC_RADIANS_TO_DEGREES(ccpToAngle(rightEye->convertToNodeSpaceAR(lookAt))));
}
然后在主场景里创建一个自定义精灵:
//创建并设置自定义的精灵-愤怒的乌云
cloud* cloudSprite=cloud::create("Cloud.png");
cloudSprite->setScale(0.5f);
addChild(cloudSprite);
cloudSprite->setPosition(ccp(240,280));

加完上面的代码便可以看到乌云两边飘,两眼睛也跟着飘的位置转动,感觉很逗……

源代码:http://download.csdn.net/detail/cyistudio/5541881