2011-08-03 65 views
1

我在游戏中,你是一个简单的循环,激发子弹和它的多人模式等工作。好吧,我努力使边界有点像,美不得不通过我已经试过这样的碰撞检测迷宫类型的事情:使图像成为“边界”

public void checkCollisions(){ 
    Rectangle r1 = bo.getBounds(); 
    Rectangle d = p.getBounds(); 
    if (d.intersects(r1)) 
     border = true; 
} 

而且基本上如果边界= true,那么我从移动停止的字符。我有两个问题,当我这样做,

  1. 他不停止只是真的很慢。
  2. 即使在边界以外,他仍然处于非常缓慢的状态。

我用边境这样的:

boolean border = false; 

然后在我的paint方法我说明这一点:

if (border) 
     p.dx = 0; 
     p.dy = 0; 

p代表盖伊类:P 更多dx和dy的:

public void keyPressed(KeyEvent e) { 
int key = e.getKeyCode(); 

if (key == KeyEvent.VK_A) 
    dx = -2; 

if (key == KeyEvent.VK_D) 
    dx = 2; 

if (key == KeyEvent.VK_W) 
    dy = -2; 

if (key == KeyEvent.VK_S) 
    dy = 2; 

and for keyreleased i just chang Ëdx和dy的0 值也为家伙怎么移动:

public void move() { 
x = x + dx; 
y = y + dy; 
} 

请帮我弄清楚,为什么这是行不通的。

+0

你可以显示你使用'border'的地方吗? –

+0

我刚刚对它进行了编辑。它只是一个布尔值,如果它是假的,那么什么也没有发生,但是如果这是真的,我停止移动的人 –

+0

你需要展现更多。而不应该checkCollisions带参数并返回一个布尔值? –

回答

1

OK,我还是觉得你的游戏逻辑的全面重组是为了,但我想我可以摆脱光来发生了什么事情。让我们来看看在不同的地方,事情正在发生:

  1. 漆:在Swing线程,当paint()叫,你看是否有冲突,如果是零出速度(假设你解决这个问题,如果块) 。
  2. KEY:在Swing线程上,当按下某个键时,根据按下的键设置速度。
  3. 检查:在某个未知点,检查碰撞并记录是否有碰撞。
  4. 移动:在某个未知的地方,你用速度更新你的“家伙”的位置。

所以,这里的问题是:在Java中,就像任何其他程序一样,当你按下一个键时,你会得到多个按键事件。第一和第二之间会有短暂的延迟,然后他们会很快重复。在浏览器中的文本框中尝试它,在那里发生相同的行为。

那么这对你有什么影响?那么,你很可能进入一个场景是这样的:

PAINT -> speed set to zero 
KEY -> speed set back to -2 
MOVE -> guy is moved -2 
CHECK -> border = false 
PAINT -> speed set to zero again 

真的,如果你让你得到一个游戏循环,看起来像这样重组代码:

public void runGame() { 
    while(true) { 
     updateSpeeds(); 
     updatePositionFromSpeed(); 
     repaint(); 
    } 
} 

updateSpeeds()会而是询问密钥是否已关闭,并计算该人是否可以朝该方向移动,并且updatePositionFromSpeed()将更新该人的位置。然后paint()将依靠只有对家伙的xy坐标,不会写信给他们,并不需要知道速度。

+0

非常感谢你!这实际上有帮助! –

+0

@迈克尔:如果马克的回答对你有帮助,那么请将他的答案上调。如果它解决了你的问题,或者是在合理的时间内(如一两天)的最佳答案,那么请接受答案。 –

0

这是一个非常简单的解决方案。

这是我的一些伪代码。

 if(player.getBounds().intersects(wall.getBounds())){ 
      //Go Back to prior position, regardless of direction coming from. Since the reverse velocity X and velocity Y directions are taken care off 
      x -= velX; 
      y -= velY; 

      //Then Stop at that prior position to make next move 
      velX = 0; 
      velY = 0; 
     }