メインコンテンツへスキップ
見出し画像

【pyxel 1.5】pyxelで2Dアクションを作ってみる(4)

    前回に引き続き、タイトル画面を作成します。今回も作業量としては少なめですがお付き合いください。

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

    画像

    さて、前回は上のようなタイトル画面を作り、プレイするマップを選択できるようにしました。しかしこれではあまりに味気ないし、マップ選択も数字が変わるだけで何が何やらといった感じです。
    そこで今回はマップ選択時に全体像をみせ、これから遊ぶステージが分かるようにしてみます。
    それではとりあえず完成形を。

    画像
    ▲選択したマップの全体像が見えます。
    画像
    ▲動かすとこんな感じ。きちんとマップ内容が変わっています。

    コードとしてはタイルマップを検査するモジュール「mapScan」を新規作成し、描画用の配列を作成しています。

    # -*- coding: utf-8 -*-
    import pyxel
    
    def map_scan(tile):
        map_data = []
        data_raw = []
        x = 30
        y = 30
        for y1 in range(y):
            for x1 in range(x):
                data = pyxel.tilemap(tile).pget(x1, y1)
                if data == (0, 6):
                    d = 0
                elif data == (0, 0) or data == (1, 0):
                    d = 1
                else:
                    d = 2
                data_raw.append(d)
            map_data.append(data_raw)
            data_raw = []
            
        return map_data
    

    ▲mapScanモジュールです。map_scan関数が定義されています。そしてこの関数は0~7のどのタイルマップを使うかという情報を引数tileとして受け取ります。
    その後は引数で選択されたタイルマップを2重ループで検査していき、タイルの種類を判定します。通路だったら0、壁は1、敵は2といった形で置き換えて最終的に新たな配列map_dataにしています。これを関数の戻り値として設定。
    これで関数map_scanを呼び出すと指定したタイルマップのデータを通路・壁・敵の3種類に区分した分かりやすい形で返してくれます。

    実際に本体側で呼び出す際はこんな感じになります。

              if pyxel.btnp(pyxel.KEY_RIGHT):
                  if self.tile < 2:
                      self.tile += 1
                  self.map_data = []
                  self.map_data = mS.map_scan(self.tile)

    ▲これはタイトル画面で右キーを押した際の動きですがself.tileの値を操作し、map_scan関数に渡しています。その戻り値を新たにself.map_dataに格納しています。

    これで編集されたマップ配列のself.map_dataができました。これをもとに描画を行えばOKです。マップの配列をfor文でループさせながら壁は青の四角、敵は赤の四角…というように処理していきます。

    画像
    ▲マップの全体像が表示されました。

    今回はここまでとします。
    タイトル画面の作成ばかりしていてゲーム本体の方があまり進んでいないので、次回はそちらに手を入れようと思います。

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

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

     
     
    出版社のしがない社内SE。 ここでは主に趣味のプログラミングやゲーム制作について書いています。作ったゲームは https://koidemizu.github.io/ で公開しているのでよかったら遊んでください。 ゲーム大好きインドア派。

    あなたへのおすすめ