この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)
「src/mymod/scene_battle/main.py」の説明です。game.scene.Scene
を継承したクラスです。
import pygamefrom .. import data, gamefrom . import proc, view
class SceneBattle(game.scene.Scene): NAME = data.scene.BATTLE
def __init__(self): self.sprites = pygame.sprite.RenderUpdates() # 描画更新用 self.enemy = view.chara.init() # キャラ初期化 self.enemy.add(self.sprites) # グループ設定
self.menu = data.action.Menu() # メニュー self.res = data.battle.Res() # 空Res self.proc = data.battle.PROC_MY_WAIT # 進行
# 通常/最終戦闘のBGMを開始 bgm = data.audio.BATTLE if data.enemy.enemy_now.is_last: bgm = data.audio.BATTLE_LAST game.audio.play_bgm(bgm)
# 更新 async def update(self, screen: pygame.Surface, e: game.event.GEvent): self.sprites.update() # スプライト更新 self.sprites.draw(screen) # スプライト描画 view.view.draw(screen, self.menu) # 全て描画
# 進行による分岐 b = data.battle p = self.proc if p == b.PROC_MY_DRAW: # 自描画 is_end = await proc.my.draw(self.res, screen) if is_end: await proc.my.end(self) elif p == b.PROC_ENEMY_DRAW: # 敵描画 is_end = await proc.enemy.draw(self.res, screen) if is_end: await proc.enemy.end(self) elif p == b.PROC_MY_WAIT: # ユーザー操作待機 await proc.menu.manage(self, e)
まずはインポート部分を示します。
import pygamefrom .. import data, gamefrom . import proc, view
data
game
パッケージを読み込みます。
また、配下のproc
view
パッケージを読み込みます。
クラスの作成とコンストラクターまでを示します。
class SceneBattle(game.scene.Scene): NAME = data.scene.BATTLE
def __init__(self): self.sprites = pygame.sprite.RenderUpdates() # 描画更新用 self.enemy = view.chara.init() # キャラ初期化 self.enemy.add(self.sprites) # グループ設定
self.menu = data.action.Menu() # メニュー self.res = data.battle.Res() # 空Res self.proc = data.battle.PROC_MY_WAIT # 進行
# 通常/最終戦闘のBGMを開始 bgm = data.audio.BATTLE if data.enemy.enemy_now.is_last: bgm = data.audio.BATTLE_LAST game.audio.play_bgm(bgm)
NAME
を設定します。NAME
はシーンの切り替えで必要です。
コンストラクターでは、このシーン用の各種モジュールを初期化します。
ここでは描画用の値だけでなく、他の値も初期化します。メニューself.menu
、行動の結果self.res
、戦闘の進行self.proc
という値も用意します。
最後に、バトルのBGMを再生します。バトル シーンでは、通常の戦闘と最終戦闘(魔王との戦い)ではBGMが異なります。敵データのis_last
がTrue
のときは最終戦闘用のBATTLE_LAST
に切り替えます。
続いて、更新をおこなうupdate()
メソッドです。
# 更新 async def update(self, screen: pygame.Surface, e: game.event.GEvent): self.sprites.update() # スプライト更新 self.sprites.draw(screen) # スプライト描画 view.view.draw(screen, self.menu) # 全て描画
# 進行による分岐 b = data.battle p = self.proc if p == b.PROC_MY_DRAW: # 自描画 is_end = await proc.my.draw(self.res, screen) if is_end: await proc.my.end(self) elif p == b.PROC_ENEMY_DRAW: # 敵描画 is_end = await proc.enemy.draw(self.res, screen) if is_end: await proc.enemy.end(self) elif p == b.PROC_MY_WAIT: # ユーザー操作待機 await proc.menu.manage(self, e)
前半は描画をおこない、後半は進行による処理の分岐をおこないます。
proc
の状態は、次の3種類です。PROC_MY_WAIT
のときだけ、キー入力を受け付けます。
procの状態
状態 | 説明 | キー入力 |
---|---|---|
PROC_MY_DRAW |
自側、アクション描画 | 無視 |
PROC_ENEMY_DRAW |
敵側、アクション描画 | 無視 |
PROC_MY_WAIT |
自側、ユーザー操作待機 | 受け付ける |
自描画、敵描画のときは、描画draw()
の結果がTrue
なら、終了処理end()
をおこないます。
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)