我正在开发一个程序,该程序模拟在字段中移动的对象。该字段的边界为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;
    }

最佳答案

假设您在左上角有一个物体,上升了。您的第一个测试将其扭转,因此下降。然后是第二张支票,它再次转过来向上……。

您的代码还可以使用一些可读性。我注意到的第一件事是您正在使用>359检查来规范要进入的新方向。但是,所有情况下都包括运动代码。我会做类似的事情:

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


将移动代码移出方向,检查是否存在其他块。 360也是更好使用的幻数; 359度没有任何意义。如建议的那样,您最终应该使用向量库,从而放弃大部分数学运算。

09-26 10:11