التحريك باستخدام الوقت
جزء من قسم الكائنات والصور في رحلة 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.
التحدي
متوسط- أزِل
timerوالعدّاد. - في كل إطار، اضبط
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()
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame