見出し画像

【pyxel 1.5】pyxelで3D迷路を作ってみる(7)

前回は敵キャラクターの動作を作成しました。今回は迷路内のギミックの追加、および長くなってきたコードを整理するためのモジュール化を行います。

前回までの進行具合は以下のnoteをご参照ください。

コードは複雑になってきたので、画像メインで書いていきます。

迷路内にギミックを作るために特殊なマスを作成します。

▲スタートマス。これは以前から作ってありましたが、見た目を少し変更しました。
▲ドア。進もうとするとメッセージウィンドウにロックされている旨が表示されます。
▲レバー。ドアと対応するようにしています。
メッセージウィンドウでレバーを操作するか聞かれます。入力受付状態をフラグとして管理することで、特定の操作しか受け付けないようにしています。(この場面ではYかNのキーしか押せません)
▲レバーを作動させたところ。どこかでドアが開きました。
▲レバーを操作したので、先ほどドアだったマスは通路マスになりました。
▲ゴール地点。金塊を発見。

さて、このようにいろいろと見た目の部分を作ってきましたが、これでコードが一層ぐちゃぐちゃになってしまいました。また、今後例えば「似た感じで色の違うドアを作りたい」と思ったりしてもコードの再利用がしずらく、結局コピペで作ってさらにぐちゃぐちゃになる未来が見えています。

なのでこの辺りで関数やクラスを外部ファイルに切り出し、モジュール化することですっきりさせておきます。

例えば壁の描画であれば

#Draw wall 1-----------------------------------------------------------------     
      if self.wall[0][0] == (1, 0):
          pyxel.line(0, 0, 50, 29, 6)
          pyxel.line(0, 0, 0, 150, 6)
          pyxel.line(0, 150, 50, 121, 6)
          pyxel.line(50, 29, 50, 121, 6)
      ・・・・・・(中略)・・・・・・
          pyxel.line(256, 0, 205, 29, 10)
          pyxel.line(256, 150, 205, 121, 10)      
          pyxel.line(255, 0, 255, 150, 10)
          pyxel.line(205, 29, 205, 121, 10)          
      else:
          pyxel.line(256, 29, 205, 29, 6)
          pyxel.line(256, 121, 205, 121, 6)
#----------------------------------------------------------------------------- 

こんな風に書いていた部分を、

d.draw_wall(self.wall, self.wall_list_n)

これだけで済むようにする作業です。

まずは描画部分や、App以外のクラスを別ファイルにして、新規作成した「module」フォルダに入れます。
階層は以下の通りです。

|
|__________assets
|            |
|            |__ assets.pyxres
|
|____________module
|             |
|             |__ __init__.py
|             |__ Bubble.py
|             |__ draw_mod.py
|             |__ Enemy.py
|             |__ Game_msg.py
|
|____ main.py

assetsフォルダにはマップデータがあるpyxresファイルを、moduleフォルダに今回作ったモジュールファイルを入れます。「__init__.py」は入っているフォルダをモジュールフォルダとして使うために必要なもので、中身は何も書いていません。
自作のモジュールについては下記noteでも取り上げていますので、よろしければご覧ください。

次は実際にmain.pyで自作モジュールを読み込む部分です。まずは冒頭のライブラリとかをインポートするところに、下記のような形で付け加えます。

from module import draw_mod as d, Game_msg, Enemy as eC, Bubble as bC

後で書くときに面倒くさくないように「as」で短縮名を設定していますが、通常のライブラリと似た感じで読み込みます。「from フォルダ名 import ファイル名」です。

これで各モジュールの関数やクラスが利用できるようになりました。
最終的にdraw関数は下記の形まですっきりさせることができました。

  def draw(self):
      pyxel.cls(0)                        
      
      d.draw_wall(self.wall, self.wall_list_n)
      
      d.draw_paint(self.floor)

      d.draw_dead_end(self.dead_end, self.wall_list_n)

      d.draw_bubble(self.bubbles, 0)
          
      #Draw Game Over text---------------------------------------------------
      if self.game_over == True:
          d.draw_game_over()
      #----------------------------------------------------------------------    
          
      d.draw_enemy(self.enemy_pos, self.dead_end)

      d.draw_bubble(self.bubbles, 1)
       
      d.draw_compass(self.pos, self.maze, self.wall_list,
                     self.pos_angle, self.e_msg, self.e_msg_F,
                     self.paint_cnt, self.game_msg)

これで今後手直しがしたくなったら、呼び出されている各関数をいじればいいわけです。コードの見通しが良くなりました。

そのほかにも変数設定部分を関数化してリトライ時に読み込むのを簡単にしたりと、いろいろと直したのですが、すべて「コードを見やすくする」という目的のためです。地ならしのような作業ですが、すっきりして処理が追いやすくなったので満足。

今回はここまで。
次回はさらにいろいろなギミックを追加したいと思います。

コードやpyxresファイル、モジュールファイルはGitHubの方に置いてあります。

今回はここまで。
読んでいただきありがとうございました。

この記事が参加している募集

つくってみた

ここまで読んでいただきありがとうございます!