0

私はsfml 2.0ライブラリを使用するスネークのoopバージョンに取り組んでおり、衝突を処理するための別のクラスがあります。コードは次のとおりです。

「collision.hpp」を含める

bool sfc::Sprite::collision(sfc::Sprite sprite2) {
  this->setBounds();
  sprite2.setBounds();

  if (top > sprite2.bottom ||  bottom < sprite2.top ||  left > sprite2.right ||  right < sprite2.left) {
    return false;
  }

  return true;
}

void sfc::Sprite::colMove(sf::Vector2f &movement, sfc::Sprite sprite2) {
  if (!this->collision(sprite2)) {
    this->move(movement);
  }
}

void sfc::Sprite::colMove(float x, float y, sfc::Sprite sprite2) {
  if (!this->collision(sprite2)) {
    this->move(x, y);
  }
}

void sfc::Sprite::setBounds() {
  top = this->getPosition().y;
  bottom = this->getPosition().y + this->getTexture()->getSize().y;
  left = this->getPosition().x;
  right = this->getPosition().x + this->getTexture()->getSize().y;
}

唯一の問題は、衝突イベントが発生すると、スプライトがウィンドウの残りの寿命の間動かなくなることです。その衝突でそこに固執しないようにするにはどうすればよいですか。ありがとう!〜マイケル

編集:衝突が発生した後にスプライトが移動できないことは理解していますが、衝突後にスプライトが移動するのを止める他の方法はわかりません。

4

1 に答える 1

2

あなたの問題は、スプライトが sprite2 と衝突すると、もう動けないことです。衝突を検出した場合は、動きを以前の x と y に戻してみてください。または、移動する場所が空いているかどうかを確認します。

 bool sfc::Sprite::collision(sfc::Sprite sprite2, float x, float y) {
  this->setBounds();
  sprite2.setBounds();

  if (top > sprite2.bottom + y ||  bottom < sprite2.top - y ||  left > sprite2.right +x||  right < sprite2.left - y ) {
    return false;
  }

  return true;
}

それは衝突のためであり、その後

void sfc::Sprite::colMove(float x, float y, sfc::Sprite sprite2) {
  if (!this->collision(sprite2, x, y)) {
    this->move(x, y);
  }
}

注: sfml で使用される座標系を正しく覚えていないので、+ と - を確認してください。

于 2013-09-22T01:48:45.313 に答える