見出し画像

MSX-BASICで作った、シンプルにもほどがあるアクションゲームの中身を、プログラム初学者向けの資料として公開・完成版もあるよ

インディーゲームクリエイターのコミュニティハブ「ASOBU」の渋谷ワーキングスペースで行ったサークル配信「4 ASOBU」で、自作のアクションゲーム『Game(仮)』を紹介しました。

その部分の切り抜き動画が、こちら。低速&モノクロ画面の状態から、高速化を図り、アニメーションパターンを追加し、カラフルなグラフィックを適応……と、ゲームが徐々にリッチになっていく過程を再現しています。

ゲーム内容は、テストプレイヤーのひさめさんが朗らかにプレイしてくれたおかげで一瞬錯覚しますが、シンプルにもほどがある内容です。明文化すると、こんな感じ。

  • a(プレイヤーキャラ)をカーソルキーの左右で操作して、

  • 降ってくる×(障害物)をよけながら、

  • たまに出現する〇(スコアアイテム)を獲得していく、

  • スコアアタック形式のアクションゲーム。

  • スペースキーを押すとj(ショット)を発射する。

  • jが×に当たると、破壊&得点/jが〇に当たると、破壊&減点。

  • aが×に衝突すると、ゲームオーバー。

以下は、配信の最初の状態と同等の内容のゲームをプレイできるリンクカードです。リンク先に飛ぶとすぐ、ウィンドウ右側のゲーム実行画面で遊べます!

動作が遅すぎて無理! という方は、エミュレータ設定(ゲーム実行画面右下の歯車マークをクリック)の、「Select Machine」項を「MSX Turbo R Japan(NTSC)」(リストの上から3番目)にしてみてください。無理やり、アクションゲームらしさが増します。


プログラムの大雑把な解説

本作の実行環境はMSXPen。レトロPCのひとつ“MSX規格PC”のエミュレータに、ユーザー作成プログラムの簡易実行機能が加わったWebアプリケーションです。アプリ内のタブにプログラムを記述したURLを共有すると、そのリンクに飛んだ時点でプログラムが即実行されるという使い勝手のよさが魅力です。これは無料で使えますが、作者にドネートすることもできます。

プログラムは、BASIC(大昔の初心者向けプログラミング言語)のごく基本的な命令で構成しています。機種依存の特殊機能や、処理速度を確保するためのスマートな記述テクニックを使おうにも使えないという私自身の技量の問題が一番大きいのですが、それゆえに、どの部分で何が行われているかということについては理解しやすくなっていると思います。

以下、いくつかの要素にわけでプログラムの中身を、抽象度の高い順に紹介していきます。プログラム知識が0だとどうにもとっつきが悪いですが、それでも解説文を読んでいると、ぼんやりわかったような気になれるので、おすすめです。

■このゲームで使っているMSX-BASICの命令文

ゲームのメイン部分で実質躍動しているのは「LET」以降の11個ほどです。ある意味、この程度で十分それっぽいゲームが作れてしまう(ロジック上は)……ということです。

これはMSX-BASIC命令文のほんの一部。もっといろいろ上手に使うことで、リッチかつ高速処理なゲームプレイを実現できます。MSX規格は劇的なバージョンアップが何度か行われましたが、その間にBASIC体系が一新されることはなく、下位互換がサポートされ続けたのは素敵です。MSX-BASICのリファレンスは、こちらにまとめられているものを全面的に参考にしました。

■プログラムの各場所(行番号)で行っていること

ゲームプレイ中はメインルーチン(行番号2000 ~ 2490)をグルグル回り続け、必要に応じて各サブルーチンに飛びます。

FOR〜NEXTループからGOTO文で飛び出したり、GOSUBで飛んだサブルーチンから復帰することなくゲームオーバー処理に飛んだり……とスタック処理どうなっているんだという疑問がわかないでもないですが、この規模のゲームでは問題なく動作しているので不問としておきます(笑)。

■このゲームで使用した変数

大部分が座標関係。キャラの表示だけでなく、キャラ同士の衝突判定にもダイレクトで使っているので、自然と重要度が高くなります。今回は面倒くさがって実装しませんでしたが、ショットも、配列変数を使えば2連射、3連射も可能です(処理速度を確保できるかは、だいぶ怪しいですが)。

上記リンク先のプログラムリストと照らし合わせながら、「この変数の数値を変えたらどうなるだろう」とおそるおそる試してみる(プログラムに変更を加えた後、エミュレータ実行画面下の「▶Run」を押下)のもよいでしょう。万が一エラーか何かで動かなくなっても、リンク先ページを新規で読み込み直せば大丈夫!

完成版『Game(仮)』は、これだ!

今回解説したプログラムは、最低限の機能だけ実装したものです。冒頭の動画でもセルフ指摘していますが、このままではスコアアタック形式のゲームとして致命的な欠点があります。なので、あくまでもBASIC製ゲームの基本構造・ロジックを理解するための叩き台としてご利用ください。

さまざまな不具合を解消しつつ、競技シーン()でも使える内容にバージョンアップした”完成版”は、以下リンクカードから遊べます!

以下、主な変更点・強化点です。

  • 作成済みのグラフィックを適応

  • プレイヤーキャラのアニメ(移動、ショット)を追加

  • 落下物に「破壊不能な障害物」を追加

  • プレイの制限時間(60秒)&残りタイム表示を導入

  • ハイスコア記録機能の実装(タイトル画面で確認可能)

  • ゲームフィールドのサイズを変更

  • 落下物の最大同時出現数を4→6に増加

  • サウンド演奏データの配列変数化(※内部処理の変更)

完成版中身に関しては、以下の配信動画でも雑に解説しています。微妙にバージョンが古いですが、ご参考までに……

ゲームプレイに関しては、たまに撃ち落としたはずの障害物が壊れない場合があるものの、おおむね良好です。キー反応が悪いなりの攻略法も見つかったりで、奥は深くないですがハイスコアの狙いがいがあります。

現時点で作者(私)が知る、このバージョンの最高得点は295。我こそはというゲーマーは夢の300点越えを目指してみてください!


この記事が気に入ったらサポートをしてみませんか?