移动物体卡在角落里

时间:2010-11-12 00:43:20

标签: java coordinates move motion boundary

我正在开发一个模拟在场中移动的物体的程序。该字段的边界为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);

 }

这里是setDirection的代码

public void setDirection(int d) {
        direction = d;
    }

3 个答案:

答案 0 :(得分:2)

假设左上角有一个物体,向上移动。你的第一个测试将它转过来,所以它会下降。然后是你的第二张支票,它再次转过来再次上升......

您的代码也可以使用更多的可读性。我注意到的第一件事是你正在使用>359检查来规范新方向。但是所有情况都包括移动代码。我会做类似的事情:

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

将移动代码移出检查if / else阻止的方向。 360也是一个更好用的神奇数字; 359度意味着什么。正如已经建议的那样,你最终应该使用一个矢量库,从而丢掉大部分数学。

答案 1 :(得分:1)

我真的建议将你的方向存储为矢量(x,y),而不是从标量计算该矢量;我认为这对你的代码非常有帮助。

答案 2 :(得分:1)

问题:当物体撞到边缘时,将其旋转180度。如果它碰到两个边缘,它就会旋转到位,测试坐标总是在错误的位置。

当你的一个物体撞到边缘时,它需要反弹,而不是关于脸!入射角==折射角,或某些此类。换句话说,如果你正在检查x坐标并且它反弹,则否定x速度,而不是x和amp; x。收率