フィールド内を移動するオブジェクトをシミュレートするプログラムに取り組んでいます。フィールドの境界は1024x1024です。オブジェクトはx、y座標で0を下回ることはできず、1024を超えることもできません。オブジェクトを現在の方向に現在の速度で移動する「move()」というメソッドがあります。オブジェクトが境界に近づくと、新しい方向と同じ速度で向きを変えます。
私が抱えている問題は、オブジェクトの1つが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;
}