@topi768

Как сделать плавный рывок для персонажа?

Есть класс игрока и у него есть метод для рывка (смещение по х на jerk_value)
jerk_value = 150
        i = 0
        if pg.time.get_ticks() - self.__last__jerk_ticks >= 1300:

            while i < jerk_value:
                if pg.time.get_ticks() - self.last_iteration_ticks_jerk > 500:
                    if self.last_direction == "right":
                        self.x += 1
                    else:
                        self.x -= 1
                    i += 1
                    self.last_iteration_ticks_jerk = pg.time.get_ticks()

            self.__last__jerk_ticks = pg.time.get_ticks()


pg.time.get_ticks() - self.__last__jerk_ticks >= 1300 - кулдаун для вырка, pg.time.get_ticks() - self.last_iteration_ticks_jerk > 500 - время между итерациями.
Хочу сделать плавный рывок, но срабатывает бесконечный цикл. В чем ошибка?
Сейчас метод выглядит так:
jerk_value = 150
        if pg.time.get_ticks() - self.__last__jerk_ticks >= 1300:

            if self.last_direction == "right":
                self.x += jerk_value
            else:
                self.x -= jerk_value
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Посмотрите внимательно на содержимое цикла. Там условие выхода из цикла привязано к счетчику, а счетчик увеличивается только при некотором условии. Другими словами, если случилось так, что это условие неверно и вы в цикле, то счетчик не будет меняться и проверка условия будет молотить вечно, ведь ничего не меняется. Так получается бесконечный цикл.
Вообще такие вещи лучше описывать параметрически. То есть можно описать функцию, которая возвращает координату абсолютную от времени.
Обычно это делается так. Описывается класс, потомки от которого будут описывать характер движения. Паттерн называется "Стратегия".
У персонажа есть состояние, например "равномерная ходьба". Это состояние определяет стратегию движения. То есть когда началась равномерная ходьба, создаётся инстанс этой стратегии, который запоминает время начала ходьбы, начальные координаты и определяет скорость. У стратегии движения есть метод, который возвращает координату от абсолютного времени. Под капотом из этого времени вычитается время начала движения, а потом по простой линейной формуле можно вычислить координату персонажа на любое заданное время. Как только состояние персонажа сменяется на "Рывок", создаётся новый инстанс новой стратегии под названием "Рывок". Она определяет внутри другую функцию вычисления координаты от времени. Скорость тоже может быть задана функцией внутри реализации стратегии.

Такой подход позволит гибко менять динамику игры, настраивать ее в широких пределах, добавлять новые фишки, и при этом код не будет засоряться кучей нечитабельной логики с +\- единицами, будет меньше ошибок.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы