我正在使用 cocos2d-iphone 制作一个简单的 iPhone 游戏。我有一系列恶魔,“fiendSet”必须在充满障碍的场地中导航。我花了最后三个晚上试图让我的 A* 寻路工作。我在 stackoverflow 上找到了实际的 A* 实现,它运行良好。然而,一旦我试图移动我的恶魔,我就会遇到麻烦。
我的每个恶魔都有一个名为 motionTarget 的 CGPoint,其中包含恶魔必须去的位置的 x 和 y 值。如果每秒只将位置 x 和 y 设置为绝对值,它可以工作,如下所示:
-(void) updateFiendPositions:(ccTime)dt {
for (MSWFiend *currFiend in fiendSet) {
currFiend.position = ccp(currFiend.motionTarget.x,currFiend.motionTarget.y);
}
}
然而,这看起来不太好,恶魔只是每秒“跳跃”20px,而不是很好地制作动画。我仅将其实现为占位符方法来验证寻路。现在我想要流畅的动画。这就是我所做的:
-(void) updatePositions:(ccTime) dt {
for (MSWFiend *currFiend in fiendSet) {
if (currFiend.motionTarget.x != -1 && currFiend.motionTarget.y != -1) {
float x,y;
if ((int)floor(currFiend.position.x) < (int)floor(currFiend.motionTarget.x)) {
x = currFiend.position.x+(currFiend.speed*dt);
}
if ((int)floor(currFiend.position.x) > (int)floor(currFiend.motionTarget.x)) {
x = currFiend.position.x-(currFiend.speed*dt);
}
if (abs((int)floor(currFiend.position.x)-(int)floor(currFiend.motionTarget.x)) < 2) {
x = currFiend.motionTarget.x;
}
if ((int)floor(currFiend.position.y) < (int)floor(currFiend.motionTarget.y)) {
y = currFiend.position.y+(currFiend.speed*dt);
}
if ((int)floor(currFiend.position.y) > (int)floor(currFiend.motionTarget.y)) {
y = currFiend.position.y-(currFiend.speed*dt);
}
if (abs((int)floor(currFiend.position.y)-(int)floor(currFiend.motionTarget.y)) < 2) {
y = currFiend.motionTarget.y;
}
currFiend.position = ccp(x,y);
}
}
}
这对于朝一个方向移动的恶魔非常有用。一旦恶魔应该绕过弯道,麻烦就开始了。而不是例如先向上,然后向右,然后向下;我的恶魔会把上/右运动合二为一,他们是“偷工减料”。我只希望我的恶魔在每次位置更新时都向北/向南或向东/向西移动,而不是同时向两者移动。换句话说,我不想同时对 x 和 y 的变化进行动画处理。我希望这个解释足够清楚..
我很确定我在某个地方有一个逻辑错误..我只是在下班后的最后三个不眠之夜无法弄清楚..帮助!