2011-07-30 45 views
2

我正在尝试在我的游戏中使用SpaceShip(PlayerShip.gif)在按下相应的按键时向左,向右,向上和向下移动。我知道我需要一个keyboardListener,但是我有问题想清楚它到底在哪里以及它是如何实际实现的。我的代码如下。Keyboard Actionlistener

public class GamePanel extends JPanel implements KeyListener { 

    Timer timer1; 
    Timer timer2; 
    ArrayList<Ships> ship; 
    int x; 
    int y; 
    double speed; 
    int size; 
    int shipxCoord; 
    int shipyCoord; 
    int shipHeight; 
    int shipWidth; 
    int shipRise; 
    int shipRun; 
    boolean left = false; 
    boolean right = false; 
    boolean up = false; 
    boolean down = false; 
    Image enemyShip1; 
    Image enemyShip2; 
    Image playerShip; 
    ImageIcon ic = new ImageIcon("Ship.gif"); 
    ImageIcon ic2 = new ImageIcon("Ship2.gif"); 
    int width = ic.getIconWidth(); 
    int height = ic.getIconHeight(); 
    Image background = Toolkit.getDefaultToolkit().createImage("background.jpg"); 

    public GamePanel(int size, double speed) { 
     super(); 

     x = 450; 
     y = 510; 
     ship = new ArrayList<Ships>(); 
     // call timer for 1st type of enemy Ship with a delay of 5 seconds between ships 
     enemy1Timer(5); 
     // call timer for 2nd type of enemy Ship with a delay of 3 seconds between ships 
     enemy2Timer(3); 
     this.size = size; 
     this.speed = speed; 
     enemyShip1 = new ImageIcon("ship.gif").getImage(); 
     enemyShip2 = new ImageIcon("ship2.gif").getImage(); 
     playerShip = new ImageIcon("playerShip.gif").getImage(); 
     // this.add(image); 
    } // end constructor 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(background, 0, 0, null); 
     for (Ships s : ship) { 
      s.paintComponent(g); 
     } 

     g.drawImage(playerShip, x, y, this); 

     //g.drawImage(enemyShip2,x,y,this); 
    }// end method paintComponent 

    public void move() { 
     for (Ships s : ship) { 
      s.moveship(this); 
      // s.detectCollision(ship); 
     } 
     if (left) { 
      x -= speed; 
     } 
     if (right) { 
      x += speed; 
     } 
     if (up) { 
      y -= speed; 
     } 
     if (down) { 
      y += speed; 
     } 

     if (x > getWidth() - size) { 
      x = getWidth() - size; 
     } 

     if (x < 0) { 
      x = 0; 
     } 

     if (y > getHeight() - size) { 
      y = getHeight() - size; 
     } 
     if (y < 0) { 
      y = 0; 
     } 
    }// end method move 

    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == e.VK_LEFT) { 
      left = true; 

     } 
     if (e.getKeyCode() == e.VK_RIGHT) { 
      right = true; 
     } 
     if (e.getKeyCode() == e.VK_UP) { 
      up = true; 
     } 
     if (e.getKeyCode() == e.VK_DOWN) { 
      down = true; 
     } 

    } // end method keyPressed 

    public void keyReleased(KeyEvent e) { 
     if (e.getKeyCode() == e.VK_LEFT) { 
      left = false; 
     } 
     if (e.getKeyCode() == e.VK_RIGHT) { 
      right = false; 
     } 
     if (e.getKeyCode() == e.VK_UP) { 
      up = false; 
     } 
     if (e.getKeyCode() == e.VK_DOWN) { 
      down = false; 
     } 
    } 

    public void enemy1Timer(int seconds) { 
     timer1 = new Timer(); 
     timer1.schedule(new ShipSwarm1(), 1000, seconds * 1000); 
    }// end method enemy1Timer 

    class ShipSwarm1 extends TimerTask { 

     public void run() { 
      for (int Wave = 1; Wave > 0; Wave--) { 
       Ships enemy = new Ships(ic, enemyShip1); 
       ship.add(enemy); 
      }// end for 
     }// end method run 
    }// end class Enemy1Swarm 

    public void enemy2Timer(int seconds) { 
     timer2 = new Timer(); 
     timer2.schedule(new ShipSwarm2(), 3000, seconds * 1000); 
    }// end method enemy1Timer 

    class ShipSwarm2 extends TimerTask { 

     public void run() { 
      for (int Wave = 1; Wave > 0; Wave--) { 
       Ships enemy = new Ships(ic2, enemyShip2); 
       ship.add(enemy); 
      }// end for 
     }// end method run 
    } 
} 
+0

如果你觉得他们是正确的,你能接受答案吗? – bragboy

回答

9

看看这个link在Java impelemented游戏,它确实你在寻找什么。按下键 - 向左和向右键。

及其著名15-game

enter image description here

一种从摘录,

private void processKeys(){ 
    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
     new KeyEventDispatcher() { 
      public boolean dispatchKeyEvent(KeyEvent e){ 
       if(e.getID() == KeyEvent.KEY_PRESSED){ 
        handleKeyPress(e.getKeyCode()); 
        if(areThingsInPlace() && !dialogShown){ 
         dialogShown = true; 
         JOptionPane.showMessageDialog(null,"Congratulations!!! YOU WIN!!"); 
         System.exit(1); 
        } 
       } 
       return false; 
      } 
    }); 
} 

的handleKeyPress(),用于处理所述箭头键方法

private void handleKeyPress(int keyCode) { 
    int emptyIndex = findEmptyIndex(); 
    int x = emptyIndex/SIZE; 
    int y = emptyIndex%SIZE; 

    switch (keyCode) { 
    case 37://LEFT KEY 
     if(y==SIZE-1) return; 
     doSwap(x,y,x,y+1); 
     break; 
    case 38://UP KEY 
     if(x==SIZE-1) return; 
     doSwap(x,y,x+1,y); 
     break; 
    case 39://RIGHT KEY 
     if(y==0) return; 
     doSwap(x,y,x,y-1); 
     break; 
    case 40://DOWN KEY 
     if(x==0) return; 
     doSwap(x,y,x-1,y); 
     break; 
    } 
}