-1

重複の可能性:
Java長方形衝突検出の混乱

衝突検出で問題が発生しました。他のフォーラムで質問し、1か月間Googleを検索しました(誰も答えがありませんでした)。衝突検出に関する私の問題は、それが遅れているか不正確であるということです。完全に検出されることもあれば、途中で検出されることもあれば、まったく検出されないこともあります。一部の人々は、それが私の更新ループ(スイングタイマーを使用)とKeyInputの間の同期の問題であると言います。どう思いますか?

コード!:)

KeyInput:

  public void keyPressed(KeyEvent e)
{

    int key = e.getKeyCode();

        if (key == KeyEvent.VK_D && walkRight == true)
        {

                Screen.movementX=-1;


        }
        else if (key == KeyEvent.VK_A && walkLeft == true)
        {

                Screen.movementX=1;



        }
        else if (key == KeyEvent.VK_S && walkDown == true)
        {

                Screen.movementY=-1;



        }
        else if (key == KeyEvent.VK_W && walkUp == true)
        {

                Screen.movementY=1;



        }





        if (key == KeyEvent.VK_D && walkRight == false)
        {

                Screen.movementX =0;


        }
        else if (key == KeyEvent.VK_A && walkLeft == false)
        {

                Screen.movementX=0;



        }
        else if (key == KeyEvent.VK_S && walkDown == false)
        {

                Screen.movementY=0;



        }
        else if (key == KeyEvent.VK_W && walkUp == false)
        {

                Screen.movementY=0;



        }






}
public void keyReleased(KeyEvent e)
{
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_D)
    {
        Screen.movementX=0;
    }
    else if (key == KeyEvent.VK_A)
    {
        Screen.movementX=0;
    }
    else if (key == KeyEvent.VK_S)
    {
        Screen.movementY=0;
    }
    else if (key == KeyEvent.VK_W)
    {
        Screen.movementY=0;
    }
}

衝突:

public static void collision()
{
    p.walkUp = true;
    p.walkDown = true;
    p.walkLeft = true;
    p.walkRight = true;
    for (int i = 0; i < wallTileArr.size(); i++)
    {
        wallTile = wallTileArr.get(i);
        wallTile.collision(p);
    }
}

と:

public void collision(Player p)
{
    if (p.downGetBounds().intersects(getBounds()))
    {
        p.walkDown = false;
    }

    else if (p.upGetBounds().intersects(getBounds()))
    {
        p.walkUp = false;
    }
    else if (p.leftGetBounds().intersects(getBounds()))
    {
        p.walkLeft = false;
    }
    else if (p.rightGetBounds().intersects(getBounds()))
    {
        p.walkRight = false;
    }

}

JPanelsの切り替え(メインメニューなどに使用)

public static void changePanelTo(Component add)
{
        Main.f.getContentPane().invalidate();
        Main.f.getContentPane().removeAll();
        Main.f.add(add);
        Main.f.validate();
        add.requestFocusInWindow();





}

コードについてお気軽にご質問ください!

ダウンロード:ここをクリック

4

1 に答える 1

2

java.util.Timerクラスを使用している場合は、こちらをご覧ください
それは明らかにそれを維持します:

各Timerオブジェクトに対応するのは、タイマーのすべてのタスクを順番に実行するために使用される単一のバックグラウンドスレッドです。タイマータスクはすぐに完了するはずです。タイマータスクの完了に時間がかかりすぎると、タイマーのタスク実行スレッドが「占有」されます。これにより、後続のタスクの実行が遅れる可能性があります。これにより、問題のあるタスクが最終的に完了したときに(そしてその場合に)、「束ねられ」てすばやく連続して実行される可能性があります

そのため、Timerクラスに関連付けられたTimerTaskが正確な衝突時間に起動される場合もありますが、その時間までに前のタスクが完了している可能性があるため、時間がかかる場合があります。

于 2013-01-28T18:57:28.007 に答える