Menu
CoddyTech

הנפשה לפי זמן

חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 27 מתוך 36.

מונה פריימים קושר את האנימציה לקצב הפריימים. במחשב שמציג רק 30 פריימים בשנייה, כנפי החרק מתנופפות בחצי מהמהירות. קשרו אותה לזמן במקום זאת.

pygame.time.get_ticks() הוא מספר האלפיות השנייה שחלפו מאז pygame.init(). חלקו במשך הזמן שכל תמונה אמורה להופיע, ותקבלו כמה תמונות חלפו; % הופך את המספר הזה לאינדקס:

frame_index = pygame.time.get_ticks() // 120 % len(frames)

מ־0 עד 119 אלפיות השנייה זו תמונה 0, מ־120 עד 239 אלפיות השנייה זו תמונה 1, ואז 2, ואז שוב 0. אין צורך במונה שצריך לשמור ולאפס: שורה אחת, שמחושבת מחדש בכל פריים. אם המשחק מאט, האנימציה מדלגת על תמונה במקום להאט יחד איתו.

// מחלק ומשמיט את השארית: 250 // 120 הוא 2. בשורה השלישית של הגיליון הזה מופיע חרק מעופף בשלוש תנוחות, בעמודות 6 עד 8, שכבר נחתכו ל־frames.

challenge icon

אתגר

בינוני
  1. הסירו את timer ואת המונה.
  2. בכל פריים, קבעו את frame_index מתוך pygame.time.get_ticks(), כך שכל אחת משלוש התמונות תוצג במשך 120 מילישניות, לפי הסדר.

נסו בעצמכם

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Flying Bug")
clock = pygame.time.Clock()

sheet = pygame.image.load("assets/sheets/platformer_characters.png").convert_alpha()
frames = []
for col in (6, 7, 8):
    frame = sheet.subsurface((col * 24, 48, 24, 24))
    frames.append(pygame.transform.scale_by(frame, 3))
frame_index = 0
timer = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    timer += 1
    if timer == 10:
        timer = 0
        frame_index = (frame_index + 1) % len(frames)

    screen.fill((20, 22, 40))
    image = frames[frame_index]
    screen.blit(image, image.get_rect(center=(320, 240)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

כל השיעורים ביחידה ספרייטים ותמונות

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