如何在Java中平滑地360度移动图形对象?

如何在Java中平滑地360度移动图形对象?,java,user-interface,graphics,Java,User Interface,Graphics,我正在尝试制作一款几何战争风格的游戏,但我遇到了一个障碍。我一直在试图找到一种方法来平滑地移动我的图形对象。但它只朝一个方向移动。例如,如果我按下“向上”按钮,它就会向上移动,然后当我按下上面的右按钮时,我会沿着对角线向右上方移动。但是我想让我的物体平稳地从直线上升到右上角。这是我目前的代码: public class MoveTest extends JPanel implements ActionListener, KeyListener { Timer t = new Timer(5,

我正在尝试制作一款几何战争风格的游戏,但我遇到了一个障碍。我一直在试图找到一种方法来平滑地移动我的图形对象。但它只朝一个方向移动。例如,如果我按下“向上”按钮,它就会向上移动,然后当我按下上面的右按钮时,我会沿着对角线向右上方移动。但是我想让我的物体平稳地从直线上升到右上角。这是我目前的代码:

public class MoveTest extends JPanel implements ActionListener, KeyListener {

Timer t = new Timer(5, this);
double x = 0, y = 0, velX = 0, velY = 0;
 private Set<Integer> pressed = new HashSet<Integer>();
private static int WIDTH = 800;
private static int HEIGHT = 600;
private double d = 0;
private double topSpeed = 0;
private boolean stop = false;
private double a = 0;

PVector location;
PVector velocity;
PVector acceleration;

public MoveTest() {
  location = new PVector(WIDTH/2,HEIGHT/2);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  topSpeed = 5.0;
  t.start();
  addKeyListener(this);
  setFocusable(true);
  setFocusTraversalKeysEnabled(false);
}

public void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;
  g2.setColor(Color.GREEN);
  g2.drawOval((int)location.x, (int)location.y, 40, 40);
}

void update() {
  velocity.add(acceleration);
  if(stop == false) {
    velocity.limit(topSpeed);
  }
  else {
    velocity.decellerate(0);
  }
  location.add(velocity);    
}

public void north() {
  acceleration = new PVector(0,-5);
}

public void south() {
  acceleration = new PVector(0,5);
}

public void west() {
  acceleration = new PVector(-5,0);
}

public void east() {
  acceleration = new PVector(5,0);
}

public void northEast() {
  acceleration = new PVector(5,-5);
}

public void northWest() {
  acceleration = new PVector(-5,-5);
}

public void southEast() {
  acceleration= new PVector(5,5);
}

public void southWest() {
  acceleration = new PVector(-5,5);
}

public void stop(){
  stop = true;
}


public void actionPerformed(ActionEvent arg0) {
  //System.out.println("" + velocity.x + " " + velocity.y);
  repaint();
  update();
  checkEdges();
}

public void keyPressed(KeyEvent e) {

int code = e.getKeyCode();

stop = false;

pressed.add(code);

if(pressed.size() > 1) {
  if(pressed.contains(KeyEvent.VK_W) && pressed.contains(KeyEvent.VK_D)) {
    northEast();
  }
  if(pressed.contains(KeyEvent.VK_W) && pressed.contains(KeyEvent.VK_A)) {
    northWest();
  }
  if(pressed.contains(KeyEvent.VK_S) && pressed.contains(KeyEvent.VK_D)) {
    southEast();
   }
  if(pressed.contains(KeyEvent.VK_S) && pressed.contains(KeyEvent.VK_A)) {
    southWest();
  } 
}

else if(pressed.size() == 1){
  if(code == KeyEvent.VK_W) {
    north();
  }
  if(code == KeyEvent.VK_S) {
    south();
  }
  if(code == KeyEvent.VK_D) {
    east();
  }
  if(code == KeyEvent.VK_A) {
    west();
  }
}
}

public void keyReleased(KeyEvent e) {
  pressed.remove(e.getKeyCode());
  if(pressed.size() == 0) {
    stop();
  }
}

public void keyTyped(KeyEvent e) {

}

void checkEdges() {
  if(location.x > WIDTH) {
    location.x = 0;
  }
  else if(location.x < 0) {
    location.x  = WIDTH;
  }
  if(location.y > HEIGHT) {
    location.y = 0;
  }
  else if(location.y < 0) {
    location.y = HEIGHT;
  }
}

}
公共类MoveTest扩展JPanel实现ActionListener、KeyListener{
定时器t=新定时器(5,此);
双x=0,y=0,velX=0,velY=0;
private Set pressed=new HashSet();
专用静态整数宽度=800;
专用静态整数高度=600;
私人双d=0;
私人双上速度=0;
私有布尔停止=false;
私人双a=0;
PVector定位;
PVector速度;
PVector加速度;
公共交通测试{
位置=新的PVector(宽度/2,高度/2);
速度=新的PVector(0,0);
加速度=新PVector(0,0);
顶速=5.0;
t、 start();
addKeyListener(此);
设置聚焦(真);
setFocusTraversalKeysEnabled(false);
}
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
g2.设置颜色(颜色为绿色);
g2.drawOval((int)location.x,(int)location.y,40,40);
}
无效更新(){
速度加(加速度);
如果(停止==false){
速度极限(最高速度);
}
否则{
减速速度(0);
}
位置。添加(速度);
}
公共空间北(){
加速度=新PVector(0,-5);
}
公共空间南部(){
加速度=新PVector(0,5);
}
公共空间(西){
加速度=新PVector(-5,0);
}
东区公众假期(){
加速度=新PVector(5,0);
}
公共图书馆{
加速度=新PVector(5,-5);
}
公共空间(西北){
加速度=新PVector(-5,-5);
}
公共空间{
加速度=新PVector(5,5);
}
公共空间{
加速度=新PVector(-5,5);
}
公共停车场(){
停止=真;
}
已执行的公共无效操作(操作事件arg0){
//System.out.println(“+velocity.x+”+velocity.y);
重新油漆();
更新();
检查边();
}
按下公共无效键(按键事件e){
int code=e.getKeyCode();
停止=错误;
按下。添加(代码);
如果(按下.size()>1){
if(pressed.contains(KeyEvent.VK_W)和&pressed.contains(KeyEvent.VK_D)){
东北();
}
if(pressed.contains(KeyEvent.VK_W)和&pressed.contains(KeyEvent.VK_A)){
西北();
}
if(pressed.contains(KeyEvent.VK_S)和pressed.contains(KeyEvent.VK_D)){
东南();
}
if(pressed.contains(KeyEvent.VK_S)和pressed.contains(KeyEvent.VK_A)){
西南();
} 
}
else if(按.size()==1){
if(code==KeyEvent.VK_W){
北();
}
if(code==KeyEvent.VK_S){
南部();
}
if(code==KeyEvent.VK\u D){
东方();
}
if(code==KeyEvent.VK_A){
西();
}
}
}
公共无效密钥已释放(密钥事件e){
按下。移除(如getKeyCode());
如果(按下.size()==0){
停止();
}
}
public void keyTyped(KeyEvent e){
}
void checkEdges(){
如果(位置x>宽度){
位置x=0;
}
else if(位置x<0){
位置x=宽度;
}
如果(位置y>高度){
位置y=0;
}
else if(位置y<0){
位置y=高度;
}
}
}
任何帮助都将不胜感激

//MoveTest
topSpeed = 5.0;

//update
velocity.add(acceleration);
if(stop == false) {
  velocity.limit(topSpeed);

//south
acceleration = new PVector(0,5);
所以你的加速度总是5或7(这可能是一个错误)单位,如果你按下你的键。然后把这个加到速度上,速度限制在5。你的加速度很强,几乎没有惯性。尝试更小的加速或更大的上速度,它会变得更平滑

旁白:你是在补偿帧速率吗?我没有在您的代码中看到它,但我不知道
PVector
的实现

所以你的加速度总是5或7(这可能是一个错误)单位,如果你按下你的键。然后把这个加到速度上,速度限制在5。你的加速度很强,几乎没有惯性。尝试更小的加速或更大的上速度,它会变得更平滑


旁白:你是在补偿帧速率吗?我没有在您的代码中看到它,但我不知道
PVector
的实现。

我明白您的观点。那么,我应该加上加速度向量还是减法,让它移动得更快或更慢,然后将限制设置为特定的上速度,这样它就不会继续加速了?另外,我对PVector类的想法来自于我在设置加速度上限时遇到的问题。例如,我的对象不会沿对角线移动。如果我按右键,它会向右移动,但当我按向上键时,它会直接向上移动。你有什么建议或好的网站来了解我在做什么吗?我一直很难找到关于这方面的好信息。@Heisenburg我认为首先决定一个运动模型对你来说很重要。一个这样的模型将是一辆汽车,它有一个航向和一个可以独立操纵的速度,并且运动总是沿着航向的方向。另一种是“太空船”,你有一个2D/3D的速度,可以通过在任何方向施加加速度来改变它。最好考虑一下,然后再问一次。我明白你的意思。那么,我应该加上加速度向量还是减法,让它移动得更快或更慢,然后将限制设置为特定的上速度,这样它就不会继续加速了?另外,我对PVector类的想法来自于我在设置加速度上限时遇到的问题。例如,我的对象不会沿对角线移动。如果我按右键,它会向右移动,但当我按向上键时,它会直接向上移动。你有什么建议或好的网站来了解我在做什么吗?我一直很难找到这方面的好信息。@Heisenburg我认为首先决定mo对您来说很重要