Как мне заставить моего персонажа менять спрайт (анимировать) в зависимости от скорости?
Итак, я делаю фанатскую игру 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.
Если у вас есть лучший подход к этой проблеме или вы знаете, как это сделать, пожалуйста, помогите мне.