检测碰撞方向

时间:2011-02-21 05:58:07

标签: collision-detection

方形图块与另一个方形图块碰撞。酒保说......

我有:

  • 两个瓷砖的高度,宽度,x和y。
  • 导致碰撞的运动的2D矢量。

我需要知道发生碰撞的情况(例如,顶部,底部,左侧,右侧),以便适当地重置位置。

我会给那些能回答这个问题的人一个精神上的傻瓜,因为我已经尝试了太多时间,这似乎是根本。

5 个答案:

答案 0 :(得分:17)

float player_bottom = player.get_y() + player.get_height();
float tiles_bottom = tiles.get_y() + tiles.get_height();
float player_right = player.get_x() + player.get_width();
float tiles_right = tiles.get_x() + tiles.get_width();

float b_collision = tiles_bottom - player.get_y();
float t_collision = player_bottom - tiles.get_y();
float l_collision = player_right - tiles.get_x();
float r_collision = tiles_right - player.get_x();

if (t_collision < b_collision && t_collision < l_collision && t_collision < r_collision )
{                           
//Top collision
}
if (b_collision < t_collision && b_collision < l_collision && b_collision < r_collision)                        
{
//bottom collision
}
if (l_collision < r_collision && l_collision < t_collision && l_collision < b_collision)
{
//Left collision
}
if (r_collision < l_collision && r_collision < t_collision && r_collision < b_collision )
{
//Right collision
}

当对象在另一个内部时,这并不能解决。但它确实适用于重叠

答案 1 :(得分:2)

给定r1和r2(r2静止),首先找到r2到r1的最近角。 这一点是(c1.x,c1.y),想象一下你现在把它扩展到两个平面,一个平行于x轴,一个平行于y。

现在将r1的最近一角转到r2(称之为c2)并在下面的公式中使用它 y = mx + b 其中b是c2.x 而m是你的向量。 而x是c1.x

因此,如果y大于c1.y,那么它意味着在x接触点(宽度)处你已经达到顶部。如果它少了,那么你还没有打到它。 倒置底部/顶部。

答案 2 :(得分:1)

假设您有办法检测碰撞,了解哪些侧面碰撞是直截了当的。您只需要检查每个方块的xy位置。

Square1:(x1, y1)
Square2:(x2, y2)

我假设工作区域的左上角为(0,0),并且当您向右移动时x值会增加,并且y值会增加你往下走。

考虑到这一点:

  

如果(x1 x2),则方形1的左侧与方形2的右侧碰撞   如果(y1 y2),方形1的顶边与方形2的底边相撞

我建议你自己画一些照片,这一点应该很清楚。

答案 3 :(得分:1)

  if(player.y <= wall.y + wall.height && player.y > wall.y || player.y + player.height  <= wall.y+wall.height && player.y + player.height > wall.y){
            if(player.x -2< wall.x + wall.width && player.x > wall.x){
                leftspeed = 0
            }else if(player.x + player.width +2 > wall.x && player.x + player.width < wall.x + wall.width){
                rightspeed = 0
            }
        }

        if(player.x <= wall.x + wall.width && player.x > wall.x || player.x + player.width  <= wall.x+wall.width && player.x + player.width > wall.x){
            if(player.y -2 < wall.y + wall.height && player.y > wall.y){
                upspeed = 0
            }else  if(player.y + player.height +2> wall.y && player.y + player.height < wall.y + wall.height){
                downspeed = 0
            }
        }

这应该可以工作,您要删除的所有内容周围都有2像素的边距

答案 4 :(得分:0)

你必须对方形进行建模以捕捉方向,只需要方形的(x,y,高度),方向我的意思是它是否在第四象限的第一,第二,第三,可以通过建模所有四个角方形的顶点。

然后你需要确定,使这个正方形的所有四个向量

在方形的每一边找到2D矢量之间的余弦 例如,如果给定边和2D矢量的余弦是1,那么两者都是正交的,或者0是垂直的,任何其他值都会介于其间

或任何其他矢量代数诀窍如何确定/定义碰撞!