【MSX】インディ・ショーンズ 洞窟の秘宝 開発メモ
この記事について
恥ずかしいのですが、せっかくですので、先日公開した拙作のBASICゲームの作成メモを公開します。
だいたいこんな感じで書いていって、手元に資料化しています。参考になれば幸いです。
なお、絵はブギーボードに書いたのをスマホアプリでスキャンしています。(なかなか便利)
ゲームの概要については、前回の記事を参照願います。
概要
洞窟を舞台で探検家が主人公。
洞窟の奥に眠る財宝を目指して進んでいくストーリー。
- 自機と照準を別々に操作。
- スペースキーを押している間は照準を移動。離すと弾を撃つ。
- 弾はと照準に向かって飛ぶ。着弾まで次の弾は撃てない。
- 上にはコウモリ、地面はガイコツ
- コウモリの落とす毒やガイコツに触れるとアウト
- ガイコツはジャンプしてかわそう
- コウモリをある程度倒したらレベルクリア
- 5レベル?クリアで財宝にありつける(デモ+ボーナス)
(5/27 追加ルール)
- ナイフを投げると-10点。ゼロのときに投げて外すとミス。
- 得点はナイフの移動量による。1回移動すると加点+10。(たとえば8回ナイフが動いて当たると+80点、なので画面上部にいるのを倒すのは難しいけどお得)
概要は最初に書いて、頭の中でイメージを作ります。
このあと、画面のモックやキャラクターの初期デザインを作って、雰囲気を固めておきます。 このゲームの場合は、勢い余ってタイトル画面まで作っちゃいましたね(^^;BASICゲーム制作。
— あぶり6800 (@aburi6800) May 4, 2023
とりあえずタイトルを作ったゾー。
タイトル画面にちょこっとした動きがあると良いですね😊
さあ、どんどん作っていこう〜#msx #basic #gamedev pic.twitter.com/XVVXhnDADT
悩ましいところ
- ナイフ移動中もコウモリとの当たり判定を行うか?(なんか簡単になりそう)
→簡単になりすぎたのでしない - ガイコツをジャンプしてかわしたら得点入れるか?(判定方法がよくわからない)
→しない(上記追加ルールから、序盤ステージではガイコツは出ないが0点でミスにできなくなる、ナイフを投げられない制御が必要になる、などの理由による) - コウモリの移動量、あるていど大きくするべきか?(あまり小さいと当てやすくなるかも)
→今のままとする(が、突撃モードは移動が雑なので、もう少し調整するかも) - ちょっと単調、狙って当てる緊張感がない
→追加ルールで対処(減点は2面以降はあまり意味がないが、クリアボーナス=面×100とかでなんとか調整できるか?)
キャラクター
プレイヤー
設定
- 左右に移動、上方向(斜めも可)でジャンプ
- ジャンプ中は一定の軌道で移動、その間は操作できない
- スペースキーを押すと照準を移動、その間は移動できない
- 照準移動中にスペースキーを離すとナイフを投げる、その直後から移動可能となる
- ナイフはスペースキーを離した時点の照準の場所へ飛ぶ、到達するまで次のナイフは撃てない
- コウモリやガイコツ、毒などに当たるとミス。
処理
- トリガフラグ判定
- ON :
- 照準移動処理 (サブルーチン) へ
- OFF :
- プレイヤー移動処理 (サブルーチン) へ
- ON :
- ショットフラグ判定
- ON :
- ナイフ移動処理 (サブルーチン) へ
- ON :
- プレイヤー移動処理 (サブルーチン)
- 照準移動処理 (サブルーチン)
- 方向入力に応じて照準を移動
- トリガ入力=OFFになったらトリガフラグ=OFF、ナイフ発射処理 (サブルーチン) へ
- ナイフ発射処理 (サブルーチン)
- ナイフ発射フラグ判定
- ON :
- 処理しない
- OFF :
- プレイヤー位置と照準位置から、移動量を計算
- ナイフ到達位置に照準位置を設定
- ナイフ発射フラグ=ON
- ナイフのスプライト表示
- 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 :
- 処理なし
- >0 :
キャラクターや障害物は、最初一定周期で出そうと考えてましたが、ランダムにしてしまいました。
ゲーム状態
値 | 意味 |
---|---|
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で割る。注意。