我一直在研究一个oop版本的snake使用sfml 2.0库,我有一个单独的类来处理碰撞。这是代码:
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;
}
唯一的问题是一旦发生碰撞事件,精灵就会在剩余的窗口生命中停留。我怎样才能得到它,以便在那次碰撞中它不会粘在那里。谢谢! 〜迈克尔
编辑:我知道在碰撞发生后不允许精灵移动,但我不知道在碰撞后停止精灵移动的任何其他方法。
答案 0 :(得分:2)
你的问题是,一旦你的精灵与你的精灵2碰撞,它就不能再移动了。如果检测到碰撞,您可以尝试将移动恢复到前一个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使用的坐标系,所以检查+和 -