2013-11-25 25 views
0

我試圖創建一個遊戲,以便玩家可以在所有方向移動(N,NW,W,SW,S,SE,E,NE),但是當我捕獲擊鍵會使我在一個對角線方向上移動一次,但如果我按住它,它會切換到其中一個基本方向(N,W,S,E)。使用Java Canvas在半主要方向移動播放器

主類的按鍵偵聽

private class MultiKeyPressListener extends KeyAdapter { 

    private final Set<Character> pressed = new HashSet<Character>(); 

    @Override 
    public synchronized void keyPressed(KeyEvent e) {  
     pressed.add(e.getKeyChar()); 
     if(pressed.size() > 1){ 

      System.out.println(pressed); 
      //LEFT UP PRESSED 
      if (e.getKeyCode() == KeyEvent.VK_LEFT && e.getKeyCode() == KeyEvent.VK_UP 
        || e.getKeyCode() == KeyEvent.VK_A && e.getKeyCode() == KeyEvent.VK_W) { 
       player.direction = "NW"; 
      } 
      //UP RIGHT PRESSED 
      if (e.getKeyCode() == KeyEvent.VK_UP && e.getKeyCode() == KeyEvent.VK_RIGHT 
        || e.getKeyCode() == KeyEvent.VK_W && e.getKeyCode() == KeyEvent.VK_D) { 
       player.direction = "NE"; 

      } 
      //RIGHT DOWN PRESSED 
      if (e.getKeyCode() == KeyEvent.VK_RIGHT && e.getKeyCode() == KeyEvent.VK_DOWN 
        || e.getKeyCode() == KeyEvent.VK_S && e.getKeyCode() == KeyEvent.VK_D) { 
       player.direction = "SE"; 
      } 
     }else{ 
      //DOWN LEFT PRESSED 
      if (e.getKeyCode() == KeyEvent.VK_LEFT && e.getKeyCode() == KeyEvent.VK_DOWN 
        || e.getKeyCode() == KeyEvent.VK_S && e.getKeyCode() == KeyEvent.VK_A) { 
       player.direction = "SW"; 
      } 
      //LEFT PRESSED 
      if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_A) { 
       player.direction = "W"; 
      } 
      //DOWN PRESSED 
      if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S) { 
       player.direction = "S"; 
      } 
      //RIGHT PRESSED 
      if (e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_D) { 
       player.direction = "E"; 
      } 
      //UP PRESSED 
      if (e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP) { 
       player.direction = "N"; 
      } 
     } 
     player.move(); 
    } 

    @Override 
    public synchronized void keyReleased(KeyEvent e) { 
     pressed.remove(e.getKeyChar()); 
    } 
} 

Player類

 public void move(){ 
    if(direction.equals("N")){ 
     y-= moveRate; 
    }else if(direction.equals("NW")){ 
     y-= moveRate; 
     x-= moveRate; 
    }else if(direction.equals("W")){ 
     x-= moveRate; 
    }else if(direction.equals("SW")){ 
     x-= moveRate; 
     y+= moveRate; 
    }else if(direction.equals("S")){ 
     y+= moveRate; 
    }else if(direction.equals("SE")){ 
     y+= moveRate; 
     x+= moveRate; 
    }else if(direction.equals("E")){ 
     x+= moveRate; 
    }else if(direction.equals("NE")){ 
     x+= moveRate; 
     y-= moveRate; 
    } 
    //System.out.println("Moving " + direction); 
} 

回答

0

你不會同時接收兩個事件,那是你不會收到KeyEvent.VK_LEFTKeyEvent.VK_UP,你只有會一個接一個地接收。

你應該嘗試這樣做,是每一個鍵被按下時,提出一個標誌或將其添加到某種List,當一個鍵被釋放,復位標誌或從List刪除它。

當您要確定字符移動的方向,你會檢查這些標誌,並就移動你的決定......

我也建議使用Key Bindings超過KeyListener,因爲它不從相同的焦點相關的問題遭受...

例如

+0

您能不能給我一些示例代碼或鏈接?謝謝! – Freddy05