被弾フラッシュ
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 します。多くのゲームでは、ダメージを受けると同じカウンターを使ってプレイヤーを赤く点滅させます。
チャレンジ
簡単スペースキーで赤い敵を攻撃し、HPを減らします。攻撃のたびに点滅させましょう。
- ループの前に
flash = 0を設定します。 - 攻撃が当たったら、
flash = 6を設定します。 - 各フレームで、
flashが0より大きい間、flashを1減らします。 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()
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
サウンドとゲームの手応えのすべてのレッスン
自分で練習してみよう: Pygameプレイグラウンド