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 回答