我正在制作诺基亚蛇游戏。我已经制作了Frame和所有东西,并且已经写好了我的算法。目前我正在做一些事情,以便我可以使用我的键(例如左,右,上,下)执行操作。
我创建了一个名为Frame的类,它扩展了JFrame并实现了动作侦听器,我在Stack Overflow上看到的,我需要在密钥释放函数中编写代码,以便在按下键时运行代码。
但是当我按下键时没有发生任何事情。
这是我的Java代码:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Frame extends JFrame implements KeyListener {
private static final int BOARD_SIZE = 51;
private static final int FRAME_SIZE = 700;
private static final Color SNAKE = Color.GREEN;
private static final Color BOARD = Color.WHITE;
private static final Color FOOD = Color.BLUE;
private static enum DIRECTION {
right, left, up, down;
}
private static DIRECTION curr = DIRECTION.right;
public Frame() {
super.setTitle("<<SNAKE GAME>>");
super.setSize(this.FRAME_SIZE, this.FRAME_SIZE);
GridLayout layout = new GridLayout(this.BOARD_SIZE, this.BOARD_SIZE);
super.setLayout(layout);
int val = this.randomNum(this.BOARD_SIZE * this.BOARD_SIZE - 7);
int count = 0;
for (int i = 0; i < this.BOARD_SIZE; i++) {
for (int j = 0; j < this.BOARD_SIZE; j++) {
JButton btn = new JButton();
super.add(btn);
this.buttons[i][j] = btn;
if (i == this.BOARD_SIZE / 2 + 1 && j > this.BOARD_SIZE / 2 - 5
&& j <= this.BOARD_SIZE / 2 + 6) {
this.snakeLL.snake.AddFirst(btn);
btn.setBackground(this.SNAKE);
} else if (count == val) {
btn.setBackground(FOOD);
count++;
} else {
btn.setBackground(this.BOARD);
count++;
}
}
}
super.addKeyListener(this);
super.setResizable(false);
super.setVisible(true);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyLocation();
if (key == KeyEvent.VK_UP) {
this.curr = DIRECTION.up;
}
}
答案 0 :(得分:2)
,我在堆栈溢出时看到的某个地方,我需要在密钥释放函数中编写我的代码,以便...在按下密钥时运行我的代码...
我认为你在这里没有这个建议。
我们始终建议您使用Key Bindings
。阅读How to Use Key Bindings上Swing教程中的部分以获取基本信息。
您还可以查看Motion Using the Keyboard,其中包含使用Key Bindings
为组件设置动画的工作示例。