Menu
CoddyTech

לשמור על עדינות

חלק מהיחידה צליל ותחושת משחק במסלול ה-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))

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

challenge icon

אתגר

בינוני

לחיצה על מקש הרווח מפילה ארגזים, וכל נחיתה מוסיפה 12 ל־shake. הנמיכו את עוצמת הרעידה:

  1. שנו את הנחיתה כך ש־shake לעולם לא יעלה על 18: shake = min(shake + 12, 18).
  2. הגדירו shake_on = True לפני הלולאה; מקש S הופך את ערכו.
  3. בחרו היסט אקראי רק כאשר shake_on הוא True.
  4. לאחר ציור העולם באמצעות 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()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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