繁体   English   中英

在Cocos2d-x中同步功能?

[英]Synchronize functions in Cocos2d-x?

我用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”函数同时操纵了矢量?

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

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

我们只是为每个sprite添加一个调度程序,该向量将变得过时。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM