键盘Actionlistener

我试图让我的游戏中的太空飞船(PlayerShip.gif)在按下相应的键时向左,向右,向上和向下移动。 我知道我需要一个keyboardListener,但我有问题弄清楚它到底去了什么以及它实际上是如何实现的。 我的代码如下。

public class GamePanel extends JPanel implements KeyListener { Timer timer1; Timer timer2; ArrayList 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(); // 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  getHeight() - size) { y = getHeight() - size; } if (y  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 } } 

看一下这个链接 ,找到一个用Java实现的游戏,它完全符合您的要求。 按键 – 向上和向左键。

它是着名的15场比赛

在此处输入图像描述

摘录自此,

 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; } } 

还可以考虑在所有八个(半)基本方向上添加控制,如本游戏所示。 为了获得更大的灵活性,请考虑此处讨论的操作键绑定