モードセレクト画面のプログラムについての説明 dm_mode_select_main.c // プログラム本体 dm_mode_select_main.h // ヘッダーファイル モードセレクトでは mode_select_control dm_ms_control; という変数で内部制御を行っています。( 実際は、変数を指すポインタで制御している ) 構造体の説明は、dm_mode_select_main.hを見て下さい。 選択項目(カプセル)等、スクロールするものは、dm_ms_control.main_x を基準に処理・描画をしています。 ( dm_ms_control.main_x + ? という具合) *ソース説明 ------------------------------------------------------------------------------------------------------------------------------------ void dm_ms_eep_write(u32 err_add) 行番号 41 〜 51行 モードセレクト用 EEP 書き込み関数 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void init_dm_ms(void) 行番号 53 〜 180行 モードセレクト初期化関数 61 〜 63行 キーリピート処理に対応させるキーを設定している。 65 〜 74行 タイトル(モードセレクトの看板?)、ボタン(Bキャンセル・A決定)、キノピオの設定。 76 〜 84行 メッセージウインドウとメッセージ表示に関する設定。 87 〜 93行 カーソル位置関係の設定。 94 〜 98行 名前選択カーソルに関する設定。 100 〜 179行 モードセレクトの前の画面処理によって、内部の処理を設定している。 102 〜 108行 前の画面処理がタイトル画面だった場合、最初の選択の処理を行うように設定している。 110 〜 161行 前の画面処理が名前選択・ゲーム設定っだった場合、名前選択処理を行うように設定している。 162 〜 169行 前の画面処理が記録表示画面だった場合、その他の選択処理を行うように設定している。 170 〜 178行 前の画面処理が操作説明画面だった場合、操作説明選択処理を行うように設定している。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ int dm_mode_select_main(NNSched* sched) 行番号 184 〜 1624行 モードセレクト処理メイン関数 234 〜 236行 変数初期化と音楽関係の初期設定。ゲームの時にBGMを停止されていることが有るので、再度鳴らすように設定。 258 〜 264行 キノピオの目パチの処理を行っている。3イントの間、目を閉じた状態を表示したら、目が開いた状態にする。 266 〜 320行 文字列進行や、アニメーションの設定を行っている。 267 〜 314行 ms_p -> sub_type == MS_S_DEFAULT の時(キー受付処理状態)の処理を行っている。 314 〜 320行 カプセルが移動中や、画面切り替えなどの時の処理。(アニメーションを行わないようにしている) 322 〜 1597行 ms_p -> main_type の中身によって処理を行っている。さらに内部で、ms_p -> sub_type の中身によって別の処理を行っている。 ms_p -> main_type は各設定( 1PLAY /2PLAY/その他 等)の画面別の処理を指し、ms_p -> sub_type はその画面処理の中での処理 (他のメニューに戻る/キー操作を行う 等)処理を指している。 323 〜 425行 ms_p -> main_type が MS_M_SCROOLの場合の処理を行っている。MS_M_SCROOL の処理は、他の画面(タイトルや記録表示)から モードセレクトに入ってきたときや、逆にモードセレクトから他に画面行く再の処理を行っている。 327 〜 338行 ms_p -> sub_type が MS_S_FADE_IN_A か MS_S_FADE_IN_B の時の処理を行っている。基本的に、画面切り替え処理を行っている。 違いは、画面切り替え処理が終わった後に行う処理。 339 〜 357行 タイトル(モードセレクトの看板?)、ボタン(Bキャンセル・A決定)、キノピオが画面内に入ってくる処理 を行っている。全て、指定座標まで移動したら、メッセージウインドウ拡大の処理に移る。 359 〜 369行 タイトル(モードセレクトの看板?)、ボタン(Bキャンセル・A決定)が画面内に入ってくる処理 を行っている。全て、指定座標まで移動したら、アイテム(カプセルや黒板)が画面内に移動する処理に移る。 370 〜 382行 メッセージウインドウの移動と拡大処理を行っている。処理終了後、アイテム(カプセルや黒板)が画面内に移動する処理に移る。 383 〜 390行 アイテム(カプセルや黒板)が画面内に移動する処理を行っている。移動処理が終了すると、各設定画面の処理に移る。 391 〜 405行 メッセージウインドウの移動と縮小処理を行っている。処理終了後、MS_S_SCROOL_OUT_A(キノピオが画面外に出て行く)に 処理が移る。(この処理は、操作説明選択処理に移るときに行われる) 406 〜 416行 キノピオが画面外に移動する処理。画面外に移動すると、黒板が画面内に移動する処理に移る。(操作説明選択に処理が移行する。) 418 〜 420行 モードセレクトを抜ける処理を開始する。( メインループから抜ける ) 以下の物は大体同じ処理をしている。 ms_p -> sub_type が MS_S_DEFAULT の時、キー操作 MS_S_SCROOL_OUT_NEXT の時、カプセルが移動して外へ。外へ行ったら、MS_S_SCROOL_IN_NEXTに切り替わる。(描画している内容) MS_S_SCROOL_IN_NEXT の時、カプセルが移動して中へ。指定位置まで移動したら、次の処理へ。(処理が切り替わる) MS_S_SCROOL_OUT_BACK の時、カプセルが移動して外へ。外へ行ったら、MS_S_SCROOL_IN_BACKに切り替わる。(描画している内容) MS_S_SCROOL_IN_BACK の時、カプセルが移動して中へ。指定位置まで移動したら、1つ前の処理へ。(処理が切り替わる) 425 〜 496行 最初のメニュー( 1P/2P/4P/その他 )の処理を行っている。 428 〜 451行 キー操作の処理を行っている。Bボタンを押した場合、タイトルに戻るように設定している。 AボタンかSTARTボタン(以後決定ボタン)を押した場合、処理を MS_S_SCROOL_OUT_NEXT に設定し、 次の処理を行うようにしている。 452 〜 486行 カプセル(メニュー項目)が画面外に移動する処理を行っている。画面外まで出たら、カーソルの位置によって次に描画するもの、 描画基準X座標、停止座標、初期カーソル位置を設定し、処理をMS_S_SCROOL_IN_NEXT( カプセルの画面内移動処理 )に設定する。 487 〜 494行 カプセル(メニュー項目)が画面内に移動する処理を行っている。指定座標( ms_p -> stop_x )まで移動したら、 次のメイン処理( ms_p -> main_type = ms_p -> main_grp_type; )に切り替える。 497 〜 573行 1人用のメニュー( STORY/LEVEL )の処理を行っている。 500 〜 522行 キー操作の処理を行っている。Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(前のメニューに戻る)処理に、決定ボタン を押した場合、MS_S_SCROOL_OUT_NEXT( 次のメニューに進む )処理を行っている。 523 〜 539行 カプセル(メニュー項目)が画面外に移動する処理を行い、画面外に出たら、前のメニュー( 最初のメニュー( 1P/2P/4P/その他 )) の設定を行い、カプセル(メニュー項目)が画面内に移動する処理を行っている。 541 〜 572行 カプセル(メニュー項目)が画面外に移動する処理を行い、画面外に出たら、次のメニュー( 名前選択 ) の設定を行い、カプセル(メニュー項目)が画面内に移動する処理を行っている。 ストーリーモードの場合、evs_gamesel を GSL_VSCPU にして、evs_story_flg を1に設定する。 レベルセレクトの場合は、evs_gamesel を GSL_1PLAY に設定している。 574 〜 675行 2人用のメニュー( MAN & MAN/MAN & COM )の処理を行っている。 577 〜 620行 キー操作の処理を行っている。Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(前のメニューに戻る)処理に、決定ボタン を押した場合、MS_S_SCROOL_OUT_NEXT( 次のメニューに進む )処理を行っている。また、カーソル位置が、MAN & COM の場合、 刺さっているコントローラーが2個以上無いと、MAN & MAN が選べないようになっている。if( evs_playmax < 2 ) 622 〜 639行 カプセル(メニュー項目)が画面外に移動する処理を行い、画面外に出たら、前のメニュー( 最初のメニュー( 1P/2P/4P/その他 )) の設定を行い、カプセル(メニュー項目)が画面内に移動する処理を行っている。 640 〜 675行 カプセル(メニュー項目)が画面外に移動する処理を行い、画面外に出たら、次のメニュー( 名前選択 ) の設定を行い、カプセル(メニュー項目)が画面内に移動する処理を行っている。 MAN & MAN の場合、evs_gamesel を GSL_2PLAY 、処理をMS_M_NAME_B(名前選択2P用)にする。 MAN & COM の場合は、evs_gamesel を GSL_VSCPU 、処理をMS_M_NAME_A(名前選択1P用)にする。 676 〜 889行 4人用のメニュー( 4MAN/3MAN&1COM/2MAN&2COM/1MAN&3COM )の処理を行っている。 679 〜 775行 キー操作の処理を行っている。Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(前のメニューに戻る)処理に、決定ボタン を押した場合、evs_gamesel を GSL_4PLAY に、MS_S_MENU_OUT_START(ループ脱出 )処理を行うように設定している。 その際、コントローラーの刺さっているものと選んだゲームモードを調べて、MAN と CPU の割り当てを行っている。 また、多人数を選ぶ場合、カーソルの左右移動の時、指定個数以上コントローラーが刺さっていないと、 選べないようになっている(カーソルが移動しない)。if( evs_playmax < ? ) 776 〜 794行 カプセル(メニュー項目)が画面外に移動する処理を行い、画面外に出たら、前のメニュー( 最初のメニュー( 1P/2P/4P/その他 )) の設定を行い、カプセル(メニュー項目)が画面内に移動する処理を行っている。 796 〜 889行 その他用のメニュー( 記録/あそびかた/名前/サウンド/バックアップ消去 )の処理を行っている。 797 〜 820行 キー操作の処理を行っている。Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(前のメニューに戻る)処理に、決定ボタン を押した場合、MS_S_SCROOL_OUT_NEXT が設定される。 821 〜 838行 カプセル(メニュー項目)が画面外に移動する処理を行い、画面外に出たら、前のメニュー( 最初のメニュー( 1P/2P/4P/その他 )) の設定を行い、カプセル(メニュー項目)が画面内に移動する処理を行っている。 839 〜 888行 カプセル(メニュー項目)が画面外に移動する処理を行い、画面外に出たら、以下の設定を行う。 記録の場合、MS_S_MENU_OUT_START(ループ脱出 )処理を行い、記録画面表示処理に行くように設定している。 あそびかたの場合、MS_S_MES_WIN_OUT_A( メッセージウインドウの移動・縮小)を設定し、操作説明選択の処理になる。 名前の場合、MS_M_NAME_C を設定し、名前選択の処理になる。 サウンドの場合、MS_M_MAIN_D_C を設定し、サウンド選択の処理になる。 バックアップ消去の場合、MS_M_MAIN_D_D を設定し、バックアップ消去確認の処理になる。 890 〜 927行 操作説明選択のメニューの処理を行っている。 893 〜 913行 キー操作の処理を行っている。Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(前のメニューに戻る)処理に、決定ボタン を押した場合,MS_S_MENU_OUT_START(ループ脱出 )処理を行い、操作説明画面に行くように設定している。 928 〜 970行 サウンドのメニューの処理を行っている。 931 〜 949行 キー操作の処理を行っている。Bボタンを押した場合、設定変更せず、決定の場合は、設定を変更して MS_S_SCROOL_OUT_BACK (前のメニューに戻る)の処理を行うようになっている。ただし、現在、ステレオとモノラルの変更は行われていない。 971 〜 1047行 バックアップ消去確認のメニューの処理を行っている。 974 〜 1018行 キー操作の処理を行っている。Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(前のメニューに戻る)処理に、決定ボタン を押した場合、セーブに関するデータをクリアし、MS_M_MAIN_D_D_A( 消去しましたというメッセージを表示する )処理に切り替わる。 現在EEPの部分はコメントアウトしてある。 1048 〜 1078行 消去しましたというメッセージを表示する処理。キーを押すと、その他のメニューに戻る。 1079 〜 1149行 名前選択(1P用)の処理を行っている。 1082 〜 1129行 カーソルの移動処理を行っている。カーソルの位置は、数値(0〜8)で管理している。 そのため、カーソルを上に移動させるときは、カーソル位置をあらわす変数( ms_cp -> name_c_pos[0] )から3を引き、 下に行く場合は、3を足している。 以下のような管理法。描画のほうでは、その配列番号の変数に座標が入っている。 0 1 2 3 4 5 6 7 8 1107 〜 1129行 ゲストを選択した場合、選択番号を8とする。 3以下の場合は、そのまま選択番号になる。 5以上の場合、−1した値が選択番号になる。 Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(前のメニューに戻る)処理に、決定ボタン を押した場合、MS_S_MENU_OUT_START (ループ脱出 )処理を行い、カーソルがゲストの位置にあった場合( ms_cp -> name_c_pos[0] が4 )、 または、選択した名前が入力してあった場合、ゲーム設定画面に行くように設定し、名前が入力されていなかった場合、名前入力画面に 行くように設定している。 1130 〜 1147行 名前選択のプレートが画面外に行き、ms_p -> main_type_old の値を基に、前の処理に戻る処理を行っている。 1150 〜 1302行 名前選択(2P用)の処理を行っている。 1153 〜 1282行 キー操作の処理をしている。基本的に、1Pの時と替わらない。 しかし、2回ループをまわしていることと、ゲストの位置以外、1Pと2Pが重なることが無いように処理をしている。 両方決定しないと、次の処理に行かないようになっている。 1252 〜 1281行 両方決定した場合の処理を行っている。選択した名前が入力してあるか調べ、もし入力してなければ、名前入力画面に 行くように設定している。 1283 〜 1301行 前のメニュー( 2人用のメニュー( MAN & MAN/MAN & COM )) の処理に戻るように設定している。 1303 〜 1388行 名前選択(その他用)の処理を行っている。選択の操作部分は1Pの時と替わらない。 表示と、決定ボタンを押した後の処理が異なっている。ゲストの位置で決定を押すと、Bボタンを押したときと同じ扱いになる。 決定ボタンを押した場合、名前が入力してあれば、次の処理 MS_M_MAIN_D_B( 名前をどうするか? )に進む。 もし、名前が入力されていない場合( new )は、名前入力画面に進む。 1389 〜 1464行 選択した名前をどうするか、選択するメニューの処理を行っている。 1392 〜 1424行 キー操作の部分。Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(名前選択に戻る)処理に、決定ボタン を押した時、変更の場合は名前入力画面に進み、削除の場合は、削除変更確認に進む。 1465 〜 1558行 削除確認のメニューの処理を行っている。 1469 〜 1509行 キー操作の処理を行っている。Bボタンを押した場合、MS_S_SCROOL_OUT_BACK(名前選択に戻る)処理に、決定ボタン を押した場合、なまえに関するデータをクリアし、MS_M_MAIN_D_B_B( 消去しましたというメッセージを表示する )処理に切り替わる。 現在EEPの部分はコメントアウトしてある。 1559 〜 1592行 名前を消去しましたというメッセージを表示する処理。キーを押すと、その他用の名前選択戻る。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_mode_select_graphic(void) 行番号 1622 〜 2036行 モードセレクト描画メイン関数 1669 〜 1681行 キノピオの描画を行っている部分。ms_tp -> p_mouth_flg 及び、ms_tp -> p_eye_flg は、クチパク、目パチ の描画を行っている。 1699 〜 1705行 メッセージウインドウの描画があった場合、半透明の黒い四角(メッセージウインドウの後ろの部分)を描画する。 1707 〜 1723行 名前選択の時と、名前をどうするか選択する処理の時、名前の下に半透明の黒い四角を描画する。 1727 〜 1855行 メニュー項目(カプセル)の描画部分。パレットは全て共通(256色) 1730 〜 1806行 描画する項目の設定をしている。 max には項目(カプセル)表字数を設定する。 skip には、カプセル同士の間隔を設定する。 menu_p には、描画するカプセルグラフィックのポインタの配列を設定する。 str_p には、文字列のポインタを渡す。(カーソル位置の物) 1809 〜 1855行 実際のカプセル描画部分。 1813 〜 1834行 2PLAYと4PLAYのメニューを選択していた場合、コントローラーの刺さっている数と比較し、 選択できない場合は、暗く表示するように設定している。 1836 〜 1852行 描画部分。カーソル位置と同じ場合は、通常の大きさで描画し、違う場合は、縮小して描画する。 なお、グラフィックのサイズが大きい(64 * 64 の 256)ため、1回でテクスチャメモリーに 入らないため、2回に分けている。 1853行 描画間隔を取っている。 1857 〜 1866行 メッセージウインドウを表示する場合( ms_mp -> mes_win_flg が真 )、メッセージウインドウの枠を描画している。 1858 〜 1861行 上下の横棒(-------------------)を拡大して描画している。尚、端の部分が無い。 1863 〜 1865行 左右の縦棒( + + | | + +)を拡大して描画している。端の部分がある。 1868 〜 1893行 名前の部分を囲う緑のプレートの描画。 但し、1881 〜 1886行 の部分は、プレートではなく、操作説明選択の黒板を描画している。 1895 〜 1904行 文字送り(キー入力待ち)のボタン描画。 ms_tp -> p_mouth_count が −1(文字列が最後まで描画された)でキー操作処理の時に描画する。 1909 〜 1929行 名前描画の部分。名前は、インテンシティを使用している。 1910 〜 1911行 インテンシティ使用の前設定を行っている。 1913 〜 1929行 名前描画処理。 1932 〜 1936行 文字列描画。文字列もインテンシティを使用する。メッセージウインドウ表示あり( ms_mp -> mes_win_flg が真 ) 文字列表示あり ( ms_mp -> mes_mes_flg が真 )の場合描画。 尚、返り値の ms_tp -> p_mouth_count は、文字列が途中の場合は1、最後まで行っている場合は−1になる。 1939 〜 2017行 名前選択時のカーソル等の描画。 1941 〜 1996行 名前選択時のカーソルの描画。 cursor_g[0]が1P、cursor_g[1]が2Pになる。 cursor_g[?][0]が何を表示するか。0の場合通常のカーソル。1の場合ゲスト、2の場合ゲストの重なり用 cursor_g[?][1]が表示する物のパレット番号。0の場合通常のカーソル。1の場合ゲスト、2の場合ゲストの重なり用 1997 〜 2015行 操作説明選択の文字部分の描画。 1998 〜 2006行 選択されていないもの( ms_cp -> main_c_pos != i )を暗く描画している。 2007 〜 2015行 選択されている物の描画。拡大縮小を行っている。(大きさの変更は別のところで行っている ms_cp -> c_pos_size 増減値) ------------------------------------------------------------------------------------------------------------------------------------