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()

כל השיעורים ביחידה חוקי המשחק

תרגלו בעצמכם: Pygame אונליין