【发布时间】:2015-04-11 03:18:53
【问题描述】:
我正在尝试制作游戏蛇,但我似乎无法让键盘控件与图形显示同时运行。如何在 timer 方法中实现 keylistener?
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Game extends JFrame {
private static final long serialVersionUID = 7607561826495057981L;
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice();
int width = gd.getDisplayMode().getWidth();
int height = gd.getDisplayMode().getHeight();
private Timer timer;
private int xCor = 400, yCor = 150;
private int speed = 1, move = 1;
private final int top = 0, bottom = height - 10, right = width - 10,
left = 0;
private boolean north = false, south = false, east = true, west = false;
public Game() {
setTitle("Snake");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(width, height);
setResizable(false);
init();
setVisible(true);
}
public void init() {
timer = new Timer(speed, new TimerListener());
timer.start();
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.black);
g.fillRect(xCor, yCor, 10, 10);
}
private class TimerListener implements ActionListener {
public void actionPerformed(ActionEvent f) {
if (south) {
if (xCor >= left && xCor <= right && yCor >= top
&& yCor <= bottom) {
yCor += move;
}
}
if (north) {
if (xCor >= left && xCor <= right && yCor >= top
&& yCor <= bottom) {
yCor -= move;
}
}
if (west) {
if (xCor >= left && xCor <= right && yCor >= top
&& yCor <= bottom) {
xCor -= move;
}
}
if (east) {
if (xCor >= left && xCor <= right && yCor >= top
&& yCor <= bottom) {
xCor += move;
}
}
repaint();
}
}
public static void main(String[] args) {
new Game();
}
}
这是我的键盘控制类
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class KeyControls extends JFrame implements KeyListener {
private static final long serialVersionUID = 2227545284640032216L;
private boolean north = false, south = false, east = true, west = false;
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
int i = e.getKeyChar();
if (i == KeyEvent.VK_W && !south) {
north = true;
east = false;
west = false;
south = false;
}
if (i == KeyEvent.VK_S && !north) {
north = false;
east = false;
west = false;
south = true;
}
if (i == KeyEvent.VK_A && !west) {
north = false;
east = true;
west = false;
south = false;
}
if (i == KeyEvent.VK_D && !east) {
north = false;
east = false;
west = true;
south = false;
}
}
}
【问题讨论】:
标签: java swing timer jframe keylistener