Как мне заставить моего персонажа менять спрайт (анимировать) в зависимости от скорости?

Итак, я делаю фанатскую игру Sonic просто для развлечения в Pygame, чтобы узнать об игровых движках, игровой физике и т. д. Теперь я пытаюсь анимировать своего персонажа.

Вот мой подход: когда Соник движется, его скорость не всегда одинакова. Он «разгоняется». Он переходит со скорости 1 на 6 (в моем случае) во время игры. Вот что я подумал:

  • Когда Соник не двигается, он отображает свою анимацию бездействия.
  • Когда скорость Соника < max_speed, он отображает анимацию ходьбы и бега (в зависимости от его скорости).
  • Когда Соник достигает max_speed, он циклически повторяет свою анимацию бега.
  • Когда Соник не на земле, он отображает анимацию прыжка. (пока не реализовано)

Каждая из этих анимаций циклически проходит через собственный массив анимаций. (self.iddle для анимации бездействия и т. д.)

      def animation_state(self):
        if self.speed == 0: #animation if player is not moving
            self.iddle_animation_index += 0.1
            self.walk_animation_index = 0
            self.run_animation_index = 0

            if self.iddle_animation_index >= len(self.iddle): self.iddle_animation_index = 0
            self.image = self.iddle[int(self.iddle_animation_index)]

        if self.speed > 0 and self.speed < self.max_speed: #animation if player is moving
            self.walk_animation_index = int(len(self.walk)/self.speed) #NEEDS FIX
            self.iddle_animation_index = 0
            self.run_animation_index = 0

            if self.speed < 1: #if speeds bugs
                self.walk_animation_index = 0
            
            self.image = self.walk[self.walk_animation_index]

        if self.speed >= self.max_speed: #loop animation at top speed
            self.run_animation_index += self.acceleration/(self.max_speed/len(self.run)) #NEEDS FIX
            self.iddle_animation_index = 0
            self.walk_animation_index = 0

            if self.run_animation_index >= len(self.run): self.run_animation_index = 0
            self.image = self.run[int(self.run_animation_index)]

Итак, у меня проблемы с "сильным" пунктом в списке. Я не знаю «формулы», поэтому я могу правильно перебирать эти анимации. Я пробовал разные вещи, но ничего не работает должным образом. Я хочу, чтобы это работало так же, как в Sonic Advanced.

Если у вас есть лучший подход к этой проблеме или вы знаете, как это сделать, пожалуйста, помогите мне.

0 ответов

Другие вопросы по тегам