1

我目前正在使用 C++ 和 SFML 1.6 在业余时间编写游戏。当是时候进行碰撞检测时,我遇到了一个烦人的错误,程序检测到碰撞,就好像对象被移动到左上角的量根据我使用的静止精灵的大小而不同测试这个,通常是它的一半大小。我似乎无法找到我的代码中的错误,但也许你可以。我的代码在下面列出,在此先感谢。

#include <SFML/Graphics.hpp>
#include <math.h>

bool collide_rec(sf::Sprite object_1, sf::Sprite object_2);
bool collide_point(sf::Vector2f point, sf::Sprite object);
void collide(sf::Sprite& movable, object& movable_data, sf::Sprite& sationary);

void collide(sf::Sprite& movable, object& movable_data, sf::Sprite& stationary)
{
//Handle Collision NOTE: Results in infinate loop if started on colliding object
for(;collide_rec(movable, stationary);)
{
if((movable_data.move.spd.x<0)||(movable_data.move.left==true||movable_data.direction==LEFT )) movable.Move( 1, 0);
if((movable_data.move.spd.x>0)||(movable_data.move.right==true||movable_data.direction==RIGHT)) movable.Move(-1, 0);
if((movable_data.move.spd.y<0)||(movable_data.move.up   ==true||movable_data.direction==UP   )) movable.Move(0,  1);
if((movable_data.move.spd.y>0)||(movable_data.move.down ==true||movable_data.direction==DOWN )) movable.Move(0, -1);
  }
}

bool collide_point(sf::Vector2f point, sf::Sprite object)
{

}

bool collide_rec(sf::Sprite object_1, sf::Sprite object_2)
{
  bool hit=true;
  sf::Vector2f tl_1, br_1, tl_2, br_2;//Top-Left Coner, Botom Right Corner

  //Assign the corners proporly
  tl_1= object_1.GetPosition();
  tl_2= object_2.GetPosition();

   br_1= (object_1.GetPosition()+object_1.GetSize());
   br_2= (object_2.GetPosition()+object_2.GetSize());

  if((tl_1.x<tl_2.x)&&(br_1.x<tl_2.x) || (tl_1.x<br_2.x)&&(br_1.x<br_2.x)) //if both points are to the left or right on the x demtion
  hit=false;

  if((tl_1.y<tl_2.y)&&(br_1.y<tl_2.y) || (tl_1.y<br_2.y)&&(br_1.y<br_2.y)) //if both points are to the left or right on the y demtion
  hit=false;

  return hit;
}
4

1 回答 1

0

不确定您是否仍然需要对此的答案,但我不妨尝试提供帮助。

您可能需要检查几件事: - object_1.getPosition() 和 object_2 的位置是否是对象的左上角。- 如果对象不是正方形,则右下角将需要稍微不同的方程来计算。(x, y) 坐标为 (Pos.x + Width, Pos.y + Height)。

一旦你确定了这一点,我在你的命中检测算法中注意到了几件事:

1)

if((tl_1.x<tl_2.x)&&(br_1.x<tl_2.x) || (tl_1.x<br_2.x)&&(br_1.x<br_2.x))

这个条件的第二部分:

(tl_1.x < br_2.x)&&(br_1.x < br_2.x))

似乎应该是

(tl_1.x > br_2.x)&&(br_1.x > br_2.x))

2)

同样地:

(tl_1.y < tl_2.y)&&(br_1.y < tl_2.y) 

似乎应该是

(tl_1.y > tl_2.y)&&(br_1.y > tl_2.y)

3)

最后,您的条件对它们有一定的冗余,这是不需要的。

一旦你有了 topLeft1、BottomRight1 和 topLeft2、BottomRight2,你可以像这样简单地检查碰撞:

假设笛卡尔坐标系,原点 (0, 0) 位于左下角。

  • X阶段碰撞:

    if ( topLeft1.x > BottomRight2.x || BottomRight1.x < TopLeft2.x )

// 如果 box1 的左侧 > box2 的右侧 OR // 如果 box1 的右侧 < box2 的左侧 那么 - 盒子不会在 X 轴上发生碰撞。

  • Y阶段碰撞:

    if ( topLeft1.y < BottomRight2.y || BottomRight1.y > TopLeft2.y )

// 如果 box1 的顶边 < box2 的底边 OR // 如果 box1 的底边 > box2 的顶边 那么 - 盒子不会在 Y 轴上发生碰撞。

这将其从 8 个条件减少到 4 个。希望有所帮助。

于 2012-10-30T04:37:43.967 回答