上一章我们添加了一个英雄到屏幕中,但他太孤单了,所以这次我们添加一些敌人来让主角干掉。
具体的实现我们写在函数 void addTarget()里,这个函数会实现将敌人添加进屏幕,并从右往左以一个随机的速度移动。
在HelloWorldScene.h文件里声明 void addTarget()方法,然后把以下代码添加进HelloWorldScene.cpp文件里。
void HelloWorld::addTarget()
{
// 声明敌人精灵并初始化
CCSprite *target = CCSprite::create("Target.png");
// 获取屏幕尺寸
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//计算敌人精灵可以出现的范围并从该范围内伪随机出一个位置
int minY = target->getContentSize().height/2;
int maxY = winSize.height - target->getContentSize().height/2;
int rangeY = maxY - minY;
int actualY = ( rand() % rangeY ) + minY;
// 设置敌人精灵的位置
target->setPosition(
ccp(winSize.width + (target->getContentSize().width/2),
actualY) );
// 把敌人精灵添加到HelloWorld图层
this->addChild(target);
// 敌人精灵从右移动到左边的时间为2-4秒
int minDuration = (int)2.0;
int maxDuration = (int)4.0;
// 从2-4秒中随机一个时间
int rangeDuration = maxDuration - minDuration;
int actualDuration = ( rand() % rangeDuration )+ minDuration;
// 设置精灵从右移动到左的位置以及所花时间
CCFiniteTimeAction* actionMove = CCMoveTo::create( (float)actualDuration,
ccp(0 - target->getContentSize().width/2, actualY) );
// 设置精灵完成动作后进行的操作(在回调函数spriteMoveFinished中实现)
CCFiniteTimeAction* actionMoveDone = CCCallFuncN::create( this,
callfuncN_selector(HelloWorld::spriteMoveFinished));
target->runAction( CCSequence::create(actionMove, actionMoveDone, NULL) );
}
在这我们通过callfuncN_selector(HelloWorld::spriteMoveFinished)回调了spriteMoveFinished函数,我们需要在HelloWorldScene.h文件中声明它,并在cpp文件里实现它
// 移除敌人精灵
void HelloWorld::spriteMoveFinished(CCNode *sender )
{
CCSprite *sprite = (CCSprite *)sender;
this->removeChild(sprite, true);
}
温馨提示
1.关于随机函数。srand和rand是C标准库函数。对于每一个平台来说,你可以先获取毫秒级时间来得到一个随机数。2. 回调函数,在objc中用selector:@selector(spriteMoveFinished),但在cpp中实现就比较复杂了,你可以参考cocos2dx\include\selector_protocol.h里的声明。一共有5种回调函数类型
schedule_selector
callfunc_selector
callfuncN_selector
callfuncND_selector
menu_selector
如何使用它们,根据所用函数的定义来决定。比如使用CCTimer::initWithTarget函数,它的第二个参数是SEL_SCHEDULE类型,到selector_protocol.h里查一下,可以看到对应的是schedule_selector(_SELECTOR)宏,所以调用时就需要在类里头实现一个void MyClass::MyCallbackFuncName(ccTime)函数,然后把schedule_selector(MyClass::MyCallbackFuncName)作为CCTimer::initWithTarget的第二个参数传入。
现在,我们要隔一定时间就往屏幕中加入敌人,添加如下代码到init()方法中,记得放在return之前。
// 每1.0秒执行一次指定的回调函数
this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);
然后实现在HelloWorldScene.h文件中声明gameLogic()方法,并在cpp文件中实现它。要注意gameLogic()方法必须声明为public,否则是不能回调的。
void HelloWorld::gameLogic( float dt )
{
addTarget();
}
好了,全部搞定,编译并运行,好好享受你的成果。
附本章源码下载:http://download.csdn.net/detail/lpkkk/4997324
文章所写的东西只是我自己的理解,如果哪里出现错误,敬请斧正。
您可以留言、微博私聊我或Email我
我的微博:http://weibo.com/u/2007282737
我的Email:pengkailiao@gmail.com