Java 需要关于碰撞处理的建议吗

Java 需要关于碰撞处理的建议吗,java,2d,user-input,collision,terrain,Java,2d,User Input,Collision,Terrain,我正在制作一个2D游戏,没有什么特别的,有一些物体(从现在起称为实体)应该相互碰撞,并且与地形发生碰撞。现在,检测碰撞不是问题,问题是当实体与地形碰撞时 我有一个简单的.png,在加载游戏时,我检查了这个图像的所有像素,并将所有黑色像素添加到一个列表中,这些像素是可碰撞的 实体类中的冲突代码: int ceiling = Integer.MAX_VALUE; int floor = 0; int rightPoint = 0; int leftPoint = In

我正在制作一个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;
int-ceiling=Integer.MAX\u值;
int地板=0;
int rightPoint=0;
int leftPoint=Integer.MAX_值;
用于(点p:主地形点)
if(gethyperect().contains(p))
{
如果(p.x>rightPoint&&right)
右点=p.x;
如果(p.x地板和地板下)
地板=每年;
}
如果(右点!=0)
xCoord=rightPoint-sprite.getImage().getWidth();
否则,如果(右)
xCoord+=速度;
if(leftPoint!=Integer.MAX_值)
xCoord=左点;
else if(左)
xCoord-=速度;
if(上限!=整数最大值)
yCoord=天花板;
否则,如果(向上)
yCoord-=速度;
如果(楼层!=0)
yCoord=floor-sprite.getImage().getHeight();
否则,如果(向下)
yCoord+=速度;
在for循环中,我遍历地形中的所有点(黑色像素),然后检查实体的collisionbox是否包含这些点(速度是在这个方法中添加的,或者更确切地说是“假设”添加的,这就是为什么它有一个奇怪的名称)。 现在,如果点的x值大于“rightpoint”,并且如果实体向右移动,则会覆盖它。同样的情况也发生在leftPoint(“最左”点)、天花板和地板上。 然后我检查这些点是否有变化,如果有,这意味着我们与地形碰撞,所以我们将它们反弹回来。例如,假设实体向右行走,我们与地形发生碰撞,rightPoint已与我们碰撞的“最右”点一起写入,因此我们设置坐标,使实体正好位于其碰撞点的旁边

如果一次只朝一个方向走,这将非常有效,但当考虑到多个输入时,“奇怪”的事情就会发生

示例:实体平躺在地板上,朝右侧的一个突出部分走去,当实体在突出部分的一半时,它想向下走,所以右键和下键都被按下,我的代码要做的是检查输入,将实体放在它想去的地方,然后如果它碰到地形,它会反弹回来,因此,它将看到我按下右键并将实体反弹回壁架的末端

这都是我自己关于terraincollision如何工作的想法,我在网上找不到任何东西,除了如何检查是否发生了碰撞,但没有任何内容涵盖这一点。
你知道什么能让我的解决方案起作用吗,或者是一个如何进行地形碰撞的指针吗?

你的反弹想法可能有问题。尝试忽略可能与地形碰撞的移动:

如果玩家向下向右移动,那么首先检查向下是否会发生碰撞,如果是,则忽略该移动,然后检查向右,如果可以向右移动,则执行向右移动,否则也执行阻挡。

谢谢,即使我保留了“反弹”的想法,但实际上效果相当好,仍然有点古怪。如果我不反弹,如果实体有足够高的速度,它将与地形保持一段尴尬的距离。