Синхронизировать функции в 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»?

Возможно ли это решить? Или я что-то не так делаю? Я был бы признателен всем, кто направляет меня …

1

Решение

Я нашел простое решение, возможно, что кто-то будет вам служить …

Мы просто добавляем планировщик к каждому спрайту, и вектор станет устаревшим.

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

Предполагается, что удаление спрайта в событии приведет к удалению планировщика …

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector