SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

レトロ風ゲームを作って学ぶPython入門

【作って学ぶPython】バトル画面を実装させ、レトロ風RPGを完成させよう!

レトロ風ゲームを作って学ぶPython入門 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 自動化やAIなどさまざまな分野で活用され、需要が高いPython。この連載では、小さなレトロ風ゲームを作りながら、Pythonを学ぶことができます。第5回は、第3回までに学んだことを使った実践編です!今回で短いながらも、タイトル・マップ・バトル画面を行き来するレトロ風RPGが完成します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 前回は、次のようなプログラムを作りました。

  • 補助的なモジュール
  • タイトル画面
  • マップ画面

 今回は、非常に小さなレトロ風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モジュールです。

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_sel0(一番上)にします。

 BGMの再生は、ラスボスのときと通常のときで分岐します。enemy.bossTrueなら、ラスボス戦闘用のBGMを再生します。Falseなら、通常戦闘用のBGMを再生します。

 更新をおこなうupdate()関数では、描画と進行管理を実行します。

s_battle/proc.py

 進行を管理する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の値による処理
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)でメニューの項目数を得て、判定に利用します。

次のページ
s_battle/proc_hero.py

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
レトロ風ゲームを作って学ぶPython入門連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19459 2024/06/24 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング