Мое понимание вашего вопроса состоит в том, что вы sh Игрок спрайт, чтобы "повернуть" направление самого предыдущего движения. Например, если игрок в последний раз двигался влево, спрайт должен отображаться как лицом влево.
Подобного рода вещи довольно легко достигаются путем установки значения Sprite image
в правильное растровое изображение. Этому нет никакого объяснения, поэтому я не совсем понимаю, что представляет собой «HeatBox», поэтому я буду игнорировать это. И image
, и rect
являются специальными для PyGame Sprite Class . Они используются кодом библиотеки спрайтов для рисования и обнаружения столкновений для спрайта. Было бы лучше использовать другое имя переменной для каких-то других целей.
class Player(pygame.sprite.Sprite):
DIR_LEFT = 0
DIR_RIGHT= 1 # This might be better as an Enumerated Type
DIR_UP = 2
DIR_DOWN = 3
def __init__(self):
super().__init__()
self.velocity = 5
self.heat_box = constants.S_PLAYER_HEATBOX
self.heat_rect = self.HeatBox.get_rect()
self.image = S_PLAYER_LEFT[0] # Initially face left
self.rect = self.image.get_rect()
self.rect.x = 500
self.rect.y = 300
self.walk_count= 0 # animation frame count
self.last_dir = Player.DIR_LEFT # direction last walked
def move_right(self):
if ( self.last_dir != Player.DIR_RIGHT ): # changed direction?
self.walk_count = -1 # so next-frame is 0
self.last_dir = Player.DIR_RIGHT # now face right
# continue walking right
self.rect.x += self.velocity
self.walk_count += 1
if ( walk_count >= len( S_PLAYER_W_RIGHT ) ): # loop the animation
self.walk_count = 0
self.image = S_PLAYER_W_RIGHT[ self.walk_count ]
def move_left(self):
if ( self.last_dir != Player.DIR_LEFT ): # changed direction?
self.walk_count = -1 # so next-frame is 0
self.last_dir = Player.DIR_LEFT # now face left
# continue walking left
self.rect.x -= self.velocity
self.walk_count += 1
if ( walk_count >= len( S_PLAYER_W_LEFT ) ): # loop the animation
self.walk_count = 0
self.image = S_PLAYER_W_LEFT[ self.walk_count ]
# TODO: Much the same for Up/Down too
При изменении направления счетчик animation-l oop (walk_count
) сбрасывается, и растровое изображение для нового направление, присвоенное Player.image
и запоминаемое в Player.last_dir
.
Таким образом, в основном класс Player
запоминает как направление, на которое направлен спрайт, так и то, какой кадр анимации был нарисован ранее. Если игрок продолжает двигаться в том же направлении, анимация будет проходить для каждого движения. Если направление изменилось, анимация сбрасывается для другого набора растровых изображений.
Чтобы привлечь игрока на экран, добавьте его в группу спрайтов и скажите группе: Нарисуй себя в своей главной л oop. В качестве бонуса вы также можете использовать все функции столкновения между группами спрайтов .
player_group = pygame.sprite.GroupSingle()
player_group.add( Player() ) # create the player
...
# main loop
player_group.draw( screen )
Примечание: CamelCase имена переменных изменены на lower_case для соответствия Руководство по PEP-8 .