Я работаю над программой, которая имитирует объекты, движущиеся в поле. Поле имеет границу 1024х1024. Объект не может опускаться ниже 0 в терминах координат x, y и не может превышать 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;
}