رسوم الجري المتحركة
جزء من قسم قواعد اللعبة في رحلة Pygame على Coddy. الدرس 25 من 29.
ينساب العداء. تحتوي الحزمة على صورة ثانية للبطل نفسه، player_walk.png، وساقاه متباعدتان. يجعل التبديل بين الصورتين العداء يركض.
احتفظ بالصورةَين في قائمة، وأحصِ الإطارات. تزداد قيمة self.step // 8 بمقدار 1 كل 8 إطارات، وتحولها % 2 إلى التسلسل 0، 1، 0، 1:
if self.rect.bottom == GROUND_Y:
self.step += 1
self.image = self.frames[self.step // 8 % 2]
else:
self.image = self.frames[1]إن عرض كل صورة لمدة 8 إطارات يعادل نحو سبع خطوات في الثانية عند 60 إطارًا في الثانية. عدد أقل من الإطارات يجعله يركض أسرع، وعدد أكبر يجعله أبطأ.
في الهواء لا يوجد ما يركض عليه، لذا يحتفظ العداء بصورة واحدة حتى يهبط. حمّل الصورتين مرة واحدة في __init__، وبدّل الصورة التي يشير إليها self.image: سترسم المجموعة أو عملية blit أيّ صورة يشير إليها.
التحدي
متوسط- حمّل
player.pngوplayer_walk.pngفي قائمة،self.frames، مع بدءself.imageبالإطار الأول وself.step = 0. - في
update()، عندما تكون على الأرض، احسب خطوة واعرضself.frames[self.step // 8 % 2]. - في الهواء، اعرض
self.frames[1].
جرّب بنفسك
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()
SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1
class Runner(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load("assets/images/player.png").convert_alpha()
self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
self.vy = 0
def jump(self):
if self.rect.bottom == GROUND_Y:
self.vy = -16
def update(self):
self.vy += GRAVITY
self.rect.y += self.vy
if self.rect.bottom >= GROUND_Y:
self.rect.bottom = GROUND_Y
self.vy = 0
runner = Runner()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
runner.jump()
runner.update()
screen.fill(SKY)
pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
screen.blit(runner.image, runner.rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
جميع دروس قواعد اللعبة
تدرّب بنفسك: Playground لـ Pygame