רעידת מסך
חלק מהיחידה צליל ותחושת משחק במסלול ה-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 פיקסלים משאיר רצועה צרה לא מכוסה.
אתגר
בינונילחיצה על הרווח מפילה ארגז, וכשהוא נוחת מוגדר הערך shake = 12, שעדיין לא משתמשים בו. נערער את התצוגה:
- לפני הלולאה, צרו את
world = pygame.Surface((480, 360)). - ציירו את הרקע, את הקרקע, את העמוד ואת הארגזים על
worldבמקום עלscreen. - כל עוד
shakeגדול מ־0, בחרו היסט באמצעותamount = shake // 3ו־random.randint(-amount, amount)עבור x ו־y, ואז הפחיתו אתshakeב־1. - מלאו את המסך בשחור והציגו את
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 אונליין