2013-01-13 54 views
0

我在我的程序中有一個關鍵聽衆,並且對於大多數鍵我希望用戶能夠按住一個鍵。然而,屏幕截圖的關鍵,我希望用戶能夠按住鍵,但它只需要一個屏幕截圖任何想法?Java按鍵聽衆按一次

package me.bevilacqua.game; 

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

public class InputHandler implements KeyListener{ 

    private boolean[] keys = new boolean[120]; 
    public boolean up , down , left , right , screen_shot; 

    public void tick() { 
     up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W]; //Will be Jump 
     down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S]; //Will not be down but maybe slide or better yet action key or maybe shoot 
     left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A]; 
     right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];  
     screen_shot = keys[KeyEvent.VK_F5] || keys[KeyEvent.VK_BACK_SLASH]; 
    } 

    public void keyPressed(KeyEvent e) { 
     keys[e.getKeyCode()] = true; 
    } 

    public void keyReleased(KeyEvent e) { 
     keys[e.getKeyCode()] = false; 
    } 

    public void keyTyped(KeyEvent e) { 
    } 
} 

編輯:

爲什麼不這項工作:

package me.bevilacqua.game; 

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.Timer; 


public class InputHandler implements KeyListener{ 
private boolean[] keys = new boolean[120]; 
public long current , last = -1; 
public boolean up , down , left , right , screen_shot; 
public boolean shotFlag = true; //True if allowed 

public void tick() { 
    up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W]; //Will be Jump 
    down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S]; //Will not be down but maybe slide or better yet action key or maybe shoot 
    left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A]; 
    right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];  
    screen_shot = keys[KeyEvent.VK_F5]; 
} 

public void keyPressed(KeyEvent e) { 
    if(e.getKeyCode() != KeyEvent.VK_F5) keys[e.getKeyCode()] = true; 
    else if (e.getKeyCode() == KeyEvent.VK_F5 && shotFlag) { 
     keys[e.getKeyCode()] = true; 
     shotFlag = false; 
    } 


} 

public void keyReleased(KeyEvent e) { 
    keys[e.getKeyCode()] = false; 
    if(e.getKeyCode() == KeyEvent.VK_F5) shotFlag = true; 
} 

public void keyTyped(KeyEvent e) { 
} 

}

+0

因此,你的系統中有一個標誌停止鍵重複,但對於某些鍵,你想允許重複發生,這是正確的嗎? – MadProgrammer

+0

那麼目前所有的按鍵重複,我需要添加一個標誌,以防止某些鍵重複 – Bevilacqua

+1

這似乎是一個設計問題。如何使用'tick()'方法? –

回答

0

據我瞭解,與每一個鍵重複有關的動作時,適當的鍵舉行即使按住相應的按鍵,也要停止其中一個操作。我想你可以通過在調用keyPressed()時設置一個額外的標誌來解決這個問題。然後,screen_shot僅在tick()中設置,當該標誌被設置時每次調用標誌tick()(當然在讀取其值之後)。或者,只有在設置標誌並且您正在設置screen_shot標誌時,纔可以取消設置標誌。我認爲這兩種方式都沒有什麼不同。

0

你可以嘗試這樣的:

public boolean up = false; 
public boolean down = false; 
public boolean left = false; 
public boolean right = false;  
public boolean screen_shot = false; 

//... 

f.addKeyListener(new KeyAdapter() 
     { 
      public void keyPressed(KeyEvent e) 
      { 
       if (e.getKeyCode() == KeyEvent.VK_D) 
       { 
        right = true; 
       } 
       if (e.getKeyCode() == KeyEvent.VK_A) 
       { 
        left = true; 
       } 
       if (e.getKeyCode() == KeyEvent.VK_S) 
       { 
        down = true; 
       } 
       if (e.getKeyCode() == KeyEvent.VK_W) 
       { 
        up = true; 
       } 
       if (e.getKeyCode() == KeyEvent.VK_F5) 
       { 
        screen_shot = true; 
       } 
      } 
      public void keyReleased(KeyEvent e) 
      { 
       if (e.getKeyCode() == KeyEvent.VK_D) 
       { 
        right = false; 
       } 
       if (e.getKeyCode() == KeyEvent.VK_A) 
       { 
        left = false; 
       } 
       if (e.getKeyCode() == KeyEvent.VK_S) 
       { 
        down = false; 
       } 
       if (e.getKeyCode() == KeyEvent.VK_W) 
       { 
        up = false; 
       } 
       if (e.getKeyCode() == KeyEvent.VK_F5) 
       { 
        screen_shot = false; 
       } 
      } 
//... 

@Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     this.setBackground(Color.white); 
     g.drawImage(character, characterLocation.x, characterLocation.y, this); 

     if (right) 
     { 
      characterLocation.x += 1; 
     } 
     if (left) 
     { 
      characterLocation.x -= 1; 
     } 
     if (down) 
     { 
      characterLocation.y += 1; 
     } 
     if (up) 
     { 
      characterLocation.y -= 1; 
     } 
     if (screen_shot) 
     { 
      BufferedImage shot = character.createScreenCapture(new Rectangle(100,100)); 
     } 
     repaint(); 
    } 
} 

可能無法正常工作達到標準,你可能需要更改上面的屏幕截圖的「if」語句。