-1

可能重复:
Java 矩形碰撞检测混淆

我遇到了碰撞检测的问题,我在其他论坛上询问过,现在已经在谷歌搜索了一个月(没有人有答案)。我对碰撞检测的问题是它被延迟或不准确,有时它可以完美地检测到它,有时会检测到一半,有时根本检测不到。有人说这是我的更新循环(使用摆动计时器)和 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;
    }

}

切换 JPanel(将其用于主菜单等)

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 回答