Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植6:Running This Way

尊重开发者的劳动成果,转载的时候请务必注明出处: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里面.


### resource.h 中加入runner.plist的宏定义

### 加入新文件Runner.cpp

在layer前面加入新局部变量的声明
 CCSpriteBatchNode *spriteSheet;
 CCAction *runningAction;
 CCSprite *sprite;


替换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);


先创建一个BatchNode, 把它加入到layer, 基于这个BatchNode创建的sprite都将添加到BatchNode。

从SpriteFrameCache创建帧动画。

用第一帧创建精灵,并让它运行这个动画,把这个精灵添加到BatchNode。

运行看效果吧。

Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植6:Running This Way_第1张图片

接着让runner跑起来:

重新使用PhysicsSprite创建精灵。
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);

* 创建body,设置body的位置,并给它一个向前的作用力。
* 把body添加到space。
* 为body添加一个shape,同样也需要添加到space。
* sprite->setCPBody绑定物理body到sprite

## debug and run

跑起来后,我们会看到runner向前跑出了屏幕。

Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植6:Running This Way_第2张图片


Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植6:Running This Way_第3张图片

接下来,我们将移动摄像机,让它跟谁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的移动步伐。

编译并运行这个程序,然后你可以看到一个男孩在屏幕上运行。


你可能感兴趣的:(C++,移植,游戏开发,cocos2d-x,跑酷)