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); });
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • cocos2d-x学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x学习(一):HelloWorld
  • cocos2dx在xcode下开发,编译到android上(2)
  • cocos2d 设置屏幕默认方向
  • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1