Menu
CoddyTech

עצירה בעת פגיעה

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

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

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

if freeze > 0:
    freeze -= 1
else:
    enemy.x += enemy_speed
    # ... שאר העדכון

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

מונה ההבהוב הוא חלק מהעדכון, ולכן גם הוא ממתין: האויב נשאר לבן במשך כל ההקפאה, צליל הפיצוץ מהדהד, ואז המשחק ממשיך. האירועים עדיין פועלים במהלך ההקפאה, ולכן שחקן שלוחץ על מקש בזמן הזה לא יזכה להתעלמות; כאן מקש הרווח פוגע רק כאשר hp > 0.

challenge icon

אתגר

בינוני

האויב נע שמאלה וימינה; שלוש פגיעות באמצעות מקש הרווח מביסות אותו. הקפיאו את המשחק בפגיעה שמביסה אותו:

  1. הגדירו freeze = 0 לפני הלולאה.
  2. במקום שבו הפגיעה מורידה את hp ל־0, הגדירו freeze = 12.
  3. בעדכון, כל עוד freeze גדול מ־0, הפחיתו אותו ב־1 ודלגו על כל השאר בעדכון. השאירו את הציור כפי שהוא.

נסו בעצמכם

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Training Dummy")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
explosion_sound = pygame.mixer.Sound("assets/sounds/explosion.ogg")
enemy = pygame.Rect(100, 150, 60, 60)
enemy_speed = 2
hp = 3
flash = 0
defeated = 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 and hp > 0:
            hp -= 1
            flash = 6
            if hp == 0:
                explosion_sound.play()
            else:
                hit_sound.play()

    enemy.x += enemy_speed
    if enemy.left < 40 or enemy.right > 440:
        enemy_speed = -enemy_speed
    if flash > 0:
        flash -= 1
    if hp == 0:
        defeated += 1
        hp = 3
        enemy.x = 100

    screen.fill((30, 30, 46))
    if flash > 0:
        pygame.draw.rect(screen, (255, 255, 255), enemy)
    else:
        pygame.draw.rect(screen, (220, 80, 80), enemy)
    label = font.render(f"HP: {hp}   Defeated: {defeated}", True, (240, 240, 240))
    screen.blit(label, (20, 20))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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