aburi6800のブログ

コンピュータのプログラミング、ゲームに関するニッチな情報を書いていくブログです。

【MSX】インディ・ショーンズ 洞窟の秘宝 開発メモ

この記事について

恥ずかしいのですが、せっかくですので、先日公開した拙作のBASICゲームの作成メモを公開します。
だいたいこんな感じで書いていって、手元に資料化しています。参考になれば幸いです。
なお、絵はブギーボードに書いたのをスマホアプリでスキャンしています。(なかなか便利)
ゲームの概要については、前回の記事を参照願います。

aburi6800.hatenablog.com


概要

洞窟を舞台で探検家が主人公。
洞窟の奥に眠る財宝を目指して進んでいくストーリー。

  • 自機と照準を別々に操作。
  • スペースキーを押している間は照準を移動。離すと弾を撃つ。
  • 弾はと照準に向かって飛ぶ。着弾まで次の弾は撃てない。
  • 上にはコウモリ、地面はガイコツ
  • コウモリの落とす毒やガイコツに触れるとアウト
  • ガイコツはジャンプしてかわそう
  • コウモリをある程度倒したらレベルクリア
  • 5レベル?クリアで財宝にありつける(デモ+ボーナス)

(5/27 追加ルール)
- ナイフを投げると-10点。ゼロのときに投げて外すとミス。
- 得点はナイフの移動量による。1回移動すると加点+10。(たとえば8回ナイフが動いて当たると+80点、なので画面上部にいるのを倒すのは難しいけどお得)

