シーケンス遷移テンプレート。(2)
RGKT-NDS-STDY-022(008)
まだまだ悩み所や問題点が若干残ってますが
以前よりか少しだけ見通しが良くはなってると思います。
実はまだ、上手に説明出来る程
頭の中でまとまってないので(爆)
今回はソース公開だけに留めておきます。
シーケンス遷移テンプレート ブロック図 main + title | + game + gameMain | + gameConfig 遷移動作の流れは ・タイトル スタートボタンを押すことでゲーム(メニュー)へ遷移 ・ゲーム(メニュー) Aボタンを押すことでゲームメインへ遷移 Bボタンを押すことでゲームコンフィグへ遷移 ・ゲームメイン スタートボタンを押すことでタイトルへ遷移 ・ゲームコンフィグ スタートボタンを押すことでゲーム(メニュー)へ遷移 という風になってます。
以下ソース
main.h
// TODO: ここに一意の識別子を定義する(重複インクルード防止用)。 #ifndef _MAIN_H_ #define _MAIN_H_ // TODO: ここに、このヘッダファイルが必要とする外部ヘッダファイルを記述する。 #include <nds.h> #ifdef __cplusplus extern "C" { #endif // TODO: ここに #define 定義、ならびに関数のプロトタイプ宣言を追加する。 //シーン定数 typedef enum{ SCENE_TITLE, SCENE_GAME }SCENE_SEQ; //シーン遷移フラグ用構造体 typedef struct{ u16 act; }ST_SCENE; #ifdef __cplusplus } #endif #endif
main.c
//root //--------------------------------------------------------------------------------- #include <stdio.h> #include "main.h" #include "title.h" #include "game.h" //--------------------------------------------------------------------------------- //シーン遷移フラグ static ST_SCENE scene = {SCENE_TITLE}; //--------------------------------------------------------------------------------- void initMain(void); void checkScene(void); //--------------------------------------------------------------------------------- int main(void) { initMain(); while(1) { scanKeys(); // シーケンス遷移動作 switch(scene.act){ case SCENE_TITLE: updateTitle(); break; case SCENE_GAME: updateGame(); break; default: break; } // 遷移トリガチェック checkScene(); swiWaitForVBlank(); } return 0; } //--------------------------------------------------------------------------------- void initMain(void) { // TODO: ここに 初期化処理を追加する。 consoleDemoInit(); } //--------------------------------------------------------------------------------- //シーン遷移トリガ関数 void checkScene(void) { switch(scene.act){ case SCENE_TITLE: if(isExitTitle()) scene.act = SCENE_GAME; break; case SCENE_GAME: if(isExitGame()) scene.act = SCENE_TITLE; break; default: break; } } //---------------------------------------------------------------------------------
title.h
// TODO: ここに一意の識別子を定義する(重複インクルード防止用)。 #ifndef _TITLE_H_ #define _TITLE_H_ // TODO: ここに、このヘッダファイルが必要とする外部ヘッダファイルを記述する。 #include <nds.h> #ifdef __cplusplus extern "C" { #endif // TODO: ここに #define 定義、ならびに関数のプロトタイプ宣言を追加する。 //シーン定数 typedef enum{ TITLE_INIT, TITLE_EXEC, TITLE_EXIT }TITLE_SEQ; //シーン遷移フラグ用構造体 typedef struct{ u16 act; }ST_TITLE; //グローバル関数(シーン更新・シーン終了確認用)、プロトタイプ宣言 void updateTitle(void); bool isExitTitle(void); #ifdef __cplusplus } #endif #endif
title.c
//SCENE_TITLE //--------------------------------------------------------------------------------- #include <stdio.h> #include "title.h" //--------------------------------------------------------------------------------- //シーン遷移フラグ static ST_TITLE title = {TITLE_INIT}; //--------------------------------------------------------------------------------- static void initTitle(void); static void execTitle(void); static void exitTitle(void); //--------------------------------------------------------------------------------- //シーン更新関数 void updateTitle(void) { switch(title.act){ case TITLE_INIT: initTitle(); break; case TITLE_EXEC: execTitle(); break; case TITLE_EXIT: exitTitle(); break; default: break; } } //--------------------------------------------------------------------------------- static void initTitle(void) { // TODO: ここに 初期化処理を追加する。 BG_PALETTE_SUB[0] = RGB15(15, 15, 15); consoleClear(); iprintf("\x1b[7;3HSequence transition sample"); iprintf("\x1b[8;9HScene TITLE"); iprintf("\x1b[11;3HPUSH START to GAME MENU"); title.act = TITLE_EXEC; } //--------------------------------------------------------------------------------- static void execTitle(void) { // TODO: ここに 実行動作を追加する。 //スタートボタンが押されたらタイトルシーンを終了する。 if(keysDown() & KEY_START) title.act = TITLE_EXIT; } //--------------------------------------------------------------------------------- static void exitTitle(void) { title.act = TITLE_INIT; } //--------------------------------------------------------------------------------- //シーン終了確認関数 bool isExitTitle(void) { return (title.act == TITLE_INIT) ? true : false; } //---------------------------------------------------------------------------------
game.h
// TODO: ここに一意の識別子を定義する(重複インクルード防止用)。 #ifndef _GAME_H_ #define _GAME_H_ // TODO: ここに、このヘッダファイルが必要とする外部ヘッダファイルを記述する。 #include <nds.h> #ifdef __cplusplus extern "C" { #endif // TODO: ここに #define 定義、ならびに関数のプロトタイプ宣言を追加する。 //シーン定数 typedef enum{ GAME_INIT, GAME_MENU_INIT, GAME_MENU_EXEC, GAME_MAIN, GAME_CONFIG, GAME_EXIT }GAME_SEQ; //シーン遷移フラグ用構造体 typedef struct{ u16 act; }ST_GAME; //グローバル関数(シーン更新・シーン終了確認用)、プロトタイプ宣言 void updateGame(void); bool isExitGame(void); #ifdef __cplusplus } #endif #endif
game.c
//SCENE_GAME //--------------------------------------------------------------------------------- #include <stdio.h> #include "game.h" #include "gameMain.h" #include "gameConfig.h" //--------------------------------------------------------------------------------- //シーン遷移フラグ static ST_GAME game = {GAME_INIT}; //--------------------------------------------------------------------------------- static void initGame(void); static void initGameMenu(void); static void execGameMenu(void); static void exitGame(void); static void checkSceneGame(void); //--------------------------------------------------------------------------------- //シーン更新関数 void updateGame(void) { switch(game.act){ case GAME_INIT: initGame(); break; case GAME_MENU_INIT: initGameMenu(); break; case GAME_MENU_EXEC: execGameMenu(); break; case GAME_MAIN: updateGameMain(); checkSceneGame(); break; case GAME_CONFIG: updateGameConfig(); checkSceneGame(); break; case GAME_EXIT: exitGame(); break; default: break; } } //--------------------------------------------------------------------------------- static void initGame(void) { // TODO: ここに 初期化処理を追加する。 game.act = GAME_MENU_INIT; } //--------------------------------------------------------------------------------- static void initGameMenu(void) { // TODO: ここに ゲームメニューの初期化処理を追加する。 BG_PALETTE_SUB[0] = RGB15(31, 0, 0); consoleClear(); iprintf("\x1b[7;3HSequence transition sample"); iprintf("\x1b[8;9HScene GAME MENU"); iprintf("\x1b[11;3HPUSH A to GAME MAIN"); iprintf("\x1b[12;3HPUSH B to GAME CONFIG"); game.act = GAME_MENU_EXEC; } //--------------------------------------------------------------------------------- static void execGameMenu(void) { // TODO: ここに ゲームメニューの実行動作を追加する。 //Aボタンが押されたらゲームメインシーンへ遷移する。 if(keysDown() & KEY_A){ game.act = GAME_MAIN; //Bボタンが押されたらゲームコンフィグシーンへ遷移する。 }else if(keysDown() & KEY_B){ game.act = GAME_CONFIG; } } //--------------------------------------------------------------------------------- static void exitGame(void) { game.act = GAME_INIT; } //--------------------------------------------------------------------------------- //シーン遷移トリガ関数 static void checkSceneGame(void) { switch(game.act){ case GAME_INIT: break; case GAME_MENU_INIT: break; case GAME_MENU_EXEC: break; case GAME_MAIN: if(isExitGameMain()) game.act = GAME_EXIT; break; case GAME_CONFIG: if(isExitGameConfig()) game.act = GAME_MENU_INIT; break; case GAME_EXIT: break; default: break; } } //--------------------------------------------------------------------------------- //シーン終了確認関数 bool isExitGame(void) { return (game.act == GAME_INIT) ? true : false; } //---------------------------------------------------------------------------------
gameMain.h
// TODO: ここに一意の識別子を定義する(重複インクルード防止用)。 #ifndef _GAME_MAIN_H_ #define _GAME_MAIN_H_ // TODO: ここに、このヘッダファイルが必要とする外部ヘッダファイルを記述する。 #include <nds.h> #ifdef __cplusplus extern "C" { #endif // TODO: ここに #define 定義、ならびに関数のプロトタイプ宣言を追加する。 //シーン定数 typedef enum{ GAME_MAIN_INIT, GAME_MAIN_EXEC, GAME_MAIN_EXIT }GAME_MAIN_SEQ; //シーン遷移フラグ用構造体 typedef struct{ u16 act; }ST_GAME_MAIN; //グローバル関数(シーン更新・シーン終了確認用)、プロトタイプ宣言 void updateGameMain(void); bool isExitGameMain(void); #ifdef __cplusplus } #endif #endif
gameMain.c
//SCENE_GAME_MAIN //--------------------------------------------------------------------------------- #include <stdio.h> #include "gameMain.h" //--------------------------------------------------------------------------------- //シーン遷移フラグ static ST_GAME_MAIN game_main = {GAME_MAIN_INIT}; //--------------------------------------------------------------------------------- static void initGameMain(void); static void execGameMain(void); static void exitGameMain(void); //--------------------------------------------------------------------------------- //シーン更新関数 void updateGameMain(void) { switch(game_main.act){ case GAME_MAIN_INIT: initGameMain(); break; case GAME_MAIN_EXEC: execGameMain(); break; case GAME_MAIN_EXIT: exitGameMain(); break; default: break; } } //--------------------------------------------------------------------------------- static void initGameMain(void) { // TODO: ここに 初期化処理を追加する。 BG_PALETTE_SUB[0] = RGB15(0, 31, 0); consoleClear(); iprintf("\x1b[7;3HSequence transition sample"); iprintf("\x1b[8;9HScene GAME MAIN"); iprintf("\x1b[11;1HPUSH START to GAME MAIN END"); iprintf("\x1b[12;1Hnext TITLE"); game_main.act = GAME_MAIN_EXEC; } //--------------------------------------------------------------------------------- static void execGameMain(void) { // TODO: ここに 実行動作を追加する。 //スタートボタンが押されたらゲームメインシーンを終了する。 if(keysDown() & KEY_START){ game_main.act = GAME_MAIN_EXIT; } } //--------------------------------------------------------------------------------- static void exitGameMain(void) { game_main.act = GAME_MAIN_INIT; } //--------------------------------------------------------------------------------- //シーン終了確認関数 bool isExitGameMain(void) { return (game_main.act == GAME_MAIN_INIT) ? true : false; } //---------------------------------------------------------------------------------
gameConfig.h
// TODO: ここに一意の識別子を定義する(重複インクルード防止用)。 #ifndef _GAME_CONFIG_H_ #define _GAME_CONFIG_H_ // TODO: ここに、このヘッダファイルが必要とする外部ヘッダファイルを記述する。 #include <nds.h> #ifdef __cplusplus extern "C" { #endif // TODO: ここに #define 定義、ならびに関数のプロトタイプ宣言を追加する。 //シーン定数 typedef enum{ GAME_CONFIG_INIT, GAME_CONFIG_EXEC, GAME_CONFIG_EXIT }GAME_CONFIG_SEQ; //シーン遷移フラグ用構造体 typedef struct{ u16 act; }ST_GAME_CONFIG; //グローバル関数(シーン更新・シーン終了確認用)、プロトタイプ宣言 void updateGameConfig(void); bool isExitGameConfig(void); #ifdef __cplusplus } #endif #endif
gameConfig.c
//SCENE_GAME_CONFIG //--------------------------------------------------------------------------------- #include <stdio.h> #include "gameConfig.h" //--------------------------------------------------------------------------------- //シーン遷移フラグ static ST_GAME_CONFIG game_config = {GAME_CONFIG_INIT}; //--------------------------------------------------------------------------------- static void initGameConfig(void); static void execGameConfig(void); static void exitGameConfig(void); //--------------------------------------------------------------------------------- //シーン更新関数 void updateGameConfig(void) { switch(game_config.act){ case GAME_CONFIG_INIT: initGameConfig(); break; case GAME_CONFIG_EXEC: execGameConfig(); break; case GAME_CONFIG_EXIT: exitGameConfig(); break; default: break; } } //--------------------------------------------------------------------------------- static void initGameConfig(void) { // TODO: ここに 初期化処理を追加する。 BG_PALETTE_SUB[0] = RGB15(0, 0, 31); consoleClear(); iprintf("\x1b[7;3HSequence transition sample"); iprintf("\x1b[8;9HScene GAME CONFIG"); iprintf("\x1b[11;1HPUSH START to GAME CONFIG END"); iprintf("\x1b[12;1Hnext GAME MENU"); game_config.act = GAME_CONFIG_EXEC; } //--------------------------------------------------------------------------------- static void execGameConfig(void) { // TODO: ここに 実行動作を追加する。 //スタートボタンが押されたらゲームコンフィグシーンを終了する。 if(keysDown() & KEY_START) game_config.act = GAME_CONFIG_EXIT; } //--------------------------------------------------------------------------------- static void exitGameConfig(void) { game_config.act = GAME_CONFIG_INIT; } //--------------------------------------------------------------------------------- //シーン終了確認関数 bool isExitGameConfig(void) { return (game_config.act == GAME_CONFIG_INIT) ? true : false; } //---------------------------------------------------------------------------------