PythonとPygameで作る レトロ風RPG 全コード

同人誌について

 この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。

 同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)


11-2 メイン

公開:2024-07-12

説明と全体コード

 「src/mymod/scene_battle/main.py」の説明です。game.scene.Sceneを継承したクラスです。

import pygame
from .. import data, game
from . 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 pygame
from .. import data, game
from . import proc, view

 data gameパッケージを読み込みます。

 また、配下のproc viewパッケージを読み込みます。

SceneBattleクラス

 クラスの作成とコンストラクターまでを示します。

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_lastTrueのときは最終戦闘用の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 に更新)

 技術系同人誌など まとめページ


トップページに戻る
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について