这里以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); };
#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));
源代码:http://download.csdn.net/detail/cyistudio/5541881