【问题标题】:SFML 2.0 Collision classSFML 2.0 碰撞类
【发布时间】:2013-09-22 01:39:25
【问题描述】:

我一直在使用 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;
}

唯一的问题是一旦发生碰撞事件,精灵就会在窗口的剩余生命周期中被卡住。我怎样才能得到它,以便在碰撞时它不会粘在那里。谢谢! 〜迈克尔

编辑:我知道在碰撞发生后不允许精灵移动,但我不知道在碰撞后阻止精灵移动的任何其他方法。

【问题讨论】:

    标签: c++ collision-detection sfml


    【解决方案1】:

    你的问题是,一旦你的精灵与你的 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 使用的坐标系,所以检查 + 和 -

    【讨论】:

    • 不幸的是,这不起作用。我知道我的精灵在碰撞后不允许移动,但您在上面发布的代码只会在碰撞发生之前改变两个精灵之间的距离。
    • 哦,我明白了。我不太记得 smfl,但我希望它对你有一点帮助
    • 感谢您的回答!我很感激:)
    猜你喜欢
    • 2013-08-22
    • 2014-02-28
    • 2012-09-23
    • 2018-09-18
    • 2017-07-25
    • 1970-01-01
    • 2015-03-03
    • 2015-02-01
    • 2018-06-11
    相关资源
    最近更新 更多