シーン:レーン制御

ここではゲームのメイン部分、レーン内の制御方法について説明しています。

レーンとは具体的には以下の部分を指します。

※判定結果(GREAT)の表示はここには含まれません

レーンの描画は基本的にシステム側の処理となりますが、実際にシステムが行う処理とはオブジェや小節ライン、背景などの各要素の位置の計算と、その位置にスキンとして指定された画像やアニメーションを描画するだけです。

スキン側で行うことはこれらの画像をLuaからシステムに登録することと、必要ならばアニメーションの制御を行うのみで、比較的簡単に独自のレーンデザインを行うことが出来ます。
なお、画像などの登録が行われなかった場合はシステム側で代替表示が行われるため、レーン自体のデザインをひとまずシステム側に任せてしまうということが可能です。
これによりレーン以外のデザインを優先的に行うことが出来ます。

この独自レーンはゲーム画面の他にキャリブレーション時にも使用されますが、独自レーンはそもそもゲームシーン内で表示されるものなので、独自レーンを使用するにはゲームシーンの処理が必須となります。
レーン定数
レーンのサイズや各オブジェクトのサイズをシステム側に通知するため、Luaのグローバル定数としてレーンの情報を定義します。これにより、システムはレーンの描画に必要な座標などの計算が出来るようになります。

以下は、定数に合わせたレーンデザイン方法について説明しています。
LANE_WIDTH
LANE_HEIGHT
レーン自体のサイズを指定します。1P、2P側ともに同一のサイズになります。
レーン背景画像のサイズはここで指定したサイズで作成されている必要があります。
また、ロングノート用の中間オブジェクトの高さもこのサイズに合わせておく必要があります。
    
OBJ_WIDTH_WHITE
OBJ_WIDTH_BLACK
OBJ_WIDTH_SCRATCH
白鍵、黒鍵、スクラッチオブジェクトの幅を指定します。
OBJ_HEIGHT 白鍵、黒鍵、スクラッチオブジェクトの高さを指定します。これらのオブジェは全て同じ高さである必要があります。


また、ここで指定した高さが判定ラインの高さとしても使用されるため、レーン背景の一番下に判定用のラインを引いてください。
LONG_SPACE_HEIGHT ロングノートの結合部で、隙間とヘッダ部の高さを指定します。
隙間部分は描画はされずに背景が透けて表示されます。

※ロングノートの上部と下部のオブジェ画像自体は、定義上は別々のオブジェクトとして定義されていますが、計算上は必ず上下の隙間とヘッダの高さは同じにしておく必要があります
※隙間やヘッダ部を0にすることで、中間部分を上下のオブジェにぴったりとくっつけることも出来ます
LONG_HEADER_HEIGHT
LANE_SINGLE_1P_X
LANE_SINGLE_1P_Y
LANE_SINGLE_2P_X
LANE_SINGLE_2P_Y
シングルプレイの1P側と2P側それぞれのレーンの左上座標を指定します。
LANE_DOUBLE_1P_X
LANE_DOUBLE_1P_Y
LANE_DOUBLE_2P_X
LANE_DOUBLE_2P_Y
ダブルプレイ時の左右のレーンそれぞれの左上座標を指定します。
LANE_OFFSET_1P_KEY0
LANE_OFFSET_1P_KEY1
LANE_OFFSET_1P_KEY2
LANE_OFFSET_1P_KEY3
LANE_OFFSET_1P_KEY4
LANE_OFFSET_1P_KEY5
LANE_OFFSET_1P_KEY6
LANE_OFFSET_1P_SCRATCH
1P側のオブジェが表示される各チャンネルのXオフセットを指定します。
レーンの左側を0として、そこから何ドット右側にあるかを設定します。
LANE_OFFSET_2P_KEY0
LANE_OFFSET_2P_KEY1
LANE_OFFSET_2P_KEY2
LANE_OFFSET_2P_KEY3
LANE_OFFSET_2P_KEY4
LANE_OFFSET_2P_KEY5
LANE_OFFSET_2P_KEY6
LANE_OFFSET_2P_SCRATCH
2P側のオブジェが表示される各チャンネルのXオフセットを指定します。
レーンの左側を0として、そこから何ドット右側にあるかを設定します。
LANE_MAX_EXPLOSION 1チャンネルあたりの爆発アニメの最大合成数を指定します。同一のチャンネルで爆発が起こった場合に、以前の爆発を残したまま新しい爆発を開始させて合成します。

