私は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"機能によって?
これを解決することは可能ですか?または私は何か間違っているのですか?私たちは、単に各スプライトにスケジューラを追加し、ベクトルが時代遅れになるだろう
...私は誰かがあなたを提供する可能性があり、簡単な解決策を見つけた...