2017-09-03 58 views
-2

我是編程新手,所以我只是在玩一個我想做的無限亞軍遊戲。我添加了角色圖像,並且他必須嘗試克服移動塊。目前我擁有它,因此,如果角色與該塊相撞,他的速度將爲0,因此他無法移動該對象。但是我的KeyListener覆蓋了這個。所以一旦該塊擊中角色,他就會停止移動1次遊戲刻度,但是如果您按住鍵並且他直線移動塊,則KeyListener將繼續增加他的速度。我無法弄清楚如何解決這個問題。約束一個移動的對象

這是我的球員類,它處理球員的運動以及約束。

package runner; 

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class Player implements KeyListener { 

public static int playerX = 35; 
public static int playerY = 285; 
public static int playerWidth = 100; 
public static int playerHeight = 100; 
public static int playerVX, playerVY; 

public static void update() { 
    playerX += playerVX; 
    playerY += playerVY; 

    constrain(); 
} 

public static void paint(Graphics g) { 
    //g.setColor(Color.white); 
    //g.fillRect(playerX, playerY, 100,100); 
} 

public static void constrain() { 
    if (playerX + playerWidth >= Obstacle.getX() && playerX <= 
Obstacle.getX() + Obstacle.width && playerY + playerHeight >= 
Obstacle.getY()) { 
     playerX = 0; 
    } 
} 

@Override 
public void keyTyped(KeyEvent e) { 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_LEFT) { 
     playerVX = -5; 
    } 
    if(keyCode == KeyEvent.VK_RIGHT) { 
     playerVX = 5; 
    } 
    if(keyCode == KeyEvent.VK_UP) { 
     playerVY = -5; 
    } 
    if(keyCode == KeyEvent.VK_DOWN) { 
     playerVY = 5; 
    } 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_LEFT) { 
     playerVX = 0; 
    } 
    if(keyCode == KeyEvent.VK_RIGHT) { 
     playerVX = 0; 
    } 
    if(keyCode == KeyEvent.VK_UP) { 
     playerVY = 0; 
    } 
    if(keyCode == KeyEvent.VK_DOWN) { 
     playerVY = 0; 
    } 
} 
} 

謝謝!

+2

對不起,這不是StackOverflow的工作原理。形式問題_「這是我的一堆代碼,它不起作用,有人能幫我弄清楚」_被認爲是無關緊要的。請訪問[幫助]並閱讀[問]獲取更多信息,尤其是閱讀[爲什麼是「有人可以幫助我?」不是一個實際問題?](http://meta.stackoverflow.com/q/284236/18157 )。你有沒有在代碼中放置斷點來查看實際發生的事情? –

+0

我想,因爲我只是錯過了一些小問題,這個問題將是適當的。我在我的代碼中加入了斷點。一旦角色碰撞塊,Velocity被設置爲0,但是下一次遊戲時間戳,你可以使用KeyListener來提高通過塊直接發送角色的速度 – CoderKlipto

+0

好吧,你知道發生了什麼,修改你的代碼以防止通過檢查關鍵聽衆是否可以沿選定方向移動而發生。 –

回答

0

我現在正在做一個遊戲,並且有同樣的麻煩(我也是遊戲編程的新手)。我想出了一些方法來處理碰撞。

這種方法會去您的播放器類:

public void applyBound(Bound bound) { 
    if (bound.x1 != null) { 
     if (x <= bound.x1) { 
      x = bound.x1; 
     } 
    } 
    if (bound.x2 != null) { 
     if (x >= bound.x2 - width) { 
      x = bound.x2 - width; 
     } 
    } 
    if (bound.y1 != null) { 
     if (y <= bound.y1) { 
      y = bound.y1; 
     } 
    } 
    if (bound.y2 != null) { 
     if (y >= (bound.y2 - height)) { 
      y = bound.y2 - height; 
     } 
    } 
} 

凡界是:

public class Bound { 
    public Integer x1, x2, y1, y2; 

    public Bound(int x1, int x2, int y1, int y2) { 
     this.x1 = x1; 
     this.x2 = x2; 
     this.y1 = y1; 
     this.y2 = y2; 
    } 

    public Bound(Integer x1, Integer x2, Integer y1, Integer y2) { 
     this.x1 = x1; 
     this.x2 = x2; 
     this.y1 = y1; 
     this.y2 = y2; 
    } 
} 

「applyBound(boxBounds)」 將是每次更新您的播放器稱爲最後一件事。

  • 「Bound.x1」是玩家可以走的最左邊的位置。
  • 「Bound.x2」是最右邊的位置
  • 「Bound.y1」是最底層的位置和
  • 「Bound.y2」是最上面的位置

界可以爲null所以你不需要例如上限。

在Bound類中,例如,可以放置屏幕的邊界,以便玩家不能關閉,或者可以放入另一個角色的邊緣。

您需要使用變量來查看按鍵是否被按下,並在更新方法中添加速度。

希望這會有所幫助!