我正在开发一个程序,该程序模拟在字段中移动的对象。该字段的边界为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度没有任何意义。如建议的那样,您最终应该使用向量库,从而放弃大部分数学运算。