Keyboard Actionlistener
14,526
Solution 1
Take a look at this link for a game impelemented in Java and it does exactly what you are looking for. Key presses - up left right and down keys.
Its the famous 15-game
An excerpt from that,
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;
}
});
}
The handleKeyPress() method for handling the arrow keys
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;
}
}
Solution 2
Also consider adding conrol over all eight (semi-) cardinal directions, as shown in this game. For greater flexibility, consider actions and key bindings, discussed here.
Author by
Jeremy
Updated on June 05, 2022Comments
-
Jeremy almost 2 years
I am trying to make a space ship (PlayerShip.gif) in my game move left, right, up, and down when the coresponding keys are pressed. I know i need an keyboardListener but im having issues figuring out where it goes and how it is actually implimented. my code is as follows.
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 } }