はじめに
前回は、次のようなプログラムを作りました。
- 補助的なモジュール
- タイトル画面
- マップ画面
今回は、非常に小さなレトロ風RPGを作る続きです。バトル画面を作成します。今回で、短いながらも、タイトル・マップ・バトル画面を行き来するレトロ風RPGが完成します!

バトル画面
バトル画面の作成に入ります。
バトル画面の処理は、s_battle/main.pyモジュールを含めて5つあります。それぞれs_battleフォルダー内のファイルで、proc.pyは進行の管理、proc_hero.pyは主人公側の処理、proc_enemy.pyは敵側の処理をおこないます。draw.pyは描画をおこないます。
s_battle/
main.py
proc.py
proc_hero.py
proc_enemy.py
draw.py
s_battle/main.py
バトル画面の初期化と更新をおこなうs_battle/main.pyモジュールです。
import data, enemy, audio
from . import proc, draw
# 初期化
def init():
data.proc = "menu" # 進行
data.menu_sel = 0 # メニュー選択位置
if enemy.boss:
audio.play(audio.BATTLE_LAST) # ラスボス戦闘BGM再生
else:
audio.play(audio.BATTLE) # 通常戦闘BGM再生
# 更新
def update():
draw.render() # 描画
proc.manage() # 進行管理
インポート部分では、data, enemy, audioを読み込みます。また、同じパッケージの階層からproc, drawモジュールを読み込みます。
初期化をおこなうinit()関数では、進行data.procを"menu"にして、メニューの選択位置data.menu_selを0(一番上)にします。
BGMの再生は、ラスボスのときと通常のときで分岐します。enemy.bossがTrueなら、ラスボス戦闘用のBGMを再生します。Falseなら、通常戦闘用のBGMを再生します。
更新をおこなうupdate()関数では、描画と進行管理を実行します。
s_battle/proc.py
進行を管理するs_battle/proc.pyモジュールです。
import pygame, data
from . import proc_hero, proc_enemy
# 進行管理
def manage():
if data.proc == "menu":
if data.key["down"] == pygame.K_SPACE:
# メニュー決定
proc_hero.start() # 自開始
elif data.key["down"] == pygame.K_DOWN:
# メニュー下移動
data.menu_sel += 1
if data.menu_sel >= len(data.menu_texts):
data.menu_sel = 0
elif data.key["down"] == pygame.K_UP:
# メニュー上移動
data.menu_sel -= 1
if data.menu_sel < 0:
data.menu_sel = len(data.menu_texts) - 1
elif data.proc == "hero_draw":
proc_hero.draw() # 自描画
elif data.proc == "enemy_start":
proc_enemy.start() # 敵開始
elif data.proc == "enemy_draw":
proc_enemy.draw() # 敵描画
インポート部分ではpygame, dataを読み込みます。また、同じパッケージの階層からproc_hero, proc_enemyモジュールを読み込みます。
進行管理をおこなうmanage()関数では、data.procの値によって呼び出す処理を変えます。
| data.proc | 処理 | 内容 |
|---|---|---|
| "menu" | メニュー決定後 proc_hero.start() | 自分の処理開始 |
| "hero_draw" | メニュー決定後 proc_hero.start() | 自分の描画 |
| "enemy_start" | proc_enemy.start() | 敵の処理開始 |
| "enemy_draw" | proc_enemy.draw() | 敵の描画 |
このモジュールの処理の中で説明が必要なのは、data.procが"menu"のときの処理だけです。スペース キーを押すと決定です。上下の矢印キーを押すと選択位置が上下に動いてループします。
data.menu_textsはメニューのテキストのリストです。len(data.menu_texts)でメニューの項目数を得て、判定に利用します。