ここで指定した数以上の爆発が同時に起こった場合は、一番古い爆発アニメを強制的に終わらせて新たに爆発を開始します。同時合成数が多いほど処理が重くなるため、通常は3くらいを設定しておけば問題ありません。
レーンオブジェクト
レーンで使用する各オブジェクトは、定数OBJID_****として定義されています。

レーンの描画時にはここで指定した画像やアニメーションを表示に使いますが、通常オブジェやロングオブジェなどの一部のオブジェクトは指定が無ければ自動的にシステムが代わりの画像を表示します。デバッグ用など仮のレーン表示だけ行いたい場合は何も指定しないということも可能です。

通常は1P側と2P側では左右が反転しているため、デザイン時はそれぞれ作成しなければなりませんが、小節バーなど左右で同一のものであれば1つだけ作成しておいて流用することが出来ます。この場合は、それぞれのオブジェクトに対して同一の画像を指定してください。

以下はcharatbeatHDXのシステムレーンの参考画像です。

レーン構成系
OBJID_1P_LANE_BG
OBJID_2P_LANE_BG
  
OBJID_1P_BAR
OBJID_2P_BAR

OBJID_1P_LIGHT
OBJID_2P_LIGHT
OBJID_1P_LANE_COVER_SUD
OBJID_2P_LANE_COVER_SUD
OBJID_1P_LANE_COVER_HID
OBJID_2P_LANE_COVER_HID
OBJID_1P_TEMPOCHANGE
OBJID_2P_TEMPOCHANGE

