Menu
CoddyTech

تجميد الحركة عند الإصابة

جزء من قسم الصوت وإحساس اللعب في رحلة Pygame على Coddy. الدرس 14 من 23.

تكون الضربة القوية أشد وقعًا إذا توقفت اللعبة لجزء من الثانية. يحدث هذا طوال الوقت في ألعاب القتال والحركة: عند توجيه ضربة قوية، يتجمد كل شيء لبضع إطارات، ثم يستأنف. يُسمى ذلك توقف الضربة.

استخدم عدّادًا مرة أخرى لتحديد عدد الإطارات المتبقية للتجميد. ما دام أكبر من 0، أنقص قيمته وتجاوز التحديث بأكمله. واصل الرسم كي تبقى اللحظة المتجمدة ظاهرة على الشاشة:

if freeze > 0:
    freeze -= 1
else:
    enemy.x += enemy_speed
    # ... بقية التحديث

عيّنه فقط عند الضربات المهمة. هنا تقضي الضربة الثالثة على العدو، لذا تعيّن تلك الضربة freeze = 12، أي خُمس ثانية. تجميد اللعبة عند كل ضربة صغيرة يجعلها تبدو ثقيلة بدلًا من أن تبدو قوية.

عداد الوميض جزء من التحديث، لذا ينتظر هو أيضًا: يبقى العدو أبيض طوال فترة التجميد، ويستمر صوت الانفجار في الرنين، ثم تستأنف اللعبة. تظل الأحداث تعمل أثناء التجميد، لذا لا يتم تجاهل اللاعب إذا ضغط على مفتاح حينها؛ هنا لا تصيب ضغطة Space إلا عندما يكون 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()

جميع دروس الصوت وإحساس اللعب

تدرّب بنفسك: Playground لـ Pygame