Я делаю игру, используя slick2d, и создал алгоритм поиска пути, который позволит «зомби» найти кратчайший путь к главному герою.
public void findPrey(int characterXPosition,int characterYPosition){
Pathfinder p = new Pathfinder();
n = p.aStar(xPosition,yPosition,characterXPosition,characterYPosition);
//n is a linked list which holds node objects in the path
if(!n.isEmpty()){
xPosition = (n.get(0).x);
yPosition = (n.get(0).y);
}
}
На данный момент это работает, но зомби просто перемещается на плитку (32x32) очень быстро - слишком быстро!
Вместо этого я попробовал это:
if(xPosition > n.get(0).x){
xPosition -= .1f * delta;
}
else if(xPosition < n.get(0).x){
xPosition += .1f * delta;
}
if(yPosition < n.get(0).y){
yPosition += .1f * delta;
}
else if(yPosition > n.get(0).y){
yPosition -= .1f * delta;
}
Что работает, только если зомби идет вверх или влево — даже тогда он действительно нервничает, и если он должен идти вниз или вправо, он сходит с ума и просто продолжает подниматься за пределы экрана.
Итак, кто-нибудь знает, как я могу замедлить движение первой техники или узнать, почему вторая не работает? Спасибо за любую помощь!
РЕДАКТИРОВАТЬ - ОТВЕТ
Хорошо, нашел решение - было довольно просто, я думаю, что просто смотрел на один и тот же код в течение нескольких часов.
В методе рендеринга моего класса «мир», где рендерились зомби, я просто вставил это изменение:
Iterator<Zombie> i = zombies.iterator();
while (i.hasNext()) {
Zombie z = i.next();
if (!z.isDead()) {
z.updateDelta(newDelta);
z.incrementCounter(); //put a counter variable in
if(z.getCounter() % 40 == 0){
z.findPrey((int)shiftX,(int)shiftY);
}
z.render(gc, sbg, g);
}else{
i.remove();
}
}
Поэтому я просто добавил переменную-счетчик в класс Zombie, а затем использовал модульность, чтобы она не вызывалась так часто. Спасибо всем за попытку помочь.
n.get(0)
используйтеn.removeFirst()
. Мммм, один вопрос, вы звонитеfindPrey
каждый шаг? - person Christian   schedule 29.12.2013