我一直在爭奪這一段時間,我的小白腦子不能完全解決它。我有一個標準的瓦片地圖,目前使用下面的代碼將我的敵人精靈地圖限制精靈運動,水平和垂直
-(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| | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
進一步,如果有人有任何意見,以幫助優化我目前的移動代碼那麼這將是可怕的...謝謝 –