私はしばらくの間これと戦ってきました、そして私の初心者の脳はそれを完全に解決することができません。私は標準のタイルマップを持っており、現在次のコードを使用して敵のスプライトをマップ内で移動させています
-(void) movePlayer:(ccTime)deltaTime {
if (CGPointEqualToPoint(self.position, requestedPosition))
return;
float step = kPlayerSpeed * deltaTime;
float dist = ccpDistance(self.position, requestedPosition);
CGPoint vectorBetweenAB = ccpSub(self.position, requestedPosition);
if (dist <= step) {
self.position = requestedPosition;
[self popPosition];
} else {
CGPoint normVectorBetweenAB = ccpNormalize(vectorBetweenAB);
CGPoint movementVectorForThisFrame = ccpMult(normVectorBetweenAB, step);
if (abs(vectorBetweenAB.x) > abs(vectorBetweenAB.y)) {
if (vectorBetweenAB.x > 0) {
[self runAnimation:walkLeft];
} else {
[self runAnimation:walkRight];
}
} else {
if (vectorBetweenAB.y > 0) {
[self runAnimation:walkDown];
} else {
[self runAnimation:walkUp];
}
}
if (self.position.x > movementVectorForThisFrame.x) {
movementVectorForThisFrame.x = -movementVectorForThisFrame.x;
}
if (self.position.y > movementVectorForThisFrame.y) {
movementVectorForThisFrame.y = -movementVectorForThisFrame.y;
}
self.position = ccpAdd(self.position, movementVectorForThisFrame);
}
}
movePlayer:は、クラスupdateWithDeltaTime:メソッドによって呼び出されます。ivar requestedPositionはupdateWithDeltaTimeメソッドでも設定され、基本的にキューから次のポイントを取得して移動します。これらのポイントはマップ上のどこにでも配置できるため、敵から対角線方向にある場合、敵のスプライトはそのポイントに直接移動します。しかし、上記のコードを変更して、移動を垂直および水平の移動のみに制限し、敵の移動がマンハッタン距離をとって斜めの経路に沿って「階段」するようにするにはどうすればよいですか(私はそれが呼ばれていると思います)。下の大まかな図に示されているように...Sは始点であり、Fは終点であり、数字はその経路に沿った各中間点であり、階段タイプの斜めの動きを作成します。最後に、この動作のオンとオフを切り替えることができるようにするつもりです。
| | | | | | | | | |
| | | | | | | | | |
| |F| | | | | | | |
| |5|4| | | | | | |
| | |3|2| | | | | |
| | | |1|S| | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |