我使用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”功能同时操纵了矢量?
有可能解决这个问题吗?或者我做错了什么?我很感激有人指导我...
答案 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");
假设在事件中删除精灵会消除调度程序......