この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)
「init.py」は、「main.py」の補助的なモジュールです。行数が多い初期化処理を、関数にまとめています。
このファイルでは、次のことをおこなっています。
それでは「src/init.py」を示します。
import os, sysimport mymod as mfrom mymod.image import fontfrom mymod.data import game, audio, scenefrom mymod.game.scene import Manager
# CWD(カレント ワーキング ディレクトリ)の初期化def init_cwd(): #print(os.getcwd()) # CWDの表示 app_path = __file__ if getattr(sys, 'frozen', False): app_path = sys.executable # EXE化時 app_dir = os.path.dirname(os.path.dirname(app_path)) # 親の親 os.chdir(app_dir) # CWDの移動 #print(os.getcwd()) # CWDの表示
# ゲームの初期化def init_game(): # データの初期化 font.init() # フォントの初期化 game.data = game.Game.from_blank() # データ作成 audio.load_all() # 音声のロード
# シーンの追加 Manager.add_scene(m.SceneTitle) Manager.add_scene(m.SceneMap) Manager.add_scene(m.SceneBattle)
# 最初のシーンのセット Manager.set_next(scene.TITLE) #Manager.set_next(scene.MAP) #Manager.set_next(scene.BATTLE)
まずは、インポート部分です。多くのものを読み込んでいます。
import os, sysimport mymod as mfrom mymod.image import fontfrom mymod.data import game, audio, scenefrom mymod.game.scene import Manager
標準ライブラリのosとsysを読み込みます。また、mymodパッケージをmとして読み込みます。
その他にfont game audio sceneといったモジュールを読み込みます。
また、mymod.game.sceneモジュールのManagerクラスも読み込みます。
init_cwd()関数では、カレント ワーキング ディレクトリ(CWD)の調整をおこないます。
# CWD(カレント ワーキング ディレクトリ)の初期化def init_cwd(): #print(os.getcwd()) # CWDの表示 app_path = __file__ if getattr(sys, 'frozen', False): app_path = sys.executable # EXE化時 app_dir = os.path.dirname(os.path.dirname(app_path)) # 親の親 os.chdir(app_dir) # CWDの移動 #print(os.getcwd()) # CWDの表示
「main.py」から実行したときと、『PyInstaller』で作ったEXEファイルから実行したときでは、パスの得方が違うので、その分岐をします。そして、次の図の「root/」のところをカレント ワーキング ディレクトリに変更します。
「main.py」から実行したときは、__file__を使って「init.py」の絶対パスを得ます。
「main.exe」から実行したときは、sys.executableを使ってEXEファイルのパスを得ます。
分岐は次の行でおこないます。
app_path = __file__ if getattr(sys, 'frozen', False): app_path = sys.executable # EXE化時
getattr()関数は、オブジェクトの属性の値を得る関数です。第1引数がオブジェクト、第2引数が属性名、第3引数は属性が存在しなかったときのデフォルト値です。
第3引数がなく、属性がなかったときはAttributeErrorが発生します。ここでは第3引数にFalseを設定しているのでエラーは発生しません。
上のプログラムでは、sysオブジェクトにfrozenの値があり、かつTrueだったときに、app_path = sys.executableの処理を実行します。
「root/」を、カレント ワーキング ディレクトリに変更しているのは、次の部分です。
app_dir = os.path.dirname(os.path.dirname(app_path)) # 親の親 os.chdir(app_dir) # CWDの移動
os.path.dirname()関数を2回使い、親ディレクトリの親ディレクトリを得ます。そしてos.chdir()関数で、カレント ワーキング ディレクトリを設定します。
init_cwd()関数で使用している関数と、その説明をまとめておきます。
関数の説明
| 関数 | 説明 |
|---|---|
getattr(o, k, d) |
オブジェクトoの、属性名kの値を取得。不在時のデフォルト値はd。 |
os.getcwd() |
CWDを取得 |
os.path.dirname(p) |
パスpのディレクトリを取得 |
os.chdir(p) |
CWDをパスpに変更 |
ゲームの初期化をおこなうinit_game()関数の処理は、3つのブロックに分かれます。「データの初期化」「シーンの追加」「最初のシーンのセット」です。
# ゲームの初期化def init_game(): # データの初期化 font.init() # フォントの初期化 game.data = game.Game.from_blank() # データ作成 audio.load_all() # 音声のロード
# シーンの追加 Manager.add_scene(m.SceneTitle) Manager.add_scene(m.SceneMap) Manager.add_scene(m.SceneBattle)
# 最初のシーンのセット Manager.set_next(scene.TITLE) #Manager.set_next(scene.MAP) #Manager.set_next(scene.BATTLE)
最初が「データの初期化」です。ここではフォントの初期化と、ゲーム データの作成と、音声の事前ロードをおこないます。
次が「シーンの追加」です。タイトル、マップ、バトルの3つのシーンを、自作のシーンマネージャーに登録します。シーンのあつかいについては、のちほど説明します。
最後が「最初のシーン」のセットです。ここではタイトル シーンを次のシーンとしてセットしています。そして、他のシーンはコメントアウトしています。
コメント部分を切り替えると、起動時に開くシーンを変えられます。これは、開発時に効率よく各シーンを実装していけるようにするためです。
こうした、起動時のシーンの切り替えができないと、プログラムの確認をしたいシーンまで移動するのが大変です。開発が終わり、本番になったら、タイトル シーンに戻すことを忘れないようにします。
それでは次の章から、ゲームの中身を作っていきます。
次の内容については省略します。こちらは同人誌をご覧ください。
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)