pyxelでRPGを作ってみよう! 第5章 サンプルのコードを分離、修正してみる

皆さんこんにちは、cacaponです。

最近バタバタしてて、更新できていませんでした。ゴメンナサイ…

本日は、タイトル画面を作り、それを表示させたいと思っていたのですが…

その前にコードの改造をしてしまって…

2週間ほど空いている間に色々とコードを変えてしまって…
現在はこんな感じになっています。

フォルダ構成

.
|-- scene
|   |-- scene_mng.py
|   |-- castle_scene.py
|   |-- dangeon_scene.py
|   |-- gamemode.py
|   |-- scene_abc.py
|   |-- sample.pyxres
|   `-- title_scene.py

追加したコードの詳細です~

現在の構成

さすがにこれを説明しないと何が何だがといった感じになるでしょうから、
追加したコードがどんなものか説明したいと思います。

scene_mng.py

これは、元々前回記事で紹介したコードだったやつです。

前回はこちら↓ cacapon.hatenablog.com

時間経ってから見たせいか、直したい箇所とか気になる箇所とかがありまして、
主にこんなところを直しました。

  • GAMEMODEを別のファイルに退避
    →他でも結構使いそうだったので別に分離しました。
  • sceneをdict型で管理
    python だと fruit = {'orenge':100, 'apple' : 150} のように
    dict型という宣言の仕方があり、こんな感じで宣言すると
    fruit['orenge']のようにすれば名前に紐づいた値を取得できるんです。
    (この場合100が返ってくる)
    この仕組みを使って、名前でsceneのオブジェクトが呼べるようにしました。
  • update,drawをすっきりさせる。
    →前回のと比較すると分かると思いますが、
    if ,elif , elif ... って並んでいたのがだいぶすっきりしたかと思います。
    これは、先ほどのdict型に宣言したおかげです。
    こんな短いコードでも動くようになっています、dict型って凄いですよね~

  • update,drawから呼び出されていた処理を、別ファイルに退避
    →それぞれ、title_scene.py, castle_scene.py, dungeon_scene.py に分けました。

因みに、コードの上の方にある from xx import yy というやつは、
「xxというファイルにある、yy というクラス(または関数だったり他のだったり)を使いますよ~」 という宣言です。

先に説明しましたが、他のファイルに分けちゃったので、そのファイルから呼び出せるようにするために、
こういった宣言が必要になります。他のファイルでも出てくるところなので覚えておいてください~

最初コードを書いている内は一緒くたにしてもいいと思うんですけど、
慣れてきたら、どんどんと細かく分けてっていいのかなとcacaponは思います。

分けることで、考えが一ヶ所に集中できますし※、呼び出し元-呼び出し先の関係がしっかり作れれば、
修正したり機能追加も楽ちんになりますので♪

※例えば、ダンジョンのシーンを編集するぞ!ってなった場合は、
 dungeon_scene.pyだけに集中して考えることが出来るって感じです。  ちゃんと分離が出来ていればこんな感じで作ることも出来ますし、
 内容がでっかくなってきた場合に、他の部分を誰かに任すということも簡単にできるようになります。

gamemode.py

これは前回定義したEnumのやつですね。
分離した以外は特に変わってないはずですので説明は割愛します~

scene_abc.py

なんかややこしいのが一個追加されていますが、
これは各シーンの設計図に当たるクラスになります。

ポイントは @abstractmethod が上についている def
これがくっついていると、これを引き継いで作ったクラスは、
必ずその関数を作らないといけなくなるのです。

今回のAbstractSceneクラスでは、update,drawの関数に@abstractmethodがくっついてますので、
この二つは必ず実装しなくてはいけなくなります~

「そんなの作らなくたって、自分でちゃんと管理できてればいいんじゃない?」
って人もいるかと思います。確かにその通り、管理できれば要らないです。

ただ、これが大規模になっていく、または複数人で参加するってなった場合に、
間違いなく管理しきれなくなるので、そういうところはコンピュータさんに任せちゃった方が楽なのです。

今回のサンプルでは要らなくても出来るかもしれませんが、一応複数のシーンが増える見込みなので今のうちに追加しました。

title_scene.py, castle_scene.py, dungeon_scene.py

前回のupdate_xxx,draw_xxxを持ってきてクラスにまとめてみました、という感じです。
ここのポイントは、class XxxScene(AbstractScene):とクラスを定義している部分。

この書き方が、「このクラスを作る時に、()内に書いたクラスを引き継いで作りますよ~」という宣言なのです。 (継承っていいます、詳しく知りたい方は検索してみてください~)

ここで、さっき作ったAbstractSceneクラスを引き継いでいますので、
この三つのクラスではdrawupdateは必ず作らなければいけません。

ただし、中身は別物でも大丈夫です。
現に、castleだと「Castle Scene」って文字だけ表示ですし、
dungeonだと「Dungeon Scene」です、 titleに限っては作りこんでしまったせいで、画像すらあります。

呼び出す名前は同じでも中身は別で大丈夫なのです。


因みに、上のコードと、 sample.pyxres をちゃんと準備した状態で動かすと、
こんな感じで動きます~

f:id:cacapon:20201016111415g:plain

次回は今回説明していなかったタイトル部分をしっかり説明したいと思います。
お楽しみに~