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

جميع دروس الكائنات والصور

تدرّب بنفسك: Playground لـ Pygame