2013-02-12 74 views
3

我正在開發一個處理(在Java上運行)的雙人遊戲。一個用戶將使用WASD鍵控制他的角色,另一個用戶使用箭頭鍵控制移動。我遇到的問題是使用keyPressed時,按下箭頭時將WASD取消,反之亦然。我一直在搞這件事很長時間。有沒有人知道一個工作或注意到我做錯了什麼?同時使用WASD和箭頭鍵

//global variables 
int wide = 600; //canvas width 
int tall = 600; //canvas height 
int s = 50; //player size 
float speed = 2.5; //player movement speed 

//colors 
int redColor = #CB4646; //player 1 color 
int blueColor = #4652CB; //player 2 color 
int backgroundColor = #DBE3B3; //background color 
float player1X = 600/3-s; //HOW COME width/3 DOESN'T WORK?????????? 
float player2X = 600*2/3; 
float playerY = 600/2-(s/2); 

//players 
Player player1 = new Player(player1X, playerY, s, speed, "wasd", redColor); //player 1 
Player player2 = new Player(player2X, playerY, s, speed, "arrows", blueColor); //player 2 

//setup 
void setup(){ 
    background(backgroundColor); 
    size(wide, tall); 
    smooth(); 
    println(player2.controls); 
} 

//draw 
void draw(){ 
    background(backgroundColor); 
    player1.usePlayer(); 
    player2.usePlayer(); 
} 

class Player{ 

    //class variables 
    float x; // x position 
    float y; // y position 
    int s; //size 
    float speed; //speed 
    String controls; //controls 
    int colors; //player color 
    char keyControls [] = new char [4]; 

    //construct 
    Player(float tempX, float tempY, int tempS , float tempSpeed, String tempControls, int tempColors){ 
    x = tempX; 
    y = tempY; 
    s = tempS; 
    speed = tempSpeed; 
    controls = tempControls; 
    colors = tempColors; 
    } 

    void usePlayer(){ 

    // draw player 
    fill(colors); 
    rect(x, y, s, s); 

    //move player 
    keyPressed(); 

    //wraparound 
    boundaries(); 

    } 

    void keyPressed(){ 

    //sets controls for wasd 
    if(controls == "wasd"){ 
      if(key == 'w' || key == 'W'){ 
      y -= speed; //move forwards 
      } 
      if(key == 's' || key == 'S'){ 
      y += speed; //move backwards 
      } 
      if(key == 'd' || key == 'D'){ 
      x += speed; //move right 
      } 
      if(key == 'a' || key == 'A'){ 
      x -= speed; //move left 
      } 
     } 

     //sets controls for arrows 
     if(controls == "arrows"){ 
     if(key == CODED){ 
      if(keyCode == UP){ 
      y -= speed; //move forwards 
      } 
      if(keyCode == DOWN){ 
      y += speed; //move backwards 
      } 
      if(keyCode == RIGHT){ 
      x += speed; //move right 
      } 
      if(keyCode == LEFT){ 
      x -= speed; //move left 
      } 
     } 
     } 
     } 

    //pacman style wraparound 
    void boundaries(){ 
    if(x == width) x = 2; 
    if(y == height) y = 2; 
    if(x == 0) x = width-s; 
    if(y == 0) y = height-s; 
    } 
} 
+0

是否與鍵盤無法一次註冊超過2-6個鍵(取決於哪個鍵)相關? – Patashu 2013-02-12 03:17:09

+0

@Patashu,我不這麼認爲,因爲當我同時按下兩個按鈕時它不起作用。 – Brannon 2013-02-12 04:58:29

+1

請注意,這實際上不是一個Java問題,而是一個Processing問題。 Processing是一個非常具體的API,它的程序設計模型與Java稍有不同(它被重寫爲Java,以便在JVM中脫機使用,但在瀏覽器中在線使用時會重寫爲JavaScript) – 2013-02-12 15:35:52

回答

3

獨立跟蹤您的密鑰,不要依賴事件全局變量。

boolean[] keys = new int[255]; 

void keyPressed() { 
    keys[keyCode] = true; 
} 

void keyReleased() { 
    keys[keyCode] = false; 
} 

void draw() { 
    updatePlayers(); 
    drawStuff(); 
} 

void updatePlayers() { 
    if(keys[LEFT]) { p1.move(-1,0); } 
    if(keys[RIGHT]) { p1.move(1,0); } 
    if(keys[UP]) { p1.move(0,-1); } 
    if(keys[DOWN]) { p1.move(0,1); } 

    if(keys['a']) { p2.move(-1,0); } 
    if(keys['d']) { p2.move(1,0); } 
    if(keys['w']) { p2.move(0,-1); } 
    if(keys['s']) { p2.move(0,1); } 
} 

請注意,這必須是一系列if語句,因爲您要處理所有按下的鍵。如果某人左右舉行,p1會左移,右移。

另請注意,此示例代碼不會過濾出爲特殊鍵獲得的高於255的代碼,因此您可能希望在事件開始時放置「if(keyCode> 255)return」處理程序。

+0

林在這背後的邏輯有點麻煩。我很抱歉,我是一般處理和編程的新手,我非常感謝您的幫助。你是否建議我刪除usePlayer方法,並用一個移動方法替換它,該方法接收我的'速度'浮點數作爲參數增加到'x'和'y'?我只是想了解如何將其轉換爲我的'Player'類。此外,我得到錯誤信息**不能從布爾轉換爲int **關於此代碼'keys [keyCode] = true;'。 – Brannon 2013-02-12 17:19:51

+1

是的:使用一些顯式的邏輯來移動你的播放器的左/右和上/下值,並根據當前註冊爲關閉的每個鍵確定該值。所以,在你畫出你的球員之前,你需要處理這個畫面下的所有鍵,然後你調用球員的畫圖函數。此外,「不能轉換...」的錯誤是因爲我很傻,不小心讓你用int []代替布爾值[]> _> – 2013-02-12 23:33:16

+0

非常感謝你的幫助!我只是將這個邏輯應用到我的程序中,它完美地移動了箭頭鍵。它會註冊兩個鍵一次按下並對角移動!然而,我很難讓WASD鍵工作。我認爲這與你提出的有關'key'而不是'keyCode'值的事實有關。讓他們倆都能工作的看起來會是什麼樣子? – Brannon 2013-02-14 00:58:27

0

key一個全局變量?我沒有看到它傳遞給玩家。如果它是全球性的,那麼它一次只能持有一把鑰匙,而不能一次控制兩名玩家。

0

這是我用來處理同時按鍵(對角移動)的Arduino/Processing代碼。它通過@Brannon解決了boolean[] cannot be cast to int[]錯誤的問題,並使用keyCodes代替密鑰。

import processing.serial.*; 
​ 
boolean[] keys = new boolean[255]; 
Serial port; 
​ 
void setup() { 
port = new Serial(this, Serial.list()[1], 9600); 
​ 
} 
​ 
void draw() { 

    // loop through boolean array and see which ones (index = keyCode) 
    // are true, then write to them. 
    for(int i = 0; i < 255; i++) { 
    if(keys[i]) { 
     if (i == 87) { port.write('w'); } 
     if (i == 65) { port.write('a'); } 
     if (i == 83) { port.write('s'); } 
     if (i == 68) { port.write('d'); } 
    } 
    } 
} 
​ 
void keyPressed() { 
    keys[keyCode] = true; 
} 
​ 
void keyReleased() { 
    keys[keyCode] = false; 
}