Menu
CoddyTech

وميض الإصابة

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

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

يتطلب ذلك عدّادًا واحدًا يحدد عدد الإطارات المتبقية للوميض. تضبطه الإصابة، ويُخفَّض في كل إطار:

flash = 0
...
# إصابة
hp -= 1
flash = 6
...
# كل إطار
if flash > 0:
    flash -= 1

عند الرسم، يحدد العدّاد اللون:

if flash > 0:
    pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
    pygame.draw.rect(screen, (220, 80, 80), enemy)

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

يمكن لشخصية مرسومة بصورة أن تومض بالطريقة نفسها: احتفظ بنسخة بيضاء من صورتها، أو املأ نسخة منها باللون الأبيض، ثم ارسمها أثناء عمل العدّاد. تومض شخصيات اللاعبين في ألعاب كثيرة باللون الأحمر عند تعرضها للضرر، باستخدام العدّاد نفسه.

challenge icon

التحدي

سهل

يضرب مفتاح المسافة العدو الأحمر ويقلل نقاط صحته. اجعل كل ضربة تومض:

  1. اجعل flash = 0 قبل الحلقة.
  2. عند الإصابة، عيّن flash = 6.
  3. في كل إطار، قلّل flash بمقدار 1 ما دام أكبر من 0.
  4. ارسم العدو باللون الأبيض (255, 255, 255) ما دام flash أكبر من 0، وباللون الأحمر خلاف ذلك.

جرّب بنفسك

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")
player = pygame.Rect(120, 150, 60, 60)
enemy = pygame.Rect(300, 150, 60, 60)
hp = 5

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
            hit_sound.play()

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), player)
    if hp > 0:
        pygame.draw.rect(screen, (220, 80, 80), enemy)
    label = font.render(f"Enemy HP: {hp}", True, (240, 240, 240))
    screen.blit(label, (300, 110))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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

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