見出し画像

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

前回に引き続き2Dアクションゲームの製作を行っていきます。今回は「画面のスクロール」をメインに、その他こまごまとした追加要素を作りました。
前回までの進行具合は以下のnoteをご参照ください。

さて、2Dアクションゲームといえばやはり「スクロール」が必要でしょう。画面スクロールを実装するにはカメラの動きを気にしなければなりません。早速ですが画像でご紹介。

2パターンのGIFを載せてみました。似ているようで動きはちょっと異なっています。プレイヤーの位置を指で押さえてみると違いが分かりやすいかと思います。
上の方はプレイヤーの移動時に「マップだけ」ずらしています。背景のマップが動くので移動しているように見えますが、プレイヤーの画面位置は変わっていません。そのため指の位置は全く変わらないはずです。どんなに広いマップでも同じ画面位置のまま移動できます。
下の方は「マップもプレイヤーも」動かしています。そのため、プレイヤーの画面位置がどんどんずれていきます。指で押さえていてもすぐにずれてしまうはずです。こちらの方がスピード感はあるのですが、移動していくうちに画面の端に近づいてしまいます。広いマップを探索するにはどこかで画面位置のリフレッシュが必要です。

さて、どちらを採用するか…。
結論としては下の方にしました。なんかキャラクターがビュンビュン動いて楽しかったので。まぁそこまで悪い方式では無いですよね(自己暗示)。ロックマンとかこんな感じだった気がします。

続いて作成したのはプレイヤーの攻撃に角度を付ける機能です。今回のゲームは最終的に「早い時間で・ダメージを受けずに敵を全滅すると高スコア」といった形にしようと思うので、プレイヤーの攻撃バリエーションを増やします。昔スマッシュブラザーズにあった「ターゲットをこわせ」みたいにしようと思います。

▲下に角度をつけて攻撃。
▲上に角度をつけて攻撃。
▲動いているところはこんな感じ。

これできちんと操作すればノーダメージでのクリアも出来そうです。
プレイヤーについての改修はここまで。続いて敵の動きについてです。

敵キャラクターには色のバリエーションを増やし、破壊後の画像も作成しました。

▲敵を破壊すると…。
▲見えにくいですがそれぞれの色に応じた残骸になっています。

この部分は各敵に応じて破壊後のタイルマップの対応を保持することで実現しています。具体的には下記の辞書型です。

      self.enemy_break = {
                         (0, 1):(0, 7),
                         (1, 1):(1, 7),
                         (2, 1):(2, 7),
                         (3, 1):(3, 7),
                         (0, 2):(0, 8),
                         (1, 2):(1, 8),
                         (2, 2):(2, 8),
                         (3, 2):(3, 8),
                         (0, 3):(0, 9),
                         (1, 3):(1, 9),
                         (2, 3):(2, 9),
                         (3, 3):(3, 9),
                         }

例えばタイルマップ(0, 1)の敵は破壊されると(0, 7)のグラフィックに変わります。冗長ですが手作業でこのような対応付けを作りました。

その他にはプレイヤーの体力やステージ開始からの時間経過などを実装して今回はおしまい。

コード全体は長くなるので、GitHubのリポジトリをご参照ください。

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


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

つくってみた

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