如何移动一个cocos2d-x精灵 之三

来源:互联网 发布:加入网络水军 编辑:程序博客网 时间:2024/05/01 21:39

如何移动一个cocos2d-x精灵

在前一章中我们介绍了如何添加一个cocos2d-x精灵中,为游戏场景添加了一个精灵。但一个英雄或许太过孤单,我们应该加入一些敌人,让他来打败。本文我们将讲述如何移动一个cocos2d-x精灵。


    void addTarget()函数将会帮我们完成这一工作,敌人将会以随机的速度,从游戏场景左移动到右。

    在HelloWorldScence.h里声明void addTarget(),并在HelloWorldScene.cpp里添加以下的代码,(请不要忘记在HelloWorldScene.cpp的开头加入using namespace cocos2d)

    1// CPP with cocos2d-x

    2void HelloWorld::addTarget()

    3{

    4 CCSprite *target = CCSprite::spriteWithFile("Target.png",

    5 CCRectMake(0,0,27,40) );

    6

    7 // Determine where to spawn the target along the Y axis

    8 CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    9 int minY = target->getContentSize().height/2;

    10 int maxY = winSize.height

    11 - target->getContentSize().height/2;

    12 int rangeY = maxY - minY;

    13 // srand( TimGetTicks() );

    14 int actualY = ( rand() % rangeY ) + minY;

    15

    16 // Create the target slightly off-screen along the right edge,

    17 // and along a random position along the Y axis as calculated

    18 target->setPosition(

    19 ccp(winSize.width + (target->getContentSize().width/2),

    20 actualY) );

    21 this->addChild(target);

    22

    23 // Determine speed of the target

    24 int minDuration = (int)2.0;

    25 int maxDuration = (int)4.0;

    26 int rangeDuration = maxDuration - minDuration;

    27 // srand( TimGetTicks() );

    28 int actualDuration = ( rand() % rangeDuration )

    29 + minDuration;

    30

    31 // Create the actions

    32 CCFiniteTimeAction* actionMove =

    33 CCMoveTo::actionWithDuration( (ccTime)actualDuration,

    34 ccp(0 - target->getContentSize().width/2, actualY) );

    35 CCFiniteTimeAction* actionMoveDone =

    36 CCCallFuncN::actionWithTarget( this,

    37 callfuncN_selector(HelloWorld::spriteMoveFinished));

    38 target->runAction( CCSequence::actions(actionMove,

    39 actionMoveDone, NULL) );

    40}

    1// objcwith cocos2d-iphone

    2-(void)addTarget

    3{

    4 CCSprite *target = [CCSprite spriteWithFile:@"Target.png"

    5 rect:CGRectMake(0, 0, 27, 40)];

    6

    7 // Determine where to spawn the target along the Y axis

    8 CGSize winSize = [[CCDirector sharedDirector] winSize];

    9 int minY = target.contentSize.height/2;

    10 int maxY = winSize.height - target.contentSize.height/2;

    11 int rangeY = maxY - minY;

    12

    13 int actualY = (arc4random() % rangeY) + minY;

    14

    15 // Create the target slightly off-screen along the right edge,

    16 // and along a random position along the Y axis as calculated

    17 target.position =

    18 ccp(winSize.width + (target.contentSize.width/2),

    19 actualY);

    20 [self addChild:target];

    21

    22 // Determine speed of the target

    23 int minDuration = 2.0;

    24 int maxDuration = 4.0;

    25 int rangeDuration = maxDuration - minDuration;

    26

    27 int actualDuration = (arc4random() % rangeDuration)

    28 + minDuration;

    29

    30 // Create the actions

    31 id actionMove =

    32 [CCMoveTo actionWithDuration:actualDuration

    33 position:ccp(-target.contentSize.width/2, actualY)];

    34 id actionMoveDone =

    35 [CCCallFuncN actionWithTarget:self

    36 selector:@selector(spriteMoveFinished:)];

    37 [target runAction:[CCSequence actions:actionMove,

    38 actionMoveDone, nil]];

    39}

    这里用callfuncN_selector(HelloWorld::spriteMoveFinished)回调了spriteMoveFinished方法,我们需要在HelloWorldScene.h里声明并如下来定义它,

    1// CPP with cocos2d-x

    2void HelloWorld::spriteMoveFinished(CCNode* sender)

    3{

    4 CCSprite *sprite = (CCSprite *)sender;

    5 this->removeChild(sprite, true);

    6}

    1// Objcwith cocos2d-iphone

    2-(void)spriteMoveFinished:(id)sender

    3{

    4 CCSprite *sprite = (CCSprite *)sender;

    5 [self removeChild:sprite cleanup:YES];

    6}

    要点

    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()函数的返回值前。

    1// cpp with cocos2d-x

    2// Call game logic about every second

    3this->schedule( schedule_selector(HelloWorld::gameLogic), 1.0 );

    1// objc with cocos2d-iphone

    2// Call game logic about every second

    3[self schedule:@selector(gameLogic:) interval:1.0];

    然后在HelloWorldScence.cpp里实现gameLogic()。请注意gameLogic()应该声明为pubilc,否则是无法回调的。

    1// cpp with cocos2d-x

    2void HelloWorld::gameLogic(ccTime dt)

    3{

    4 this->addTarget();

    5}

    1// objc with cocos2d-iphone

    2-(void)gameLogic:(ccTime)dt

    3{

    4 [self addTarget];

    5}

    好了,所有事情都做完了,编译并运行,好好享用你的成果。

    iPhone

    Android

    沃Phone

    Win32

    原创粉丝点击