Java 爪哇移动球

Java 爪哇移动球,java,graphics,Java,Graphics,我正在做一个简单的项目,我无法实现如何将一个可绘制的对象作为十字移动。我的意思是,例如,当我同时按下向上和向左箭头键时,我希望我的绘图能够准确地向西北方向移动。然而,通过在KeyListener方法中使用简单的if语句,我无法实现它。有没有什么特别的方法或者额外的包装?这是我的密码: import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEv

我正在做一个简单的项目,我无法实现如何将一个可绘制的对象作为十字移动。我的意思是,例如,当我同时按下向上和向左箭头键时,我希望我的绘图能够准确地向西北方向移动。然而,通过在
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;  
    }
  }
}

*此代码只能左右上下移动椭圆*

您需要使用
键侦听器来侦听键盘事件,然后根据按下的特定键在正确位置重新绘制对象。您可能还需要
repaint()
JPanel
,具体取决于图像的实现方式


请您发布一些代码,显示您正在尝试做什么,我们将尝试帮助您解决问题。要做的第一件事是验证
KeyListener
是否正常工作,因此
KeyListener
的代码可能是一个好的开始。

我会对每个方向(左、右、上和下)使用布尔值。因此,当另一个键盘事件发生时,它将检查其中一个箭头键是否仍被按下。例如,如果按(但不松开)右箭头键,右箭头键的布尔值将设置为true

这只是为了设置变量,现在是为了处理对角线方向。再次,转到您的按键方法。对于向上键和向下键,格式应该如下所示

if (keyCode == VK.DOWN) {
   if (leftKeyHeld) {
         DownLeft(); 
   } else if (rightKeyHeld) {
         DownRight();
   } else {
         Down();
   }

}

只需确保对于keyReleased方法,您将布尔值设置为false,这样程序就不会认为您一直在按住键,而不是一直按住键

您可能需要发布代码才能获得帮助。如果没有代码可查看,我们不知道您尝试了什么,请发布一些代码,这样我们就不必猜测解决方案请参见此处接受的答案:-多个键没有“事件”,因为键盘将它们作为单独的事件发送如果您的问题已得到回答,或者,如果它不再有效,请“勾选”以选择最合适的答案,这样每个人都知道问题已经解决。谢谢