עצירה בעת פגיעה
חלק מהיחידה צליל ותחושת משחק במסלול ה-Pygame של Coddy. שיעור 14 מתוך 23.
מכה חזקה פוגעת בעוצמה רבה יותר אם המשחק נעצר לשבריר שנייה. משחקי לחימה ופעולה עושים זאת כל הזמן: במכה חזקה, הכול קופא לכמה פריימים, ואז המשחק ממשיך. לזה קוראים עצירת פגיעה.
השתמשו שוב במונה שמייצג את מספר הפריימים שנותרו להקפאה. כל עוד הערך שלו גדול מ־0, הפחיתו אותו ודלגו על כל העדכון. המשיכו לצייר, כך שהרגע הקפוא יישאר על המסך:
if freeze > 0:
freeze -= 1
else:
enemy.x += enemy_speed
# ... שאר העדכוןהגדירו אותו רק במכות החשובות. כאן המכה השלישית מביסה את האויב, ולכן המכה הזאת מגדירה freeze = 12, חמישית השנייה. הקפאה אחרי כל מכה קטנה גורמת למשחק להרגיש דביק במקום עוצמתי.
מונה ההבהוב הוא חלק מהעדכון, ולכן גם הוא ממתין: האויב נשאר לבן במשך כל ההקפאה, צליל הפיצוץ מהדהד, ואז המשחק ממשיך. האירועים עדיין פועלים במהלך ההקפאה, ולכן שחקן שלוחץ על מקש בזמן הזה לא יזכה להתעלמות; כאן מקש הרווח פוגע רק כאשר hp > 0.
אתגר
בינוניהאויב נע שמאלה וימינה; שלוש פגיעות באמצעות מקש הרווח מביסות אותו. הקפיאו את המשחק בפגיעה שמביסה אותו:
- הגדירו
freeze = 0לפני הלולאה. - במקום שבו הפגיעה מורידה את
hpל־0, הגדירוfreeze = 12. - בעדכון, כל עוד
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 אונליין