SFML 1.6碰撞问题

时间:2012-10-03 04:21:45

标签: debugging collision-detection sfml

我目前正在使用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;
}

1 个答案:

答案 0 :(得分: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&gt; BottomRight2.x || BottomRight1.x&lt; TopLeft2.x)

//如果box1的左侧&gt; box2的右侧或 //如果box1的右侧&lt; box2的左侧 然后 - 的方框在X轴上碰撞。

  • Y Stage Collision:

    if(topLeft1.y&lt; BottomRight2.y || BottomRight1.y&gt; TopLeft2.y)

//如果box1的顶部&lt; box2 OR的底部 //如果box1的底部&gt; box2的顶部 然后 - 没有的方框在Y轴上碰撞。

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