cocos2d-x-3.0 alpha1与C++11练习三:飞镖忍者,如何移动精灵及
来源:未知 责任编辑:责任编辑 发表时间:2014-01-06 18:19 点击:次
在上一节中,为游戏场景添加了一个精灵。但一个英雄或许太过孤单,我们应该加入一些敌人,让他来打败。
p>
p>1,添加敌人
p>void addTarget()函数将会帮我们完成这一工作,敌人将会以随机的速度,从游戏场景左移动到右。在HelloWorldScence.h里声明void addTarget(),并在HelloWorldScene.cpp里添加以下的代码:
p>
p>
p>void HelloWorld::addTarget(){
p> Sprite *target = Sprite::create("Target.png", Rect(0, 0, 27, 40));
p> Size winSize = Director::getInstance()->getWinSize();
p> int minY = target->getContentSize().height/2;
p> int maxY = winSize.height-minY;
p> int rangeY = maxY-minY;
p> int actualY = rand() % rangeY + minY;
p> target->setPosition(Point(winSize.width+target->getContentSize().width/2, actualY));
p> this->addChild(target);
p>
p> int actualDuration = rand() % 2 + 2;
p> FiniteTimeAction *actionMove = MoveTo::create(actualDuration, Point(0-target->getContentSize().width/2, actualY));
p> //const std::function<void(Node*)> &func
p> FiniteTimeAction *actionMoveDone = CallFuncN::create(std::bind(&HelloWorld::spriteMoveFinished, this, target));
p> target->runAction(Sequence::create(actionMove,actionMoveDone, NULL));
p>}
p>srand和rand是C标准库函数。这里已是cocos2d-x 3.0的写法,最让人迷惑的是actionMoveDone的初始化,由于用了c++11的新特性,CallFuncN::create的参数是
p>
p>1
p>const std::function<void(Node*)> &func
p>而std::bind可以帮助我们生成这一参数。这里用CallFuncN回调了spriteMoveFinished方法,我们需要在HelloWorldScene.h里声明并如下来实现:
p>
p>
p>void HelloWorld::spriteMoveFinished(Node *sender){
p> Sprite *sprite = (Sprite *)sender;
p> this->removeChild(sprite);
p>}
p>2,定时抛出敌人
p>我们应该定时地为游戏加入敌人,把以下代码加入到init()函数的返回值前:
p>
p>
p>this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);
p>在HelloWorldScence.h里声明:
p>
p>
p>void gameLogic(float dt);
p>从2.x版本开始,ccTime便统一用float进行代替。然后在HelloWorldScence.cpp里实现gameLogic():
p>
p>
p>void HelloWorld::gameLogic(float dt){
p> this->addTarget();
p>}
p>运行效果:
p>
p>
p>
p>
p>
p>3,使用lambda重写CallFuncN::create语句
p> lambda是c++11新特征,据说性能优于std::bind方法。以下是lambda写法,效果相同:
p>
p>1
p>//FiniteTimeAction *actionMoveDone = CallFuncN::create(std::bind(&HelloWorld::spriteMoveFinished, this, target));
p>1
p>FiniteTimeAction *actionMoveDone = CallFuncN::create( [this](Node *sender)->void{ //std::cout << "remove target" << std::endl; this->removeChild(sender); });
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>