לשמור על עדינות
חלק מהיחידה צליל ותחושת משחק במסלול ה-Pygame של Coddy. שיעור 15 מתוך 23.
תחושת המשחק היא כמו תיבול. טלטול קטן הופך נחיתה לכבדה; טלטול רב מדי מקשה להבין את המשחק ועלול לגרום לשחקנים להרגיש רע. שני הרגלים עוזרים לשמור על כך בשליטה.
הגבילו אותה. כשאפקטים מצטברים, הם עלולים לגדול ללא גבול. כאן כל נחיתה מוסיפה 12 ל־shake; ארבעה ארגזים שנוחתים יחד מעלים אותו מעבר ל־40, והתצוגה קופצת ב־13 פיקסלים. min() קובעת לו תקרה:
shake = min(shake + 12, 18)כעת הטלטול עדיין נמשך זמן רב יותר כשארגזים ממשיכים לנחות, אבל הוא לעולם לא מזיז ביותר מ־18 // 3, כלומר 6 פיקסלים.
אפשרו לשחקנים לכבות אותה. יש אנשים שאינם יכולים לשחק כשהמסך זז. הגדרה כזו עולה משתנה אחד:
shake_on = True
...
if shake_on:
offset = (random.randint(-amount, amount), random.randint(-amount, amount))ציירו את התווית אחרי ציור העולם, ישירות על המסך. טקסט שהוא חלק מהממשק צריך להישאר ללא תנועה בזמן שהעולם רועד.
אתגר
בינונילחיצה על מקש הרווח מפילה ארגזים, וכל נחיתה מוסיפה 12 ל־shake. הנמיכו את עוצמת הרעידה:
- שנו את הנחיתה כך ש־
shakeלעולם לא יעלה על 18:shake = min(shake + 12, 18). - הגדירו
shake_on = Trueלפני הלולאה; מקש S הופך את ערכו. - בחרו היסט אקראי רק כאשר
shake_onהוא True. - לאחר ציור העולם באמצעות blit, הציגו על המסך את
Shake: Onאו אתShake: Offבמיקום(10, 10).
נסו בעצמכם
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 28)
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
world = pygame.Surface((480, 360))
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]
world.fill((30, 30, 46))
pygame.draw.rect(world, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(world, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(world, (170, 110, 60), crate)
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)
pygame.display.flip()
clock.tick(60)
pygame.quit()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה צליל ותחושת משחק
תרגלו בעצמכם: Pygame אונליין