突围碰撞:检测碰撞的一面


10

我正在写一个突破性的克隆游戏(我的第一场比赛),我完全不知道该如何打砖头。

我有一个碰撞检测方法,如下所示:

DetectCollision(Object a, Object b)

   x = distance(a.x, b.x);
   y = distance(a.y, b.y);

   if (x is smaller than the combined width &  y is smaller is than combined height {
       return true;
   }
return false;  

这完全可以正常工作,但是我需要知道碰撞的一面以及相对于中心的位置,以便正确响应。

过去几天我一直在偷看,但迷路了。

Answers:


13

所有这些都可以从球的位置相对于与之碰撞的砖块的位置收集。

检测到碰撞后:

if(ballPosition.y <= brickPosition.y - (brickHeight/2))
  //Hit was from below the brick

if(ballPosition.y >= brickPosition.y + (brickHeight/2))
  //Hit was from above the brick

if(ballPostion.x < brickPosition.x)
  //Hit was on left

if(ballPostion.x > brickPosition.x)
  //Hit was on right

前两个检查球是否在砖的上方或下方。如果两个都必须在砖块旁边,那么请检查砖块的哪一侧。这将需要进行调整以适合您从中获取位置的位置,例如,BrickPosition是砖的中心,而brickPosition是左上角。


1
但是您将如何使用它来重新定位播放器,因为播放器移动到了砖块内部,因此将满足多个条件,并且如果将所需的x重置到墙的边缘(例如,如果它击中了键)的砖将所需的x恰好设置在墙的旁边,那么它将无法真正工作,因为当您检查角色的理论位置以查看其碰撞的方向时,将满足多个条件,那么您将如何使用此按钮重置播放器,是否需要在每个if末尾添加else?
bluejayke18年

据我所知,突破型游戏中的“玩家”是桨。球拍不会在砖块内移动,也不会根据球与砖块的相互作用来更改球拍的位置。如果这是您正在执行的操作,则不需要其他逻辑,只需要在完成所有碰撞检查之后才处理重新定位。或在其中一项检查为真时返回。
MichaelHouse

8

您可以使用Vector Math来发现它们之间的角度!

这是一个简短的答案:

ballToBrick = ballPosition - brickPosition;
ballToBrick.Normalize();
brickFacing = Vector2(0,1).Normalize();


float angle = acos( Dot(ballToBrick, brickFacing) );

面砖是一个棘手的向量,它是角度计算的“起点”。如果要使向量指向上方,则使其(0,1),指向左(-1,0),指向右(1,0),指向下(0,-1)。假设您位于OpenGL轴上,其中上和右为正。

如果您不知道,这是使用的每个函数的定义:

Vector2.Normalize()
{
    float length = squareroot(x * x + y * y);
    x = x / length;
    y = y / length;
    return this;
}

Dot(Vector2 a, Vector2 b)
{
    return a.x * b.x + a.y * b.y;
}

https://en.wikipedia.org/wiki/Dot_product

参考:http//blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.