概要
この章では、学んだ内容をまとめて簡単なシューティングゲームを作ります。
プレイヤー移動、弾発射、敵生成、当たり判定、スコア管理を実装することで、実践的な開発の流れを学びます。
プロジェクト構成(例)
下記のようなフォルダ構成で始めるのが分かりやすいです。
simple_shooter/ ├─ main.py ├─ game/ │ ├─ __init__.py │ ├─ player.py │ ├─ enemy.py │ ├─ bullet.py │ └─ utils.py ├─ assets/ │ ├─ player.png │ ├─ enemy.png │ ├─ bullet.png │ └─ sound/ │ ├─ shoot.wav │ └─ bgm.mp3 └─ requirements.txt
最小実装(サンプル)
以下は main.py における簡易な実装例です。
クラスは別ファイルに分けることを推奨します。
# main.py - 簡易シューティングの最小例(説明用)
import pygame
import sys
import random
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
# プレイヤー
player_surf = pygame.Surface((40, 30))
player_surf.fill((0, 200, 0))
player_rect = player_surf.get_rect(center=(320, 430))
bullets = []
enemies = []
score = 0
def spawn_enemy():
x = random.randint(20, 620)
rect = pygame.Rect(x, -30, 30, 30)
enemies.append(rect)
SPAWN_EVENT = USEREVENT + 1
pygame.time.set_timer(SPAWN_EVENT, 800) # 800ms ごとに敵出現
running = True
while running:
dt = clock.tick(60) / 1000.0
for event in pygame.event.get():
if event.type == QUIT:
running = False
elif event.type == SPAWN_EVENT:
spawn_enemy()
elif event.type == KEYDOWN:
if event.key == K_SPACE:
bullet_rect = pygame.Rect(player_rect.centerx - 4, player_rect.top - 10, 8, 10)
bullets.append(bullet_rect)
# 入力(移動)
keys = pygame.key.get_pressed()
if keys[K_LEFT]:
player_rect.x -= int(300 * dt)
if keys[K_RIGHT]:
player_rect.x += int(300 * dt)
player_rect.clamp_ip(screen.get_rect())
# 弾の更新
for b in bullets[:]:
b.y -= int(500 * dt)
if b.bottom < 0: bullets.remove(b) # 敵の更新 for e in enemies[:]: e.y += int(120 * dt) if e.top > 480:
enemies.remove(e)
# 衝突判定(弾と敵)
for e in enemies[:]:
for b in bullets[:]:
if e.colliderect(b):
try:
enemies.remove(e)
bullets.remove(b)
except ValueError:
pass
score += 100
# 描画
screen.fill((30, 30, 30))
screen.blit(player_surf, player_rect)
for b in bullets:
pygame.draw.rect(screen, (255, 255, 0), b)
for e in enemies:
pygame.draw.rect(screen, (200, 0, 0), e)
# スコア表示
font = pygame.font.SysFont(None, 24)
text = font.render(f"Score: {score}", True, (255,255,255))
screen.blit(text, (10, 10))
pygame.display.flip()
pygame.quit()
sys.exit()
拡張案(学習ポイント)
以下を段階的に追加して完成度を高めてください。
- 画像(player.png, enemy.png, bullet.png)に差し替え、Sprite クラスに分割する
- 当たり判定を mask ベースに変更して精度を上げる
- 敵種類や弾パターンを増やす(アルゴリズム実装)
- スコア表示やライフ、ゲームオーバー画面を実装する
- SE(shoot.wav)やBGM(bgm.mp3)を追加して雰囲気を向上させ
注意点とデバッグ
– リソース(画像・音声)は事前に読み込み、毎フレームで再読み込みしないでください
– 衝突処理でリストをループ中に変更する際はコピーを使うか、安全に削除する工夫をしてください
– パフォーマンス測定のために clock.get_fps() やプロファイラを利用してください
| 項目 | 補足 |
|---|---|
| 敵出現 | タイマーイベントやウェーブ制御で管理 |
| 弾管理 | 弾は再利用(プール)を検討すると効率的 |