我正在制作一个 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 值大于“rightpoint”,并且实体向右行走,则它会被覆盖。同样的情况也发生在 leftPoint(“最左边”点)、ceiling 和 Floor 上。 然后我检查这些点是否已更改,如果有,则意味着我们与地形发生了碰撞,因此我们将它们反弹回来。例如,假设实体向右行走并且我们与地形发生碰撞,rightPoint 已写为我们碰撞的“最右”点,因此我们设置坐标,使实体位于它碰撞点的右侧.
如果一次只朝一个方向前进,这会完美地工作,但是当您考虑多个输入时,就会发生“奇怪”的事情。
示例:实体行走,平放在地板上,走向右侧的壁架,当实体走到壁架的一半时,它想要向下走,所以向右和向下都被按下,我的代码要做的是检查输入,将实体放在它想要的位置,然后如果它击中地形,则将其弹回,因此它会看到我按下右侧并将实体弹回到壁架的末端。
这都是我自己对地形碰撞如何工作的想法,除了如何检查是否发生碰撞之外,我在网上找不到任何内容,但没有任何内容涵盖这一点。 知道什么可以让我的解决方案发挥作用,或者指导如何完成地形碰撞?
最佳答案
你的反弹想法可能有问题。尝试忽略会与地形发生碰撞的移动:
如果玩家向下和向右移动,则首先检查向下是否会发生碰撞,如果是,则忽略该移动,并检查向右,如果可以向右移动,则向右移动,否则也阻止。
关于java - 需要有关碰撞处理的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14799307/