1

我正在制作一个 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 已被写为“最右边”

如果一个人一次只朝一个方向前进,这将非常有效,但是当您考虑多个输入时会发生“奇怪”的事情。

示例:实体走平到地板上,走向右侧的窗台,当实体在窗台上的一半时,它想往下走,所以向右和向下都被按下,我的代码将做的是检查输入,将实体放在它想要的位置,然后在它撞到地形时将其弹回,所以它会看到我按下右并将实体弹回壁架的末端。

这是我对地形碰撞如何工作的全部想法,除了如何检查是否发生碰撞之外,我在网上找不到任何东西,但没有任何内容涵盖这一点。知道什么可以使我的解决方案起作用,或者指出应该如何进行地形碰撞?

4

1 回答 1

2

你的反弹想法可能有问题。尝试忽略与地形碰撞的
移动:如果玩家向下和向右移动,则首先检查向下是否会碰撞,如果是,则忽略该移动,并检查是否正确,如果可能向右移动,否则块,太。

于 2013-02-10T15:37:13.763 回答