我遇到了碰撞检测的问题,我已经在其他论坛上问过并且已经在谷歌搜索了一个月了(没有人有答案)。碰撞检测的问题在于它的延迟或不准确,有时它会完美地检测到它,有时是中途检测,有时根本不检测。有人说它是我的更新循环(使用swing计时器)和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();
}
随时提出有关代码的问题!
下载:Click Here
答案 0 :(得分:2)
如果您使用的是java.util.Timer
课程,请观看 here 。
它显然保持这样:
对应每个Timer对象是一个后台线程 用于按顺序执行所有计时器的任务。 计时器任务 应该快点完成。如果计时器任务需要过多的时间 完成,它&#34;猪#34;计时器的任务执行线程。这可以,在 转,延迟后续任务的执行,这可能会导致后续任务的结束。 当(和如果)违规任务快速连续执行 最后完成。
因此,有时与Timer类关联的TimerTask会在准确的冲突时间内触发,但有时需要一段时间,因为到那时您的上一个任务可能正在完成..