Synchronize functions in Cocos2d-x?

102 Views Asked by At

I use cocos2d-x-3.13...

I'm just starting out but I've had problems with something: I have a number of sprites in a vector and every second I move them to each position, the problem arises when I want to delete them, since I have a function that moves them With a loop:

HelloWorldScene.cpp

bool HelloWorld::init() {
   ...
   _enemies.reserve(15);
   for (unsigned i = 0; i < 5; i++) {
       //Here I create the sprites, and I activate the physics in each one :p
       _enemies.push_back(sprite);
   }
   ...
   /*
   This event checks for each collision, what I do is find the sprite 
   in my vector and then delete the sprite with "removeFromParent ()", 
   then delete the sprite from my vector. it's good, no? :v
   */
   auto contactListener = EventListenerPhysicsContact::create();

   contactListener->onContactBegin = [=](PhysicsContact &contact) {
    auto a = contact.getShapeA()->getBody(); //bullet
    auto b = contact.getShapeB()->getBody(); //enemy

    if (a->getCollisionBitmask() == 2 && b->getCollisionBitmask() == 2) {
        a->getNode()->removeFromParent();

        auto f = std::find(_enemies.begin(), _enemies.end(), ((cocos2d::Sprite*)b->getNode()));
        if (f != _enemies.end()) {
            _enemies.at(std::distance(_enemies.begin(), f))->removeFromParent();
            _enemies.erase(f);
        }
    }
    return true;
  };

   this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener, this);
   ...
   this->schedule(schedule_selector(HelloWorld::moveEnemies), 1.0f);
   ...
}

void HelloWorld::moveEnemies(float f) {
  for (unsigned i = 0; i < _enemies.size(); i++) 
        {
            cocos2d::Vec2 pos = _enemies.at(i)->getPosition(); //This line throws the exception
            _enemies.at(i)->setPosition(pos.x + 5, pos.y);
        }       
}

I have an event that when I press a key, creates a sprite and if it collides with one of the enemies just disappears, everything is fine here, very simple, but when you put the "moveEnemies" function and the sheduler everything is complicated. .. by shooting at one of the enemies quickly throws me an exception (Visual Studio 2015):

"Access violation when reading location 0xDDDDDE35"

I think this occurs because is the vector manipulated at the same time by the event and the "moveEnemies" function?

Is it possible to solve this? Or am I doing something wrong? I would appreciate anyone guiding me ...

1

There are 1 best solutions below

0
On

I found a simple solution, it is possible that someone will serve you ...

We simply add a scheduler to each sprite and the vector would become obsolete.

auto enemy = cocos2d::Sprite::createWithSpriteFrameName("x.png");
enemy->setPosition(x, y);
enemy->setScale(0.5, 0.5);
//bla bla bla...
enemy->schedule([enemy](float x) {
    //Code
    auto pos = enemy->getPosition();
    enemy->setPosition(pos.x + 10, pos.y);
}, 2.0f, "tag");

It is assumed that deleting the sprite in the event would eliminate the scheduler ...