白鍵盤系
OBJID_WHITE_BGLIGHT
OBJID_WHITE_OBJECT
OBJID_WHITE_MIME
OBJID_WHITE_LONG_UP
OBJID_WHITE_LONG_DOWN
OBJID_WHITE_LONGOFF_UP
OBJID_WHITE_LONGOFF_MIDDLE
OBJID_WHITE_LONGOFF_DOWN
OBJID_WHITE_LONGON_UP
※OFF画像の上に重ねて表示される
OBJID_WHITE_LONGON_MIDDLE
※OFF画像の上に重ねて表示される
OBJID_WHITE_LONGON_DOWN
※OFF画像の上に重ねて表示される
OBJID_WHITE_HCN_UP
OBJID_WHITE_HCN_DOWN
OBJID_WHITE_HCNOFF_UP
OBJID_WHITE_HCNHEAL_UP
OBJID_WHITE_HCNDMG_UP
OBJID_WHITE_HCNOFF_DOWN
OBJID_WHITE_HCNHEAL_DOWN
OBJID_WHITE_HCNDMG_DOWN
BJID_WHITE_HCNOFF_MIDDLE
OBJID_WHITE_HCNHEAL_MIDDLE
OBJID_WHITE_HCNDMG_MIDDLE
OBJID_WHITE_EXPLODE
OBJID_WHITE_EXPLODE_LONG
OBJID_WHITE_EXPLODE_HEAL
OBJID_WHITE_EXPLODE_DMG
黒鍵盤系
OBJID_BLACK_BGLIGHT
OBJID_BLACK_OBJECT
OBJID_BLACK_MIME
OBJID_BLACK_LONG_UP
OBJID_BLACK_LONG_DOWN
OBJID_BLACK_LONGOFF_UP
OBJID_BLACK_LONGOFF_MIDDLE
OBJID_BLACK_LONGOFF_DOWN
OBJID_BLACK_LONGON_UP
※OFF画像の上に重ねて表示される
OBJID_BLACK_LONGON_MIDDLE
※OFF画像の上に重ねて表示される
OBJID_BLACK_LONGON_DOWN
※OFF画像の上に重ねて表示される
OBJID_BLACK_HCN_UP
OBJID_BLACK_HCN_DOWN
OBJID_BLACK_HCNOFF_UP
OBJID_BLACK_HCNHEAL_UP
OBJID_BLACK_HCNDMG_UP
OBJID_BLACK_HCNOFF_DOWN
OBJID_BLACK_HCNHEAL_DOWN
OBJID_BLACK_HCNDMG_DOWN
OBJID_BLACK_HCNOFF_MIDDLE
OBJID_BLACK_HCNHEAL_MIDDLE
OBJID_BLACK_HCNDMG_MIDDLE
OBJID_BLACK_EXPLODE
OBJID_BLACK_EXPLODE_LONG
OBJID_BLACK_EXPLODE_HEAL
OBJID_BLACK_EXPLODE_DMG
スクラッチ系
OBJID_SCRATCH_BGLIGHT
OBJID_SCRATCH_OBJECT
OBJID_SCRATCH_MIME
OBJID_SCRATCH_LONG_UP
OBJID_SCRATCH_LONG_DOWN
OBJID_SCRATCH_LONGOFF_UP
OBJID_SCRATCH_LONGOFF_MIDDLE
OBJID_SCRATCH_LONGOFF_DOWN
OBJID_SCRATCH_LONGON_UP
※OFF画像の上に重ねて表示される
OBJID_SCRATCH_LONGON_MIDDLE
※OFF画像の上に重ねて表示される
OBJID_SCRATCH_LONGON_DOWN
※OFF画像の上に重ねて表示される
OBJID_SCRATCH_HCN_UP
OBJID_SCRATCH_HCN_DOWN
OBJID_SCRATCH_HCNOFF_UP
OBJID_SCRATCH_HCNHEAL_UP
OBJID_SCRATCH_HCNDMG_UP
OBJID_SCRATCH_HCNOFF_DOWN
OBJID_SCRATCH_HCNHEAL_DOWN
OBJID_SCRATCH_HCNDMG_DOWN
OBJID_SCRATCH_HCNOFF_MIDDLE
OBJID_SCRATCH_HCNHEAL_MIDDLE
OBJID_SCRATCH_HCNDMG_MIDDLE
OBJID_SCRATCH_EXPLODE
OBJID_SCRATCH_EXPLODE_LONG
OBJID_SCRATCH_EXPLODE_HEAL
OBJID_SCRATCH_EXPLODE_DMG
オートスクラッチ系
OBJID_AUTOSCRATCH_OBJECT
OBJID_AUTOSCRATCH_MIME
OBJID_AUTOSCRATCH_LONG_UP
OBJID_AUTOSCRATCH_LONG_DOWN
OBJID_AUTOSCRATCH_LONGOFF_UP
OBJID_AUTOSCRATCH_LONGOFF_MIDDLE
OBJID_AUTOSCRATCH_LONGOFF_DOWN
OBJID_AUTOSCRATCH_HCN_UP
OBJID_AUTOSCRATCH_HCN_DOWN
OBJID_AUTOSCRATCH_HCNOFF_UP
OBJID_AUTOSCRATCH_HCNOFF_DOWN
OBJID_AUTOSCRATCH_HCNOFF_MIDDLE



コントロールオブジェクト
上のレーンオブジェクトとは、例えば白鍵盤用の爆発アニメは全ての白鍵盤レーンに対して適用されます。これに対してコントロールオブジェクトとは、このアニメーションを各レーンごとに制御するための仕組みです。

例えば1P側の各レーンの爆発アニメとして、以下のように白鍵盤用、黒鍵盤用、スクラッチ用の爆発を用意したとします。
白鍵盤用
OBJID_WHITE_EXPLODE
黒鍵盤用
OBJID_BLACK_EXPLODE
スクラッチ用
OBJID_SCRATCH_EXPLODE
※分かりやすいように色を付けています

これで該当するレーンにはそれぞれの色のついた爆発が適用されたことになります。

次にこの爆発をゲーム中に制御する場合を考えます。
爆発は各レーン別々に発生しなければならないため、ここで始めてコントロールオブジェクトのIDが必要となります。

コントロールオブジェクトのIDはCTRLID_****として定義されていますが、爆発アニメはそれぞれのレーンごとにコントロール出来るようにコントロールIDが決められており、実際の制御を行うにはこのコントロールIDに対してアニメーションなどのフレーム制御を行います。

以下は1P側に適用された爆発アニメに対する各レーンのコントロールIDの対応付けのイメージです。


爆発が必要になったら、該当するコントロールIDに対してhdxSysCtrlObject()関数を呼び出すことで、そのレーンだけを制御することが出来るというわけです。

オブジェクトIDコントロールID定数ページにまとめられています。