![見出し画像](https://assets.st-note.com/production/uploads/images/147058934/rectangle_large_type_2_8e0e50db560b38868099d531e023b4e6.png?width=1200)
11-2 メイン
同人誌について
この連載は、同人誌『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 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_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の状態
自描画、敵描画のときは、描画`draw()`の結果が`True`なら、終了処理`end()`をおこないます。
同人誌について
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)
このnoteの記事と、Webページに一部抜粋版を掲載しています。
技術系同人誌など まとめページ