• Chapter 3


    http://www.eoeandroid.com/forum.php?mod=viewthread&tid=250529

    http://www.cocos2d-x.org/boards/6/topics/10055

    Chapter 3 - How to Move a sprite

    We have added a hero to the scene in the last chapter Chapter 2 - How to Add a sprite. But the hero is so lonely that we should add some enemies for him to beat down.
    The function void addTarget() will complete the work, the enemies will be added into the scene from right to left at random speed.

    Declare void addTarget() in HelloWorldScene.h and add the following code to HelloWorldScene.cpp, (and don't forget to add using namespace cocos2d; at the start of HelloWorldScene.cpp)

    1// cpp with cocos2d-x
     2void HelloWorld::addTarget()
     3{
     4    CCSprite *target = CCSprite::create("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::create( (float)actualDuration, 
    34        ccp(0 - target->getContentSize().width/2, actualY) );
    35    CCFiniteTimeAction* actionMoveDone = 
    36        CCCallFuncN::create( this, 
    37        callfuncN_selector(HelloWorld::spriteMoveFinished));
    38    target->runAction( CCSequence::create(actionMove, 
    39        actionMoveDone, NULL) );
    40}
    Here, callfuncN_selector(HelloWorld::spriteMoveFinished) backcalls the function spriteMoveFinished(), we need to declare it in the HelloWorldScene.h and define it as follows,
    1// cpp with cocos2d-x
    2void HelloWorld::spriteMoveFinished(CCNode* sender)
    3{
    4  CCSprite *sprite = (CCSprite *)sender;
    5  this->removeChild(sprite, true);
    6}

    TIPs:
    1. About rand function. srand and rand are c std function. For each platform, you could get the mili-second system time as sand to get a random number. On IPhone, you could get the random number by arc4random() directly
    2. The YES and NO in objc are true and false in cpp
    3. The callback function is selector:@selector(spriteMoveFinished) in objc, but it is a little complicated to implement in cpp, you could refer to the declarations in cocos2dxincludeselector_protocol.h. There are five different callback types:

    • schedule_selector
    • callfunc_selector
    • callfuncN_selector
    • callfuncND_selector
    • menu_selector

    How to use them is according to the callback function definition. For example, when use the function CCTimer::initWithTarget whose second parameter is a type of SEL_SCHEDULE, we could find its macro-definition schedule_selector(_SELECTOR) in selector_protocol.h, then we declare a callback function void MyClass::MyCallbackFuncName(float), and transform it as the second parameter of CCTimer::initWithTarget.

    Then, we should put the enemies into the scene at intervals, add the codes before init() function returns.

    1// cpp with cocos2d-x
    2// Call game logic about every second
    3this->schedule( schedule_selector(HelloWorld::gameLogic), 1.0 );

    and implement gameLogic() in HelloWorldScene.cpp. Notice that gameLogic() should be declared as public, otherwise it won't be backcalled.

    1// cpp with cocos2d-x
    2void HelloWorld::gameLogic(float dt)
    3{
    4    this->addTarget();
    5}

    Ok, everything is done, build and run, and enjoy your fruit.
    Win32

  • 相关阅读:
    【Python3 爬虫】U27_多线程爬虫之Queue线程安全队列
    【Python3 爬虫】U26_多线程爬虫之生产者与消费者模式
    【Python3 爬虫】U25_多线程爬虫之多线程共享全局变量及锁机制
    【Python3 爬虫】U24_多线程爬虫之Thread类创建多线程
    Verilog 加法器和减法器(1)
    逻辑门电路详解
    RV32C指令集
    RV32A/RV64A指令集
    RV32M/RV64M指令集
    Risc-V指令集中文文档
  • 原文地址:https://www.cnblogs.com/yssgyw/p/3224259.html
Copyright © 2020-2023  润新知