尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17382889
<捕鱼达人>回顾
【cocos2d-x IOS游戏开发-捕鱼达人1】内容介绍
<城市跑酷>回顾
【cocos2d-x IOS游戏开发-城市跑酷1】跑酷游戏介绍
上节回顾
Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植5:初始化物理世界【Chipmunk】
本章我们将添加一个精灵到PlayLayer,并让他跑起来。我们称呼这个精灵为runner。
要实现跑的动作,我们需要帧动画。动画的实现要感谢资源文件下的精灵表单。
精灵表包括parkour.plist 和 parkour.png. 使用TexturePacker工具生成。
Note: 精灵表有助于减少内存消耗,加快绘图过程和保持帧率高。更多信息参考:精灵表单
帧动画由多张图片组成。
如下所示:
把所有的图片拖到TexturePacker里。然后点击”Publish to output the sprite sheet”.如需使用 TexturePacker可以在它的官网上找到。
现在我们获得两个文件“parkour.plist”和“parkour.png”, 把他们移动到资源目录下的Resource/res里面.
CCSpriteBatchNode *spriteSheet; CCAction *runningAction; CCSprite *sprite;
CCLayer::onEnter();//务必调用 // create sprite sheet //CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile() CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(s_runnerplist,s_runner); spriteSheet = CCSpriteBatchNode::create(s_runner); this->addChild(spriteSheet); CCAnimation* animation; //创建一个空白的序列帧动画信息 animation = CCAnimation::create(); // init runningAction CCSpriteFrame * frame; // num equal to spriteSheet for (unsigned int i = 0; i < 8; i++) { char str[100] = {0}; sprintf(str, "runner%i.png", i); frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(str); animation->addSpriteFrame(frame); } animation->setDelayPerUnit(0.1f); //设置动画结束后是否保留动画帧信息 animation->setRestoreOriginalFrame(false); //设置循环播放次数 (-1:无限循环) animation->setLoops(-1); runningAction = CCAnimate::create(animation); //runningAction->retain(); sprite = CCSprite::createWithSpriteFrameName("runner0.png"); sprite->setPosition(ccp(80, 85)); sprite->setVisible(true); sprite->runAction(runningAction); spriteSheet->addChild(sprite);
接着让runner跑起来:
sprite = CCPhysicsSprite::createWithSpriteFrameName("runner0.png"); CCSize contentSize = sprite->getContentSize(); // init body body = cpBodyNew(1, cpMomentForBox(1, contentSize.width, contentSize.height)); body->p = cpv(g_runnerStartX, g_groundHight + contentSize.height / 2); cpVect arg1 = cpv(150, 0); cpVect arg2 = cpv(0, 0); cpBodyApplyImpulse((cpBody*)body , (cpVect)arg1 , (cpVect)arg2 ); cpSpaceAddBody(space, body); //init shape shape = cpBoxShapeNew(body, contentSize.width - 14, contentSize.height); cpSpaceAddShape(space, shape); sprite->setCPBody(body); sprite->runAction(runningAction); spriteSheet->addChild(sprite);
接下来,我们将移动摄像机,让它跟谁runner移动,并用图片替换背景实现,然后让背景图片无限循环起来。
然后跳转到update()函数做如下修改:
移动镜头:
// move Camera //runner的新位置回由物理世界在每帧计算,相机需要跟随runner的移动步伐 //lastEyeX = runner->getPositionX() - runner->offsetPx; lastEyeX = runner->getPositionX() - g_runnerStartX;
// move Camera CCCamera *camera = this->getCamera(); float eyeZ = CCCamera::getZEye(); camera->setEyeXYZ(lastEyeX, 0, eyeZ); camera->setCenterXYZ(lastEyeX, 0, 0);
runner的新位置回由物理世界在每帧计算,相机需要跟随runner的移动步伐。
编译并运行这个程序,然后你可以看到一个男孩在屏幕上运行。