Замедлить движение врага

Я делаю игру, используя 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, а затем использовал модульность, чтобы она не вызывалась так часто. Спасибо всем за попытку помочь.


person matt    schedule 29.12.2013    source источник
comment
if...elseif кажется избыточным - я бы минимизировал его до if..else, if...else. Кроме того, вы ничего не делаете, когда xPosition равно n.get(0).x, то же самое для оси y.   -  person MGorgon    schedule 29.12.2013
comment
Я не знаю, как реализована ваша программа, но в возвращаемом пути вы не должны обновлять позицию, а затем удалять этот элемент? вместо использования n.get(0) используйте n.removeFirst(). Мммм, один вопрос, вы звоните findPrey каждый шаг?   -  person Christian    schedule 29.12.2013
comment
@Christian: Боюсь, ОП ищет кратчайший путь в каждом цикле обновления.   -  person Martijn Courteaux    schedule 29.12.2013
comment
Да, я только что это отметил. И я просто не вижу проблемы.   -  person Christian    schedule 29.12.2013
comment
Да, он обновляется каждый раз из метода рендеринга в моем классе «мир» — мне нужно, чтобы это было, если еще, если, потому что я не хочу, чтобы зомби двигался, если координаты одинаковы — я просто хочу, чтобы он оставался неподвижным.   -  person matt    schedule 29.12.2013
comment
Кто-нибудь знает, как замедлить первую технику? то есть перемещать его плитками?   -  person matt    schedule 29.12.2013


Ответы (1)


Я предлагаю вам использовать таймеры. Тогда на каждом компьютере игра будет работать с одинаковой скоростью и движение ваших юнитов будет с фиксированным временем.

Юниты двигаются слишком быстро, потому что перемещается каждый юнит цикла. Количество циклов должно быть меньше или уменьшить расстояние, пройденное юнитами.

person Pawel    schedule 29.12.2013
comment
Хорошо, спасибо - попробую! Я пробовал с потоками, но это действительно замедляло работу программы. - person matt; 29.12.2013
comment
хммм, похоже, я не могу заставить это работать - оно просто задерживает его изначально - на любой интервал - а затем очень быстро проходит. - person matt; 29.12.2013
comment
В конце задержка должна быть обратно пропорциональна времени, затраченному на расчеты и показ графиков. - person Pawel; 03.01.2014