方形图块与另一个方形图块碰撞。酒保说......
我有:
我需要知道发生碰撞的情况(例如,顶部,底部,左侧,右侧),以便适当地重置位置。
我会给那些能回答这个问题的人一个精神上的傻瓜,因为我已经尝试了太多时间,这似乎是根本。
答案 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)
假设您有办法检测碰撞,了解哪些侧面碰撞是直截了当的。您只需要检查每个方块的x
和y
位置。
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是垂直的,任何其他值都会介于其间
或任何其他矢量代数诀窍如何确定/定义碰撞!