Menu
CoddyTech

رسوم الجري المتحركة

جزء من قسم قواعد اللعبة في رحلة 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 أيّ صورة يشير إليها.

challenge icon

التحدي

متوسط
  1. حمّل player.png وplayer_walk.png في قائمة، self.frames، مع بدء self.image بالإطار الأول وself.step = 0.
  2. في update()، عندما تكون على الأرض، احسب خطوة واعرض self.frames[self.step // 8 % 2].
  3. في الهواء، اعرض 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