Cocos2D-X SimpleGame 如何移动一个cocos2d-x精灵 (2) ----版本cocos2d-2.0-x-2.0.3 .

 

       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)

 

太开心了,可以运行看结果了啊,好好看把,新手,大家多多指教!!

Cocos2D-X SimpleGame 如何移动一个cocos2d-x精灵 (2) ----版本cocos2d-2.0-x-2.0.3 ._第1张图片

你可能感兴趣的:(Cocos2D-X SimpleGame 如何移动一个cocos2d-x精灵 (2) ----版本cocos2d-2.0-x-2.0.3 .)