搜尋此網誌

2013年6月16日 星期日

Java多重按鍵偵測.

 import java.awt.Dimension;  
 import java.awt.EventQueue;  
 import java.awt.event.KeyAdapter;  
 import java.awt.event.KeyEvent;  
 import javax.swing.JFrame;  
 import javax.swing.JLabel;  
 import javax.swing.JPanel;  
 public class MKPD extends JFrame  
 {  
   public MKPD()  
   {  
    super("MKPD");  
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    setContentPane(new KeyPanel());  
    pack();  
    setVisible(true);  
   }  
   public static void main(String[] args)  
   {  
    Runnable r = new Runnable()  
           {  
            public void run()  
            {  
              new MKPD();  
            }  
           };  
    EventQueue.invokeLater(r);  
   }  
 }  
 class KeyPanel extends JPanel  
 {  
   private enum GameState { MOVED, JUMPED, MOVED_THEN_JUMPED,  
               JUMPED_THEN_MOVED };  
   private GameState gs = null;  
   private boolean rightPressed = false;  
   private boolean upPressed = false;  
   private JLabel lblStatus = null;  
   KeyPanel()  
   {  
    KeyAdapter ka = new KeyAdapter()  
            {  
              public void keyPressed(KeyEvent ke)  
              {  
               handleKeyPress(ke);  
              }  
              public void keyReleased(KeyEvent ke)  
              {  
               handleKeyRelease(ke);  
              }  
            };  
    addKeyListener(ka);  
    lblStatus = new JLabel("", JLabel.CENTER);  
    lblStatus.setPreferredSize(new Dimension(200, 50));  
    add(lblStatus);  
    setFocusable(true);  
    requestFocus();  
   }  
   private void handleKeyPress(KeyEvent ke)  
   {  
    int keyCode = ke.getKeyCode();  
    if (keyCode == KeyEvent.VK_RIGHT)  
      rightPressed = true;  
    else  
    if (keyCode == KeyEvent.VK_UP)  
      upPressed = true;  
    updateState();  
    updateLabel();  
   }  
   private void handleKeyRelease(KeyEvent ke)  
   {  
    int keyCode = ke.getKeyCode();  
    if (keyCode == KeyEvent.VK_RIGHT)  
      rightPressed = false;  
    else  
    if (keyCode == KeyEvent.VK_UP)  
      upPressed = false;  
    updateState();  
    updateLabel();  
   }  
   private void updateLabel()  
   {  
    if (gs == null)  
    {  
      lblStatus.setText("");  
      return;  
    }  
    switch (gs)  
    {  
      case MOVED_THEN_JUMPED:  
       lblStatus.setText("Moved and then jumped");  
       break;  
      case JUMPED_THEN_MOVED:  
       lblStatus.setText("Jumped and then moved");  
       break;  
      case MOVED:  
       lblStatus.setText("Moved");  
       break;  
      case JUMPED:  
       lblStatus.setText("Jumped");  
    }  
   }  
   private void updateState()  
   {  
    if (rightPressed && upPressed)  
    {  
      if (gs == GameState.MOVED)  
       gs = GameState.MOVED_THEN_JUMPED;  
      else  
      if (gs == GameState.JUMPED)  
       gs = GameState.JUMPED_THEN_MOVED;  
    }  
    else  
    if (rightPressed)  
      gs = GameState.MOVED;  
    else  
    if (upPressed)  
      gs = GameState.JUMPED;  
    else  
      gs = null;  
   }  
 }  

沒有留言:

張貼留言