我正在制作一个 2D 游戏,没有什么花哨的,它的对象(从现在开始称为实体)应该与彼此和地形发生碰撞。现在,检测碰撞不是问题,问题是实体何时与地形发生碰撞。
我有一个简单的 .png,在加载游戏时,我会检查该图像的所有像素并将所有黑色像素添加到列表中,这些是可碰撞的像素。
来自实体类的碰撞代码:
int ceiling = Integer.MAX_VALUE;
int floor = 0;
int rightPoint = 0;
int leftPoint = Integer.MAX_VALUE;
for(Point p : main.terrain.points)
if(getHypoRect().contains(p))
{
if(p.x > rightPoint && right)
rightPoint = p.x;
if(p.x < leftPoint && left)
leftPoint = p.x;
if(p.y < ceiling && up)
ceiling = p.y;
if(p.y > floor && down)
floor = p.y;
}
if(rightPoint != 0)
xCoord = rightPoint - sprite.getImage().getWidth();
else if(right)
xCoord+=speed;
if(leftPoint != Integer.MAX_VALUE)
xCoord = leftPoint;
else if(left)
xCoord-=speed;
if(ceiling != Integer.MAX_VALUE)
yCoord = ceiling;
else if(up)
yCoord-=speed;
if(floor != 0)
yCoord = floor - sprite.getImage().getHeight();
else if(down)
yCoord+=speed;
在 for 循环中,我遍历地形中的所有点(黑色像素),然后检查实体的碰撞框是否包含它们(在此方法中添加了速度,或者更确切地说是“假设”添加,这就是它具有奇怪名称的原因)。现在,如果该点的 x 值大于“右点”,并且实体向右走,则将其覆盖。leftPoint(“最左”点)、天花板和地板也是如此。然后我检查这些点中是否有任何改变,如果有,这意味着我们与地形相撞,所以我们将它们反弹回来。例如,假设实体向右走并且我们与地形相撞,rightPoint 已被写为“最右边”
如果一个人一次只朝一个方向前进,这将非常有效,但是当您考虑多个输入时会发生“奇怪”的事情。
示例:实体走平到地板上,走向右侧的窗台,当实体在窗台上的一半时,它想往下走,所以向右和向下都被按下,我的代码将做的是检查输入,将实体放在它想要的位置,然后在它撞到地形时将其弹回,所以它会看到我按下右并将实体弹回壁架的末端。
这是我对地形碰撞如何工作的全部想法,除了如何检查是否发生碰撞之外,我在网上找不到任何东西,但没有任何内容涵盖这一点。知道什么可以使我的解决方案起作用,或者指出应该如何进行地形碰撞?