Search code examples
c++ioscocos2d-iphonecocos2d-xcocos2d-x-3.0

Sprite can not move in cocos2d-x


I am new on cocos2d-x, i followed Cocos2d-x Game Development Essentials Ebook and trying to make demo app in iOS. with the help of its guidance,but when i trying to Move Astroids in GameScreen.cpp file as written in book, they actually doesn't move and i can't understand what am i missing?

here is code that i used:

bool GameScene::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    //Add EVENT LISTENER TO HANDLE TOUCH EVENT,
    auto listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    listener->onTouchBegan      = CC_CALLBACK_2(GameScene::ontouchBegin,this);
    listener->onTouchMoved      = CC_CALLBACK_2(GameScene::ontouchMoved, this);
    listener->onTouchCancelled  = CC_CALLBACK_2(GameScene::ontouchCanceled, this);
    listener->onTouchEnded      = CC_CALLBACK_2(GameScene::ontouchEnded, this);
    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
    istouching = false;
    touchPosition = 0;

    visibleSize = Director::getInstance()->getVisibleSize();
    origin = Director::getInstance()->getVisibleOrigin();

    auto backgroundSprite = Sprite::create("Game_Screen_Background.png");
    backgroundSprite->setPosition(Point((visibleSize.width/2)+origin.x,(visibleSize.height/2)+origin.y));
    this->addChild(backgroundSprite, -1);

    auto pauseItem =
    MenuItemImage::create("Pause_Button.png","Pause_Button(Click).png",CC_CALLBACK_1(GameScene::PushToGamePauseScene, this));
    pauseItem->setPosition(Point(pauseItem->getContentSize().width-(pauseItem->getContentSize().width/4)+origin.x,visibleSize.height - pauseItem->getContentSize().height +(pauseItem->getContentSize().width / 4) + origin.y));
    auto menu = Menu::create(pauseItem, NULL);
    menu->setPosition(Point::ZERO);
    this->addChild(menu);
    for (int i = 0; i < 2; i ++){
        backgroundSpriteArray[i] = Sprite::create("Game_Screen_Background.png");
        backgroundSpriteArray[i]->setPosition(Point((visibleSize.width/2)+origin.x,(-1*visibleSize.height*i)+(visibleSize.height/2)+origin.y));
        this->addChild(backgroundSpriteArray[i],-2);
    }
    playerSprite = Sprite::create("Space_Pod.png");
    playerSprite->setPosition(Point(visibleSize.width/2,pauseItem->getPosition().y-(pauseItem->getContentSize().height/2)-(playerSprite->getContentSize().height/2)));
    this->addChild(playerSprite, 1);
    this->schedule(schedule_selector(GameScene::spawnAsteroid), 1.0);
this->scheduleUpdate();
    return true;
}

Following is update method

void GameScene::update(float dt){
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();
    for (int i = 0; i < 2; i ++){
        if (backgroundSpriteArray[i]->getPosition().y >=visibleSize.height + (visibleSize.height / 2) -1){
            backgroundSpriteArray[i]->setPosition(Point((visibleSize.width / 2) + origin.x, (-1 *visibleSize.height) + (visibleSize.height / 2)));
        }
    }
    for (int i = 0; i < 2; i ++){
        backgroundSpriteArray[i]->setPosition(Point(backgroundSpriteArray[i]->getPosition().x,backgroundSpriteArray[i]->getPosition().y + (0.75 *visibleSize.height * dt)));
    }
    for (int i = 0; i < asteroids.size(); i++){
        asteroids[i]->setPosition(Point(asteroids[i]->getPosition().x,asteroids[i]->getPosition().y+(0.75 * visibleSize.height * dt)));
        if (asteroids[i]->getPosition().y > visibleSize.height * 2){
            this->removeChild(asteroids[i]);
            asteroids.erase(asteroids.begin() + i);
        }
    }
    //check for Touching
    if(istouching == true){
        //now check, which side of the screen is being touched
        if(touchPosition < visibleSize.width /2){
            //now, move the space pod to left
            float positionX = playerSprite->getPosition().x;
            playerSprite->setPositionX(positionX - (0.50* visibleSize.width * dt));
            positionX = playerSprite->getPositionX();

            //prevent space pod to getting off the screen (left side)
            if(positionX <= 0+(playerSprite->getContentSize().width/2))
            {
                playerSprite->setPositionX(playerSprite->getContentSize().width / 2);
            }
        }
        else{
            //now, move the space pod to right
            float positionX = playerSprite->getPositionX();
            playerSprite->setPositionX(positionX + (0.50 * visibleSize.width *dt));
            positionX = playerSprite->getPositionX();

            // check to prevent the space pod from going off the screen (right side)
            if(positionX >= visibleSize.width-(playerSprite->getContentSize().width/2))
            {
                playerSprite->setPositionX(visibleSize.width-(playerSprite->getContentSize().width/2));
            }
        }
    }
}

For move astroid code:

void GameScene::spawnAsteroid(float dt){
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();
    int asteroidIndex = (arc4random() % 3) + 1;
    __String* asteroidString = __String::createWithFormat("Asteroid_%i.png",asteroidIndex);
    auto *tempAsteroid = Sprite::create(asteroidString->getCString());
    int xRandomPosition = (arc4random() % (int)(visibleSize.width - (tempAsteroid->getContentSize().width / 2))) + (tempAsteroid->getContentSize().width / 2);
    tempAsteroid->setPosition(Point(xRandomPosition + origin.x, -tempAsteroid->getContentSize().height +origin.y));
    asteroids.push_back(tempAsteroid);
    this->update(touchPosition);
    this->addChild(asteroids[asteroids.size() - 1], -1);

}

That method has been called at run time but don't know that my astroid object does not moved can anybody please help me for figure it out issue and how to fix it.

Edit

OK,i put this->scheduleUpdate() in init(),and starts moving astroids on the screen but when i move my sprite(not astroids) with touchBegin event the astroid got disappear from screen. please guide me on this.


Solution

  • please put this line in your init method

    this->scheduleUpdate();
    

    Hope it helps