Menu
CoddyTech

רעידת מסך

חלק מהיחידה צליל ותחושת משחק במסלול ה-Pygame של Coddy. שיעור 12 מתוך 23.

ארגז כבד פוגע בקרקע וכל התצוגה מיטלטלת לרגע. זהו רעידת מסך: במשך כמה פריימים, הכול מצויר בהיסט של כמה פיקסלים, ובכל פריים בכיוון אחר.

כדי להזיז הכול בבת אחת, ציירו את העולם על Surface משלו במקום על המסך, ואז בצעו blit של אותו Surface אל המסך בהיסט:

world = pygame.Surface((480, 360))

בלולאה, פקודות הציור שהשתמשו ב-screen משתמשות עכשיו ב-world. לאחר מכן בחרו את ההיסט:

offset = (0, 0)
if shake > 0:
    amount = shake // 3
    offset = (random.randint(-amount, amount), random.randint(-amount, amount))
    shake -= 1
screen.fill((0, 0, 0))
screen.blit(world, offset)

shake סופר את מספר הפריימים שנותרו לרעידה. נחיתה מגדירה אותו ל-12. מכיוון ש-amount הוא shake // 3, בפריימים הראשונים התזוזה היא עד 4 פיקסלים, ואז 3, 2, 1 ולבסוף אפס: הטלטלה נחלשת בהדרגה במקום להיפסק בבת אחת. מלאו את המסך בשחור תחילה, כי עולם שמוזז ב-4 פיקסלים משאיר רצועה צרה לא מכוסה.

challenge icon

אתגר

בינוני

לחיצה על הרווח מפילה ארגז, וכשהוא נוחת מוגדר הערך shake = 12, שעדיין לא משתמשים בו. נערער את התצוגה:

  1. לפני הלולאה, צרו את world = pygame.Surface((480, 360)).
  2. ציירו את הרקע, את הקרקע, את העמוד ואת הארגזים על world במקום על screen.
  3. כל עוד shake גדול מ־0, בחרו היסט באמצעות amount = shake // 3 ו־random.randint(-amount, amount) עבור x ו־y, ואז הפחיתו את shake ב־1.
  4. מלאו את המסך בשחור והציגו את world במיקום ההיסט.

נסו בעצמכם

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()

thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            falling.append(pygame.Rect(random.randint(140, 400), -40, 40, 40))

    for crate in falling:
        crate.y += 8
        if crate.bottom >= 300:
            crate.bottom = 300
            landed.append(crate)
            thud_sound.play()
            shake = 12
    falling = [crate for crate in falling if crate.bottom < 300]

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 80, 100), (0, 300, 480, 60))
    pygame.draw.rect(screen, (80, 160, 255), (60, 220, 30, 80))
    for crate in falling + landed:
        pygame.draw.rect(screen, (170, 110, 60), crate)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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