Java 移动物体被卡在角落里

Java 移动物体被卡在角落里,java,coordinates,move,motion,boundary,Java,Coordinates,Move,Motion,Boundary,我正在做一个程序,它模拟在一个领域中移动的物体。该字段的边界为1024x1024。该对象的x、y坐标不能低于0,也不能高于1024。我对每个对象都有一个称为move的方法,它以当前速度沿当前方向移动对象。如果对象接近边界,它将以新的方向和相同的速度旋转 我遇到的问题是,当我的一个对象接近场的x和y边界角时,它会卡在角上。它几乎就像是在试图从拐角处移开,但随后又转回来了。它一定很喜欢那个角落。我查看了我的代码,对我来说,我的逻辑似乎是正确的。我检查以确保新方向不是负值或超过359。我检查以确保新方

我正在做一个程序,它模拟在一个领域中移动的物体。该字段的边界为1024x1024。该对象的x、y坐标不能低于0,也不能高于1024。我对每个对象都有一个称为move的方法,它以当前速度沿当前方向移动对象。如果对象接近边界,它将以新的方向和相同的速度旋转

我遇到的问题是,当我的一个对象接近场的x和y边界角时,它会卡在角上。它几乎就像是在试图从拐角处移开,但随后又转回来了。它一定很喜欢那个角落。我查看了我的代码,对我来说,我的逻辑似乎是正确的。我检查以确保新方向不是负值或超过359。我检查以确保新方向的新x,y坐标也在边界内。我甚至有一个方法来设定一个新的方向

我尝试用不同的逻辑重新实现这个方法,但没有成功。如果有人能在我的程序中发现一个缺陷或指出可能的原因,那将不胜感激

我试着调试并逐步完成我的程序,我看到当它到达拐角处时,它会改变方向转向,移动大约3个空格,然后返回拐角处。那一定是个很棒的角落

移动方法的代码如下:

public void move(){

  localX = super.getX();
  localY = super.getY();

  float newX=0, newY=0;
  float testX, testY;
  boolean acceptX = false, acceptY = false;

  testX = (float) (Math.cos(direction)*10) + localX;
  testY = (float) (Math.sin(direction)*10) + localY;
  int testDirection;

  while(!acceptX){
   if(testX >= 0 && testX <= bound){
    newX = testX;
    acceptX = true;
   }//end if statement
   else{
    if(direction+180 > 359){
     setDirection(direction-180);
     testX = (float) (Math.cos(Math.toRadians(direction))*speed) + localX;
    }
    else{
     setDirection(direction+180);
     testX = (float) (Math.cos(Math.toRadians(direction))*speed) + localX;
    }
   }//end else
  }//end while that checks for X value

  while(!acceptY){
   if(testY >= 0 && testY <= bound){
    newY = testY;
    acceptY = true;
   }//end if statement
   else{
    if(direction+180 > 359){
     setDirection(direction-180);
     testY = (float) (Math.sin(Math.toRadians(direction))*speed) + localY;
    }
    else{
     setDirection(direction+180);
     testY = (float) (Math.sin(Math.toRadians(direction))*speed) + localY;
    }
   }//end else
  }//end while that checks for Y value

  super.setX(newX);
  super.setY(newY);

 }

我真的建议将方向存储为向量x,y,而不是从标量计算向量;我认为这对你的代码会有很大的帮助。

我真的建议你将方向存储为向量x,y,而不是从标量计算向量;我认为这对你的代码会有很大的帮助。

问题:当你的物体碰到边缘时,你将它旋转180度。如果它击中两个边缘,它将在适当的位置旋转,测试坐标将始终位于错误的位置


当你的一个物体碰到一个边缘时,它需要反弹,而不是面对面!入射角==折射角,或类似的角度。换句话说,如果你正在检查x坐标,它会反弹,那么否定x速度,而不是x和y速度。

问题:当你的对象碰到边缘时,你会将其旋转180度。如果它击中两个边缘,它将在适当的位置旋转,测试坐标将始终位于错误的位置


当你的一个物体碰到一个边缘时,它需要反弹,而不是面对面!入射角==折射角,或类似的角度。换句话说,如果你在检查x坐标,它会反弹,那么否定x速度,而不是x和y。假设你在左上角有一个物体,向上。你的第一次测试将它转过来,这样它就会下降。然后是你的第二张支票,它又一次把它转起来。。。再说一遍

您的代码还可以使用更高的可读性。我注意到的第一件事是,您正在使用>359检查来规范化新的方向。然而,所有情况下都包括运动代码。我会这样做:

setDirection(direction + 180);          //turn around
if (direction >= 360) direction -= 360; //normalize
testY = ...;                            //move

将移动代码移出方向检查if/else块。360也是一个更好的魔术数字使用;359度毫无意义。正如所建议的那样,你最终应该使用一个向量库,从而扔掉大部分的数学知识。

假设你在左上角有一个对象,向上。你的第一次测试将它转过来,这样它就会下降。然后是你的第二张支票,它又一次把它转起来。。。再说一遍

您的代码还可以使用更高的可读性。我注意到的第一件事是,您正在使用>359检查来规范化新的方向。然而,所有情况下都包括运动代码。我会这样做:

setDirection(direction + 180);          //turn around
if (direction >= 360) direction -= 360; //normalize
testY = ...;                            //move

将移动代码移出方向检查if/else块。360也是一个更好的魔术数字使用;359度毫无意义。正如所建议的,您最终应该使用一个向量库,从而放弃大部分数学。

我们还需要设置方向的代码。可能出于某种原因,它偏向于向拐角移动。没问题,添加在上面。setDirectiondirection+180%360。去掉那些if's。我们还需要设置方向的代码。可能出于某种原因,它偏向于向拐角移动。没问题,添加在上面。setDirectiondirection+180%360。去掉那些if,我从来没有用向量来存储方向。我能把x和y分量存储在向量中吗?@Seephor:是的,就是这个想法。关键是那些触发功能很昂贵;当沿直线移动时,实际矢量将保持一致或被另一个矢量修改,节省这些触发函数的计算费用非常有用。当你需要方向时,你可以从反三角函数,弧函数中得到。我从来没有用向量来存储方向。我能把x和y分量存储在向量中吗?@Seephor:是的,就是这个想法。关键是
t这些触发功能很昂贵;当沿直线移动时,实际矢量将保持一致或被另一个矢量修改,节省这些触发函数的计算费用非常有用。当你需要方向时,你可以从反三角函数和弧函数中得到。好的,谢谢。我决定使用上面提到的参数来清理它。向+180%360方向传球。我实际上使用Java向量库来存储在字段中移动的对象,但是如何使用它来表示坐标呢?我指的是数学向量。这些东西:好的,谢谢。我决定使用上面提到的参数来清理它。向+180%360方向传球。我实际上使用Java向量库来存储在字段中移动的对象,但是如何使用它来表示坐标呢?我指的是数学向量。这些东西: