gpt4 book ai didi

java - 键盘 Action 监听器

转载 作者:行者123 更新时间:2023-12-04 20:48:58 28 4
gpt4 key购买 nike

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

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

最佳答案

看看这个link对于用 Java 实现的游戏,它完全符合您的要求。按键 - 左上右下键。

它是著名的 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;
}
}

关于java - 键盘 Action 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6885545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com