1

我正在开发一个模拟在田野中移动的物体的程序。该字段的边界为 1024x1024。就 x,y 坐标而言,该对象不能低于 0,也不能高于 1024。我为每个对象提供了一个名为“move()”的方法,该方法以当前速度沿当前方向移动对象。如果物体接近边界,它就会以新的方向和相同的速度转身。

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

我试过用不同的逻辑重新实现这个方法,但没有运气。如果有人可能在我的编程中发现缺陷或指出可能导致它的原因,那将不胜感激。

我尝试调试并逐步执行我的程序,我看到当它到达拐角时,它改变方向转身,移动大约 3 个空格,然后回到拐角处。一定是一个美妙的角落。

move方法的代码如下:

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;
    }
4

3 回答 3

2

假设您在左上角有一个物体,向上。你的第一个测试把它转过来,所以它下降了。然后是你的第二次检查,它再次转身向上......再次。

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

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

将移动代码移出检查 if/else 块的方向。360 也是一个更好用的幻数;359度没有任何意义。正如建议的那样,您最终应该使用向量库,从而丢弃大部分数学。

于 2010-11-12T00:53:53.970 回答
1

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

于 2010-11-12T00:48:48.747 回答
1

问题:当您的对象碰到边缘时,您将其旋转 180 度。如果它碰到两个边缘,它将原地旋转,并且测试坐标将始终位于错误的位置。

当您的一个物体撞到边缘时,它需要反弹,而不是 About Face!入射角==折射角,或类似的。换句话说,如果您正在检查 x 坐标并且它反弹,则否定 x 速度,而不是 x 和 y。

于 2010-11-12T00:53:16.590 回答