这里以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("%1f,%1f,%1f",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));
加完上面的代码便可以看到乌云两边飘,两眼睛也跟着飘的位置转动,感觉很逗……