Menu
CoddyTech

被弾フラッシュ

CoddyのPygameジャーニー「サウンドとゲームの手応え」セクションの一部。レッスン 13/23。

敵に攻撃が当たったら、体力バーが変化する前でも、すぐにそれが画面に表示されるべきです。一般的な方法はヒットフラッシュです。数フレームの間、敵を真っ白に描画します。

必要なのは、フラッシュが続く残りフレーム数を示すカウンター1つです。攻撃が当たるとカウンターを設定し、フレームごとに減らします。

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)

6フレームは10分の1秒です。見えるだけの長さがあり、次の攻撃が再びフラッシュするのに十分な短さです。攻撃が当たったことが、プレイヤーにはひと目で分かります。

画像を使ったスプライトも同じようにフラッシュさせられます。画像の白いコピーを用意するか、コピーを白で塗りつぶし、カウンターが動いている間それを blit します。多くのゲームでは、ダメージを受けると同じカウンターを使ってプレイヤーを赤く点滅させます。

challenge icon

チャレンジ

簡単

スペースキーで赤い敵を攻撃し、HPを減らします。攻撃のたびに点滅させましょう。

  1. ループの前に flash = 0 を設定します。
  2. 攻撃が当たったら、flash = 6 を設定します。
  3. 各フレームで、flash が0より大きい間、flash を1減らします。
  4. flash が0より大きい間は敵を白の (255, 255, 255) で描画し、それ以外の場合は赤で描画します。

自分で試してみよう

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腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

サウンドとゲームの手応えのすべてのレッスン

自分で練習してみよう: Pygameプレイグラウンド