Анимация 2D-изображений Pygame отображается неправильноPython

Программы на Python
Ответить
Anonymous
 Анимация 2D-изображений Pygame отображается неправильно

Сообщение Anonymous »

Я создаю 2D-платформер с системой рукопашных атак. У меня есть только одно изображение кадра атакующей анимации, которое переворачивается на основе флага self.direction.
Основная проблема заключается в том, что когда я атакую лицом вправо self.direction == 'right', анимация меняется нормально, что создает оптическую иллюзию того, что игрок вытягивает меч вправо, однако, когда игрок смотрит влево, а не меч "качается" влево, анимация расширяется вправо, толкая изображение вправо (создавая впечатление, что игрока отталкивают назад, а не атакуют влево).
Я пробовал, чтобы ИИ исправил это за меня, я потратил несколько дней, пытаясь понять это, но не смог. Это репозиторий, который поможет вам получить больше контекста:

https://github.com/gabriel-caesar/Pytho ... r_travails
Изображение

Следуйте коду ниже:

Код: Выделить всё

# ./player.py

...

def animate(self):
# Handling flipping logic
if self.direction == 'right':
self.flip = False
elif self.direction == 'left':
self.flip = True

match self.animation_state:

case 'run':
self.player_frames = [ walk_1, walk_2, walk_3, walk_4 ]
self.animation_index += 0.1

if (self.animation_index > len(self.player_frames)):
self.animation_index = 0

self.image = pygame.transform.flip(self.player_frames[int(self.animation_index)], self.flip, False)

case 'attack':
self.player_frames = [ attack_2 ]

self.animation_index += 0.1

if (self.animation_index > len(self.player_frames)):
self.animation_index = 0

self.image = pygame.transform.flip(self.player_frames[int(self.animation_index)], self.flip, False)

case 'guard':
self.player_frames = [ guard_1 ]
self.image = pygame.transform.flip(self.player_frames[0], self.flip, False)

case 'jump':
self.player_frames = [ jump_1 ]
self.image = pygame.transform.flip(self.player_frames[0], self.flip, False)

case 'idle':
self.player_frames = [ idle_1 ]
self.image = pygame.transform.flip(self.player_frames[0], self.flip, False)
self.rect = self.image.get_rect()

...
Теперь я рисую спрайт игрока следующим образом:

Код: Выделить всё

# Initializing the player
player = Player(400, [800, 250])
playergroup = pygame.sprite.GroupSingle()
playergroup.add(player)
...
playergroup.draw(screen)
Затем в классе Player:

Код: Выделить всё

class Player(pygame.sprite.Sprite, Entity):
def __init__(self, hp, pos):
pygame.sprite.Sprite.__init__(self)
Entity.__init__(self, hp, pos)

# Animation flags
self.animation_state = 'idle'
self.animation_index = 0
self.player_frames = []

# Sprite rect and image
self.image = idle_1
self.rect = self.image.get_rect(midbottom = (pos[0], pos[1]))
...
Если вам нужен больше контекста, это класс Entity:

Код: Выделить всё

class Entity():
def __init__(self, hp, pos):
self.hp = hp
self.pos = pos
self.vertical_velocity = 0
self.movement = [0, 0]
self.air_timer = 0
self.flip = False
self.direction = 'right'
self.guarding = False
self.attacking = False
self.attack_cooldown = 0
Ибо, когда self.attacking становится истинным при нажатии буквы k на клавиатуре, анимация_state становится «attack», тогда self.player_frames загрузит атакующее изображение, скопирует его и на основе self.flip код перевернет его


Подробнее здесь: https://stackoverflow.com/questions/798 ... -wrong-way
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»