2013-10-13 61 views
0

所以我正在製作這款遊戲​​,玩家擁有像大多數常見遊戲一樣的x和y值,然後我添加了vely和velX。這些變量對應設置爲被按下哪個鍵:Java碰撞和按鍵

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

      if (key == KeyEvent.VK_W) { 
       velY = 1; 

      } else if (key == KeyEvent.VK_S) { 
       velY = -1; 

      } else if (key == KeyEvent.VK_A) { 
       velX = 1; 

      } else if (key == KeyEvent.VK_D) { 
       velX = -1; 

      } 
     } 
    } 

我也有周圍的玩家一個矩形,我會得到這一點以後。我也做了另一個矩形(r1),這將成爲玩家碰撞的對象。現在我用一個計算碰撞的基本方法:

  if (player.getBounds().intersects(r1)) { 
      velX = 0; 
      velY = 0; 
     } 

但由於按鍵velX在0和1/-1之間交替。我想要這樣,當玩家與r1碰撞時,玩家不能穿過它,但可以在所有其他方向上移動。我不想讓玩家彈出另一個矩形!我希望我解釋得很好,提出任何問題,並感謝所有幫助!

回答

0

通常的做法是模擬玩家移動,檢查玩家是否在移動後發生碰撞,如果他確實在這一步之前阻止他。

通常的缺點是(但是我在很多遊戲中都看到過),如果你的玩家在牆上移動速度非常快,他可以在實際撞擊牆壁之前停下相對較長的路。

但是它可以通過alghoritm類似阿基里斯和烏龜來解決:

Achilles, a symbol of quickness must overtake a tortoise, symbol of slowness. Achilles runs ten times as quick as the tortoise and gives her ten metros odds. 
Achilles runs ten meters, a tortoise runs one meter, 
Achilles runs one meter, a tortoise runs one decimeter, 
Achilles runs one decimeter, a tortoise runs one centimeter. 
And so on until the infinity. As a result according to Zeno Achilles can run everlastingly, but never will be able to run down a tortoise. 
Such is the immortal paradox. 

所以,如果你不能在這樣的速度在這個方向前進的球員,用半速試一下,然後用一半的一半速度速度等。 但是,如果不製造無限循環,您應該創造一個恆定值min_movement,並且當玩家的動作落在該動作之下時,停止模擬他的動作即可阻止他。

+0

但是如果玩家想要向相反方向移動會怎麼樣 – user2876115

+0

您在牆上移動並在與牆相交之前停下來。所以你可以自由地向相反的方向移動,因爲你不交叉任何東西。 – libik

+0

那麼我如何按照上面所示的代碼方式執行此操作? – user2876115