2016-12-31 9 views
1

私はcocos2d-x-3.13を使用しています...Cocos2d-xの機能を同期させますか?

私はまだ始まっていますが、何か問題を抱えていました。ベクトルに数多くのスプライトがあり、毎秒、

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"機能によって?

これを解決することは可能ですか?または私は何か間違っているのですか?私たちは、単に各スプライトにスケジューラを追加し、ベクトルが時代遅れになるだろう

...私は誰かがあなたを提供する可能性があり、簡単な解決策を見つけた...

答えて

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

...

イベントでスプライトを削除すると、スケジューラを排除することが想定されます
関連する問題