我正在制作一个小程序,其中两个矩形围绕赛车跑道行驶。当我运行程序时,一切都按计划进行,我可以使用箭头键在轨道周围移动黑色矩形。如果我想用W,A,S,D移动红色矩形,我该怎么办?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class first extends JLabel implements ActionListener, KeyListener {
Timer t = new Timer(5, this);
double x = 0, y = 25, velx = 0, vely = 0;
public first() {
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
public static void main(String[] args) {
JLabel jl = new JLabel();
JPanel jp = new JPanel();
JFrame f = new JFrame();
first m = new first();
f.add(m);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(1650,1080);
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
//The image below is a race car track I drew in Microsoft Paint
jl.setIcon(new ImageIcon("C:\\Users\\Jack\\Pictures\\JavaImages\\racetrack2.png"));
f.add(jp);
jp.add(jl);
f.validate();
}
public void paintComponent (Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.RED);
g2.fill(new Rectangle2D.Double(0, 80, 90, 50));
g2.setColor(Color.BLACK);
g2.fill(new Rectangle2D.Double(x, y, 90, 50));
}
public void actionPerformed(ActionEvent e) {
repaint();
x += velx;
y += vely;
}
public void up() {
vely = -3.5;
velx = 0;
}
public void down() {
vely = 3.5;
velx = 0;
}
public void left() {
velx = -4.5;
vely = 0;
}
public void right() {
velx = 4.5;
vely = 0;
}
/*public void upStopped() {
velx = 0;
vely = 0;
}
public void downStopped() {
velx = 0;
vely = 0;
}
public void leftStopped() {
velx = 0;
vely = 0;
}
public void rightStopped() {
velx = 0;
vely = 0;
}*/
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code == KeyEvent.VK_UP) {
up();
}
if(code == KeyEvent.VK_DOWN) {
down();
}
if(code == KeyEvent.VK_LEFT) {
left();
}
if(code == KeyEvent.VK_RIGHT) {
right();
}
if(code == KeyEvent.VK_W) {
}
if(code == KeyEvent.VK_S) {
}
if(code == KeyEvent.VK_A) {
}
if(code == KeyEvent.VK_D) {
}
}
public void keyReleased(KeyEvent e) {
/*int code2 = e.getKeyCode();
if(code2 == KeyEvent.VK_UP) {
upStopped();
}
if(code2 == KeyEvent.VK_DOWN) {
downStopped();
}
if(code2 == KeyEvent.VK_LEFT) {
leftStopped();
}
if(code2 == KeyEvent.VK_RIGHT) {
rightStopped();
}*/
}
public void keyTyped(KeyEvent e) {}
}
答案 0 :(得分:0)
我可以使用箭头键在轨道周围移动黑色矩形。如果我想用W,A,S,D移动红色矩形,我该怎么办?
Key Bindings
而不是KeyListener。 查看Motion Using The Keyboard以获取有关上述概念的更多信息。 keyboardAnimation
代码是实现这两个概念的完整工作示例。