シーケンス遷移テンプレート。(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;
}
//---------------------------------------------------------------------------------