Hi,大家好,我们现在来做第一个cocos2d-x精灵的第二篇
第一节我们加了一个小黑侠在屏幕了喔,有趣把,今天我们写一个新的函数把,void addTarget()函数将会帮我们完成这一工作,敌人将会以随机的速度,从游戏场景右移动到左。
在HelloWorldScence.h里声明void addTarget(),并在HelloWorldScene.cpp里添加以下的代码,(请不要忘记在HelloWorldScene.cpp的开头加入using namespace cocos2d)
CCSprite、CCMoveTo、CCCallFuncN、CCSequence都是用create(..)定义的..
//添加敌人
void HelloWorld::addTarget()
{
CCSprite* target = CCSprite::create("Target.png",CCRectMake(0,0,27,40));
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//计算y
// Determine where to spawn the target along the Y axis
int minY = target->getContentSize().height/2;
int maxY = winSize.height - target->getContentSize().height/2;
int rangeY = maxY - minY;
int actualY = (rand()% rangeY)+minY;
//设置target坐标
target->setPosition(ccp(winSize.width + target->getContentSize().width/2,actualY));
this->addChild(target,1);
//计算速度(speed)
// Determine speed of the target
int minDuration = (int)2.0;
int maxDuration = (int)4.0;
int rangeDuration = maxDuration - minDuration;
int actualDuration = (rand() % rangeDuration) + minDuration;
//即时Action
CCFiniteTimeAction* actionMove = CCMoveTo::create((float)actualDuration, ccp(0 - target->getContentSize().width/2,actualY));
CCFiniteTimeAction* actionMoveDone = CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished));
target->runAction(CCSequence::create(actionMove, actionMoveDone, NULL));
}
这里用callfuncN_selector(HelloWorld::spriteMoveFinished)回调了spriteMoveFinished方法,我们需要在HelloWorldScene.h里声明并如下来定义它,
/敌人移动结束
void HelloWorld::spriteMoveFinished(CCNode* sender)
{
CCSprite* sprite = (CCSprite *)sender;
this->removeChild(sprite, true);
}
要点
1. 关于随机函数。srand和rand是C标准库函数。对于每一个平台来说,你可以先获取毫秒级时间来得到一个随机数。在沃Phone上,这个函数是TimGetTickes(),而在iPhone上,你可以直接通过arc4random()函数来获得随机数。
2. Objc中的YES和NO,在cpp中变为true和false。
3. 回调函数,在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()函数的返回值前。
//定时加入敌人
this->schedule(schedule_selector(HelloWorld::gameLogic),1.0);
然后在HelloWorldScence.cpp里实现gameLogic()。请注意gameLogic()应该声明为pubilc,否则是无法回调的。
//定时加敌人
void HelloWorld::gameLogic(float dt)
{
this->addTarget();
}
cocos2d-x 1.x void HelloWorld::gameLogic(ccTime dt)
而cocos2d-x 2.x void HelloWorld::gameLogic(float dt)
太开心了,可以运行看结果了啊,好好看把,新手,大家多多指教!!