概要は最初に書いて、頭の中でイメージを作ります。
このあと、画面のモックやキャラクターの初期デザインを作って、雰囲気を固めておきます。 このゲームの場合は、勢い余ってタイトル画面まで作っちゃいましたね(^^;


悩ましいところ

  • ナイフ移動中もコウモリとの当たり判定を行うか?(なんか簡単になりそう)
     →簡単になりすぎたのでしない
  • ガイコツをジャンプしてかわしたら得点入れるか?(判定方法がよくわからない)
     →しない(上記追加ルールから、序盤ステージではガイコツは出ないが0点でミスにできなくなる、ナイフを投げられない制御が必要になる、などの理由による)
  • コウモリの移動量、あるていど大きくするべきか?(あまり小さいと当てやすくなるかも)
     →今のままとする(が、突撃モードは移動が雑なので、もう少し調整するかも)
  • ちょっと単調、狙って当てる緊張感がない
     →追加ルールで対処(減点は2面以降はあまり意味がないが、クリアボーナス=面×100とかでなんとか調整できるか?)


キャラクター

プレイヤー

設定

  • 左右に移動、上方向(斜めも可)でジャンプ
  • ジャンプ中は一定の軌道で移動、その間は操作できない
  • スペースキーを押すと照準を移動、その間は移動できない
  • 照準移動中にスペースキーを離すとナイフを投げる、その直後から移動可能となる
  • ナイフはスペースキーを離した時点の照準の場所へ飛ぶ、到達するまで次のナイフは撃てない
  • コウモリやガイコツ、毒などに当たるとミス。

処理

  • トリガフラグ判定
    • ON :
      • 照準移動処理 (サブルーチン) へ
    • OFF :
      • プレイヤー移動処理 (サブルーチン) へ
  • ショットフラグ判定
    • ON :
      • ナイフ移動処理 (サブルーチン) へ
  • プレイヤー移動処理 (サブルーチン)
    • ジャンプフラグ判定
      • ON :
        • X,Y座標と移動量を計算
        • 画面端判定、座標補正
        • スプライトアトリビュート更新
        • Y座標が画面下限(地面)に到達したらジャンプフラグ=OFF
      • OFF :
        • 入力に応じてプレイヤーを移動
        • 上方向の場合はジャンプフラグ=ON
    • ジャンプ判定
      • ジャンプフラグ=OFF かつ 上方向の入力 (8,1,2) の場合
        • ジャンプフラグ=ON
    • 移動処理
      • 入力方向から移動量計算
      • 画面端判定、座標補正
      • スプライトアトリビュート更新
  • 照準移動処理 (サブルーチン)
    • 方向入力に応じて照準を移動
    • トリガ入力=OFFになったらトリガフラグ=OFF、ナイフ発射処理 (サブルーチン) へ
  • ナイフ発射処理 (サブルーチン)
    • ナイフ発射フラグ判定
      • ON :
        • 処理しない
      • OFF :
        • プレイヤー位置と照準位置から、移動量を計算
        • ナイフ到達位置に照準位置を設定
        • ナイフ発射フラグ=ON
        • ナイフのスプライト表示
  • ナイフ移動処理 (サブルーチン)
    • ナイフ座標に移動量を加算、スプライト移動
    • 座標判定
      • ナイフ到達位置の場合 :
        • ナイフスプライト消去
        • ナイフ発射フラグ=OFF
        • コウモリとの当たり判定、ヒットしていたら :
          • 対象のコウモリの状態を非表示に
          • スコア加算
          • コウモリ残数をデクリメント、ゼロならゲーム状態をレベルクリアへ


コウモリ

設定

  • 同時に最大2体まで出現
  • 飛行中と降下中の2つの状態を持つ
    • 飛行中:画面上部を一定の軌跡で飛ぶ、毒を落とす
    • 降下中:プレイヤーめがけて降りてくる、地面まで来ると上に移動、飛行中に戻る
  • プレイヤーに触れるとアウト
  • 毒は以前作った逆スクロールルーチンを使用する

処理

  • ゲームループごとに1→2→1と処理対象のコウモリを切り替える
  • 状態を判定 :
    • 非表示 :
      • 画面表示数 = 最大出現数 なら出現させない
      • 状態=飛行中、飛行初期設定 (サブルーチン) へ
    • 飛行中 :
      • 乱数 < 降りてくる確率 の場合 :
        • 状態=降下中、降下初期設定 (サブルーチン) へ
      • 上記以外の場合 :
        • 座標計算
        • 乱数 < 毒を出す確率 の場合 :
          • 現在のテキスト座標に毒を表示
        • 目標座標に到達したか?
          • 到達した :
            • 飛行初期設定 (サブルーチン) へ
          • 到達していない :
            • 処理なし
    • 降下中 :
      • 座標計算
      • 目標座標に到達したか?
        • 到達した :
          • 状態=上昇中、飛行初期設定 (サブルーチン) へ
        • 到達していない :
          • 処理なし
    • 上昇中 :
      • 座標計算
      • 目標座標に到達したか?
        • 到達した :
          • 状態=飛行中、飛行初期設定 (サブルーチン) へ
        • 到達していない :
          • 処理なし
    • プレイヤーとヒットしたか?:
      • ヒットした :
        • ゲーム状態=ミス
      • ヒットしていない :
        • 処理なし
  • 飛行初期設定 (サブルーチン)
    • 目標座標X, Y をランダムに設定
    • 移動量X、移動量Yを設定
  • 降下初期設定 (サブルーチン)
    • 目標座標X,Y をプレイヤー位置に設定
    • 移動量X、移動量Yを設定


コウモリは最初2体で考えてましたが、少なくて画面が寂しかったので、3体にしました。


ガイコツ

設定

  • 同時に最大2体まで出現
    • ゲームループごとに1→2→1と処理対象のガイコツを切り替える
  • 画面端から出現、まっずぐ横に移動する
  • プレイヤーに触れるとアウト

処理

  • 出現前 :
    • 出現タイマーをデクリメント、ゼロになったら出現
    • ランダムで出現位置(左端・右端)と移動方向を設定、出現フラグON
  • 出現中 :
    • 出現フラグONなら座標に移動方向を加算、スプライト移動
    • 画面端に到達したら出現フラグOFF


設定

  • ラウンドが進むと出現
  • ランダムな位置で画面上部から落ちてくる
  • スクロールて自動的に移動

処理

  • 岩出現タイマー判定
    • >0 :
      • 岩出現タイマーを-1
    • =0 :
      • ランダムなX座標で岩を表示
      • 岩出現タイマーに初期値を設定
    • =-1 :
      • 処理なし


キャラクターや障害物は、最初一定周期で出そうと考えてましたが、ランダムにしてしまいました。


ゲーム状態


意味
1 タイトル〜ゲーム初期化
2 ラウンドスタート
3 ゲームメイン
4 ラウンドクリア
5 ゲームクリア
6 ミス
7 ゲームオーバー


変数表


変数名 内容 説明
GS ゲーム状態 1=タイトル
2=ラウンドスタートデモ
3=ゲームメイン
4=ラ ウンドクリア
5=ミス
6=ゲームオーバー
7=オールクリア
RD ラウンド数
SC スコア
LF 残機
TL 残りターゲット数
N スプライト表示対象のキャラクター番号 スプライトプレーン番号はこの値に+2する
0:プレイヤー
2 : 照準
3 : ナイフ
4~5 : コウモリ
6 : ガイコツ
X(n),Y(n) スプライトX,Y座標 16倍して保持
JY(n) ジャンプ中のY座標加減算値
TX(n),TY(n) 移動先のスプライトX,Y座標 16倍して保持
WX(n),WY(n) スプライトX,Y移動量 16倍して保持
F(n) 敵の状態フラグ 値 :
0=未発生
1=発生(右向き)
2=発生(左向き)
3=発生(やられ)
n(インデックス) :
4~6=コウモリ
7=ガイコツ
P(n) スプライトパターン番号
R(n) スプライトアニメカウンタ 0,1で交互に変更
C(n) スプライトカラー番号
C ゲームループ内で処理対象とする敵キャラクターの番号
SF ショットフラグ 1=ナイフ投げている
0=ナイフ投げていない
BF 操作モード 0=プレイヤー操作中
1=照準操作中
JF ジャンプフラグ 初期値は7、ジャンプ中にデクリメントする
JY(n) ジャンプ中のY座標加減算値
JS ジャンプ時に入力されていたSTICK値
TF 目標座標到達判定フラグ
TL ターゲット残り
MC ナイフ移動カウンタ 発射時にゼロに初期化、移動の都度+1
X,Y キャラクター初期位置 キャラクター移動初期処理(2000行目〜)で使用
TX,TY キャラクター目標位置 キャラクター移動初期処理(2000行目〜)で使用
SP キャラクター移動スピード キャラクター移動初期処理(2000行目〜)で使用
X1,Y1,X2,Y2 キャラクター移動デモの移動開始座標、移動終了座標 キャラクター移動デモ処理(5400行目〜)で使用

BASICだと変数名に最大2文字しか使えないので、変数表は必須ですね(^^;


スプライトパターン


キャラクター PLANE PTN1 COL1 PLANE PTN2 COL2
ショーンズ 右向き1 0 0(0,1,2,3) 5 1 1(4,5,6,7) 10
ショーンズ 右向き2 0 2(8,9,10,11) 5 1 3(12,13,14,15) 10
ショーンズ 左向き1 0 4(16,17,18,19) 5 1 5(20,21,22,23) 10
ショーンズ 左向き2 0 6(24,25,26,27) 5 1 7(28,29,30,31) 10
ショーンズ ミス 0 8(32,33,34,35) 5 1 9(36,37,38,39) 10
照準 2 10(40,41,42,43) 14 - - -
ナイフ 3 11(44,45,46,47) 15 - - -
コウモリ1 4 12(48,49,50,51) 5 - - -
コウモリ2 4 13(52,53,54,55) 5 - - -
ケルトン 右向き1 5 14(56,57,58,59) 14 - - -
ケルトン 右向き2 5 15(60,61,62,63) 14 - - -
ケルトン 左向き1 5 16(64,65,66,67) 14 - - -
ケルトン 左向き2 5 17(68,69,70,71) 14 - - -


その他メモ

  • パターン番号の算出方法

    • プレイヤー
      • PUT SPRITE時 : [対象のパターン番号] + [アニメーションカウンタ] * 2
      • VPOKE時 : ( [対象のパターン番号] + [アニメーションカウンタ] * 2 ) * 4
    • その他
      • PUT SPRITE時 : [対象のパターン番号] + [アニメーションカウンタ]
      • VPOKE時 : ( [対象のパターン番号] + [アニメーションカウンタ] ) * 4
  • プレイヤーのパターン番号
    S=2,3,4 : 0
    S=6,7,8 : 4
    上記以外 : 変更なし

  • キャラクターの移動処理はおそらく一つでOk、移動先と移動量の設定やアルゴリズム(途中の目標座標や移動速度の変更など)は個別で。座標などはコウモリもガイコツも同じ配列で管理する。

  • 計算の都合で、座標値は内部で16倍して持ち、表示時に16で割る。注意。


レベル設定

  • レベル1 (練習ステージ)

    • コウモリ
      • 下に降りてくる
  • レベル2

    • コウモリ
      • 毒を落とす
      • 下に降りてくる
  • レベル3

    • コウモリ
      • 毒を落とす
      • 下に降りてくる
    • ケルトン出現
  • レベル4

    • コウモリ1
      • 毒を落とす
      • 下に降りてくる
    • ケルトン出現  - 岩が落ちてくる
  • レベル5

    • コウモリ
      • 毒を落とす
      • 下に降りてくる
    • ケルトン出現  - 岩が落ちてくる