簡體   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