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