gpt4 book ai didi

ios - 将 Sprite 移动限制为垂直和水平

转载 作者:行者123 更新时间:2023-11-29 13:28:06 28 4
gpt4 key购买 nike

我已经为此苦苦挣扎了一段时间,但我的菜鸟大脑无法完全解决这个问题。我有一个标准的瓷砖 map ,目前使用以下代码在 map 上移动我的敌人 Sprite

-(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 方法中设置,它基本上从队列中获取下一个点以移动到。这些点可以在 map 上的任何地方,所以如果它们在敌人的对角线方向上,敌人 Sprite 将直接移动到那个点。但是我如何更改上面的代码以将移动限制为仅垂直和水平移动,以便敌人移动沿着对角线路径“楼梯”,采用曼哈顿距离(我认为它称为)。如下图所示... S 是起点 F 是终点,数字是沿其路径的每个中间点,以创建阶梯式对角线运动。最后,我打算能够打开和关闭此行为,这样我就可以选择是让敌人在 map 上自由移动还是仅限于水平/垂直移动。

 | | | | | | | | | |
| | | | | | | | | |
| |F| | | | | | | |
| |5|4| | | | | | |
| | |3|2| | | | | |
| | | |1|S| | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |

最佳答案

所以,我不确定是否有任何真正简单的方法可以做到这一点。我建议你计算你离终点有多远。然后得到y差和x差。然后,如果 y 差大于 x,则将 Sprite 向上移动设定的量。如果 x 差异较大,则将 Sprite 向左移动设定的量。这样 Sprite 将继续向上和向左移动,因为它会慢慢减小与终点的差异。这就是我推荐的逻辑。本质上:

CGPoint difference = ccpSub(finishPoint, startPoint);
//Be aware that this if statement will not work for negative distances. Only for the example you gave!
if(difference.y>difference.x) {
sprite.position = ccp(sprite.position.x, sprite.position.y+tileSize);
} else {
sprite.position = ccp(sprite.position.x+tileSize, sprite.position.y);
}

关于ios - 将 Sprite 移动限制为垂直和水平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12590531/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com