Я делаю простую игру для iPhone, используя cocos2d-iphone.У меня есть множество злодеев, «fiendSet», который должен перемещаться по полю, полному препятствий.Я провел последние три ночи, пытаясь заставить свой A * найти дорогу к работе.Я нашел фактическую реализацию A * здесь на stackoverflow, и она работает блестяще.Однако, как только я пытаюсь перемещать своих извергов, у меня возникают проблемы.
У каждого из моих извергов есть CGPoint с именем motionTarget, который содержит значения 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 одновременно.Надеюсь, это объяснение достаточно ясное ..
Я почти уверен, что у меня где-то есть логическая ошибка ... Я просто не смог выяснить это за последние три бессонные ночи после работы .. Помощь!