繁体   English   中英

碰撞检测java给出意想不到的结果

[英]Collision detection java giving unexpected results

我的碰撞检测代码有效,但是一旦我将玩家和怪物的速度设置为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;
}

谢谢

您的碰撞方法蛮好看我,假设你正在评估在角色在游戏的下一次迭代。 我愿意打赌,当发生碰撞时,你将你的角色移动到一个偏移处,将它移出碰撞盒并返回有效区域进行补偿。 当速度较高时,它会放大这种小的副作用。 仔细检查调用这些方法的所有位置,并在这些方法返回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;
}

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

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

Rectangular是一个具有一种方法的接口:

public Rectangle getRectangle();

因此我的CollisionDetector类可以处理任何可以实现名为Rectangular的接口并返回Rectangle

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM