1

我的碰撞检测代码有效,但是一旦我将玩家和怪物的速度设置为大于 1,我就会得到奇怪的结果,我该如何解决这个问题?

速度为 1

速度为 1

速度为 4

速度为 4

我的碰撞检测:

static boolean collisionDown(Entity e)
{
    for(Block i : Game.blocks)
    {
        Rectangle player = new Rectangle(e.getX(), e.getY() + e.getVelocity(), e.getWidth(), e.getHeight());
        Rectangle block = new Rectangle(i.getX(), i.getY(), size, size );
        if (player.intersects(block))
        {
            //e.goUp(1);
            return true;
        }
    }
    return false;
}

static boolean collisionUp(Entity e)
{
    for(Block i : Game.blocks)
    {
        Rectangle player = new Rectangle(e.getX(), e.getY()  - e.getVelocity(), e.getWidth(), e.getHeight());
        Rectangle block = new Rectangle(i.getX(), i.getY(), size, size);
        if (player.intersects(block))
        {
            return true;
        }
    }
    return false;
}

static boolean collisionRight(Entity e)
{
    for(Block i : Game.blocks)
    {
        Rectangle player = new Rectangle(e.getX() + e.getVelocity(), e.getY(), e.getWidth(), e.getHeight());
        Rectangle block = new Rectangle(i.getX(), i.getY(), size, size);
        if (player.intersects(block))
        {
            return true;
        }
    }
    return false;
}

static boolean collisionLeft(Entity e)
{
    for(Block i : Game.blocks)
    {
        Rectangle player = new Rectangle(e.getX() - e.getVelocity(), e.getY(), e.getWidth(), e.getHeight());
        Rectangle block = new Rectangle(i.getX(), i.getY(), size, size);
        if (player.intersects(block))
        {
            return true;
        }
    }
    return false;
}

我在哪里使用碰撞检测

void goUp(int v)
{
    if(!Block.collisionUp(this))
        y -= v;
}

void goDown(int v)
{
    if(!Block.collisionDown(this))
        y += v;
}

void goRight(int v)
{
    if(!Block.collisionRight(this))
        x += v;
}

void goLeft(int v)
{
    if(!Block.collisionLeft(this))
        x -= v;
}

谢谢

4

2 回答 2

3

假设您正在评估角色在下一次游戏迭代中的位置,您的碰撞方法对我来说看起来不错。不过我敢打赌,当发生碰撞时,您可以将角色移动一个偏移量以将其移出碰撞框并返回到有效区域以进行补偿。当速度更高时,它会放大这个小副作用。仔细检查调用这些方法的所有位置,并遵循这些方法返回 true 时遵循的逻辑(主要是 Y 方向的那些)。

另一件要尝试的事情是,将角色的速度提高到更高的水平,或者介于两者之间。如果您的角色在您操纵该值时移动得越来越远,那么这很可能是正在发生的事情。

在旁注中,请在所有方法中注意这一行

Rectangle player = new Rectangle(e.getX(), e.getY()  - e.getVelocity(), e.getWidth(), e.getHeight());

在方法调用期间,这个矩形不会改变(假设你没有在游戏中实现线程),所以在 for 循环的每次迭代中重新创建它只会占用时间。考虑将方法修改为:

static boolean collisionDown(Entity e)
{
    Rectangle player = new Rectangle(e.getX(), e.getY() + e.getVelocity(), e.getWidth(), e.getHeight());
    for(Block i : Game.blocks)
    {
        Rectangle block = new Rectangle(i.getX(), i.getY(), size, size );
        if (player.intersects(block))
        {
            //e.goUp(1);
            return true;
        }
    }
    return false;
}
于 2013-09-12T19:50:58.920 回答
1

我为碰撞检测所做的是开发一个名为CollissionDetector. 对于以下方法,它有一些逻辑:

public boolean isColliding();
public boolean collided(Rectangular r1, Rectangular r2);

矩形是具有一种方法的接口:

public Rectangle getRectangle();

所以我的CollisionDetector班级使用任何可以实现调用的接口Rectangular并返回Rectangle.

一些应该检测碰撞的代码的问题是它不止一次报告相同的碰撞。

使用我的碰撞检测器,碰撞检测器对象将跟踪碰撞何时开始、两个对象是否仍在碰撞以及碰撞何时结束。

好像我也有一个CollissionListener。我知道这一切都非常复杂,但它确实奏效了。有以下CollisionListener方法:

public void CollissionStarted();
public void CollissionEnded();

我希望我能给你一个 SSCCE:http ://sscce.org但我没有代码了。

于 2013-09-13T17:19:32.880 回答