見出し画像

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ページに一部抜粋版を掲載しています。

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


いいなと思ったら応援しよう!