我正在研究一个简单的项目,我无法实现如何将可绘制对象移动为(a)交叉。我的意思是,例如,当我同时向上按和左箭头键时,我希望我的绘图能够朝向确切的西北方向移动。但是,通过在KeyListener
方法中使用简单的if语句,我无法实现它。有没有特殊的方式来做或有点额外的包?这是我的代码:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
import javax.swing.*;
import javax.swing.JPanel;
public class Top extends JPanel implements ActionListener, KeyListener {
/**
*
*/
private static final long serialVersionUID = 1L;
Timer t = new Timer(5, this);
int xR = 0;int yR = 0; int zR = 0;
double x = 0, y = 0, xVel = 0, yVel = 0, width = 0, height = 0;
public Top() {
t.start();
setBackground(Color.black);
addKeyListener(this);
setFocusable(true);
}
public void actionPerformed(ActionEvent e) {
repaint();
x+=xVel;
y+=yVel;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setPaint(Color.blue);
g2d.fill(new Ellipse2D.Double(this.x, this.y, 50, 50));
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_DOWN) {
down();
}
if(keyCode == KeyEvent.VK_UP) {
up();
}
if(keyCode == KeyEvent.VK_RIGHT) {
right();
}
if(keyCode == KeyEvent.VK_LEFT) {
left();
}
}
public void down() {
this.yVel= 1;
this.xVel= 0;
}
public void up() {
this.yVel = -1;
this.xVel = 0;
}
public void left() {
this.xVel = -1;
this.yVel = 0;
}
public void right() {
this.xVel = 1;
this.yVel = 0;
}
@Override
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_DOWN ||
keyCode == KeyEvent.VK_UP ||
keyCode == KeyEvent.VK_RIGHT ||
keyCode == KeyEvent.VK_LEFT ) {
xVel=0;
yVel=0;
}
}
}
* 此代码只能向左或向右移动椭圆*
答案 0 :(得分:0)
您需要使用KeyListener
来侦听键盘事件,然后根据按下的特定键在正确的位置重新绘制对象。您可能还需要repaint()
JPanel
,具体取决于您实施图片的方式。
您能否发布一些显示您正在尝试做的代码,我们将尝试帮助解决您的问题。要做的第一件事就是验证KeyListener
是否正常工作,因此KeyListener
的代码可能是一个良好的开端。
答案 1 :(得分:0)
我会为每个方向使用布尔值,左,右,上和下。因此,当发生另一个键盘事件时,它将检查其中一个箭头键是否仍被按下。例如,如果按(并且不释放)右箭头键,则右箭头键的布尔值将设置为true。
这仅用于设置变量,现在用于处理对角线方向。再次,转到您的keyPressed方法。对于向上和向下键,格式应如下所示......
if (keyCode == VK.DOWN) {
if (leftKeyHeld) {
DownLeft();
} else if (rightKeyHeld) {
DownRight();
} else {
Down();
}
}
确定你的keyReleased方法,你将布尔值设置为false,这样程序就不会认为你不是在不按键的情况下按住键。