تجميد الحركة عند الإصابة
جزء من قسم الصوت وإحساس اللعب في رحلة Pygame على Coddy. الدرس 14 من 23.
تكون الضربة القوية أشد وقعًا إذا توقفت اللعبة لجزء من الثانية. يحدث هذا طوال الوقت في ألعاب القتال والحركة: عند توجيه ضربة قوية، يتجمد كل شيء لبضع إطارات، ثم يستأنف. يُسمى ذلك توقف الضربة.
استخدم عدّادًا مرة أخرى لتحديد عدد الإطارات المتبقية للتجميد. ما دام أكبر من 0، أنقص قيمته وتجاوز التحديث بأكمله. واصل الرسم كي تبقى اللحظة المتجمدة ظاهرة على الشاشة:
if freeze > 0:
freeze -= 1
else:
enemy.x += enemy_speed
# ... بقية التحديثعيّنه فقط عند الضربات المهمة. هنا تقضي الضربة الثالثة على العدو، لذا تعيّن تلك الضربة freeze = 12، أي خُمس ثانية. تجميد اللعبة عند كل ضربة صغيرة يجعلها تبدو ثقيلة بدلًا من أن تبدو قوية.
عداد الوميض جزء من التحديث، لذا ينتظر هو أيضًا: يبقى العدو أبيض طوال فترة التجميد، ويستمر صوت الانفجار في الرنين، ثم تستأنف اللعبة. تظل الأحداث تعمل أثناء التجميد، لذا لا يتم تجاهل اللاعب إذا ضغط على مفتاح حينها؛ هنا لا تصيب ضغطة Space إلا عندما يكون 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()
جميع دروس الصوت وإحساس اللعب
تدرّب بنفسك: Playground لـ Pygame