在Cocos2d-x中同步功能?

时间:2016-12-31 01:45:14

标签: c++ synchronization cocos2d-x-3.0 2d-games

我使用cocos2d-x-3.13 ......

我刚刚开始,但我遇到了一些问题:我在矢量中有一些精灵,每一秒我都将它们移动到每个位置,当我想删除它们时出现问题,因为我有一个用循环移动它们的函数:

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);
        }       
}

我有一个事件,当我按下一个键,创建一个精灵,如果它与其中一个敌人发生碰撞就消失了,这里的一切都很好,非常简单,但当你把“moveEnemies”功能和sheduler一切都搞定了很复杂。 ..通过射击其中一个敌人迅速抛出异常(Visual Studio 2015):

  

“读取位置0xDDDDDE35时访问冲突”

我认为这是因为事件和“moveEnemies”功能同时操纵了矢量?

有可能解决这个问题吗?或者我做错了什么?我很感激有人指导我...

1 个答案:

答案 0 :(得分:0)

我找到了一个简单的解决方案,有人可能会为你服务......

我们只是为每个精灵添加一个调度程序,矢量就会过时。

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");

假设在事件中删除精灵会消除调度程序......