私は小惑星が画面の下に落ちたC++とsfmlのゲームで作業しています。プレーヤーはそれらを破壊するためにレーザーを撃ちます。小惑星やレーザーが画面の外に行くとき、彼らは削除され、それぞれのstd ::ベクトルから消去されます。ポインタを実行するとC++アクセス違反が発生する
小惑星:
std::vector<Asteroid*>::iterator it;
for (it = asteroids.begin(); it < asteroids.end();) {
(*it)->update(dt);
if ((*it)->getPosition().y > Game::window.getSize().y) {
delete * it;
asteroids.erase(it);
}
else {
it++;
}
}
レーザー:
はfor (int i = 0; i < lasers.size(); i++) {
lasers.at(i)->update(dt);
if (lasers.at(i)->getPosition().y < 0) {
delete lasers.at(i);
lasers.erase(lasers.begin() + i);
i--;
}
}
問題が来ます私はそれらの間の衝突を検出しようとします。私はレーザーの各インスタンスですべての小惑星をループし、親クラスGameObjectのメソッドを使ってそれらの衝突をチェックします。私はこの上でいくつかの時間を費やしてきたと私は見えることはできません
bool GameObject::isColliding(GameObject * g) {
sf::Vector2f gPos = g->getPosition();
sf::Vector2f pos = this->getPosition(); // after waiting a few seconds and then testing the collision, I get this error here: Access violation executing location 0x00000000.
if (gPos.x <= pos.x && pos.x <= gPos.x + g->width
|| pos.x <= gPos.x && gPos.x <= pos.x + width) {
if (gPos.y <= pos.y && pos.y <= gPos.y + g->height
|| pos.y <= gPos.y && gPos.y <= pos.y + height) {
return true;
}
}
return false;
}
sf::Vector2f GameObject::getPosition() {
if (isLoaded) {
if (animated)
return animatedSprite.getPosition();
else
return sprite.getPosition(); // the asteroids are not animated, so this will be called.
}
}
:
for (int i = 0; i < Game::spawner->asteroids.size() - 1; i++) {
if (isColliding(asteroids.at(0))) { // Access violation executing location 0x071DE528.
printf("collided");
//delete asteroids.at(i);
//asteroids.erase(asteroids.begin() + i);
break;
}
}
はここisCollidingとgetPosition方法であり、何が起こっているのか把握する。私はポインタとそのインデックスを安全に削除していると思うので、そこからどこに行くのかわかりません。参考までに、isColliding関数は、2つの異なるGameObject(プレーヤーと小惑星)で動作します。問題は何とかすべての小惑星のループに関連しているようです。
ありがとうございました。
小惑星削除UPDATED:あなたは小惑星を通過し、それらを削除するには、イテレータを使用している
int toDelete = -1;
for (int i = 0; i < asteroids.size(); i++) {
asteroids.at(i)->update(dt);
if (asteroids.at(i)->getPosition().y > Game::window.getSize().y) {
toDelete = i;
}
}
if (toDelete != -1) {
delete asteroids.at(toDelete);
asteroids.erase(asteroids.begin() + toDelete);
}
このようなベクトルを反復処理することはできません。また、その上に 'erase'を呼び出します。 –
'asteroids'が空の場合、' i asteroids.size() - 1'は真です! –
aschepler