ハートに16連射。(5)


RGKT-NDS-HMBR-006(005)


一部の定数名が気に食わずダラダラ違うことやってたら
興が削がれて幾日か経過してしまった次第。


その定数名というのは
"END" に対する "START" 。
どうも一般的には "BEGIN" とした方が無難らしく。
Pascal っぽくてどうもなーって思ってたが
"START" に対する対義としては "STOP" らしいので。
趣味なんだし自分が分かればそれで良いかもしれない問題だけど
ソース出すんなら一応直しておこうかと。


あと、ゲーム始めの初期化に対する "INIT" と同じく
ゲーム終わりの初期化に対する "RELEASE" を用意した。
ここも無難な名前が浮かばなくて困った箇所。
"EXIT" はデストラクタ用途である為。
"RELEASE" で終了処理の初期化をして(例えば”おわり”を意味するものを表示した後)
"END" でユーザー入力待ちをしてる(例えば入力があったら”タイトル”へ戻る、等)。


後は関数分けの直しを少しと、ファイル分け。
コンソール関連はコンソール関数のみで切り出し
(但し draw〜 での iprintf() は描画の意味で使ってるのでこれとは別扱い。)。


game.c に色々詰め込んでますが
ゲームシーンが2つ以上に増えるなら gameFunc.* として切り出して
共通利用できる関数はこれに入れた方が良いですが
その予定はまだないので現状を維持。


フォントリソースは「NDS Homebrew 用に利用可能なフォントリソース。(4)」の、
ATARI(NAMCO) 風フォント(ANK コードセット)のものを使ってます。


NDS Homebrew 用に利用可能なフォントリソース。(4)
http://d.hatena.ne.jp/dumbo001/20090325/1237984081


早射ち計測ゲームが出来るまで。Rev.4 ソースコード
main.h

// TODO: ここに一意の識別子を定義する(重複インクルード防止用)。
#ifndef _MAIN_H_
#define _MAIN_H_

// TODO: ここに、このヘッダファイルが必要とする外部ヘッダファイルを記述する。
#include <nds.h>

#ifdef __cplusplus
extern "C" {
#endif

// TODO: ここに #define 定義、ならびに関数のプロトタイプ宣言を追加する。

#ifdef __cplusplus
}
#endif

#endif


main.c

// MAIN
//---------------------------------------------------------------------------------
#include <stdio.h>
#include "consoleFunc.h"
#include "main.h"
#include "game.h"

//---------------------------------------------------------------------------------
// メイン初期化処理
void initMain(void);

//---------------------------------------------------------------------------------
// メインループ
int main(void)
{
	initMain();
	
	while(1) {
		scanKeys();
		updateGame();
		swiWaitForVBlank();
	}

	return 0;
}
//---------------------------------------------------------------------------------
// メイン初期化処理

//---------------------------------------------------------------------------------
void initMain(void)
{
	initConsole();
	BG_PALETTE_SUB[0] = RGB8(48, 80, 128);
}

//---------------------------------------------------------------------------------


game.h

// TODO: ここに一意の識別子を定義する(重複インクルード防止用)。
#ifndef _GAME_H_
#define _GAME_H_

// TODO: ここに、このヘッダファイルが必要とする外部ヘッダファイルを記述する。
#include <nds.h>

#ifdef __cplusplus
extern "C" {
#endif

// TODO: ここに #define 定義、ならびに関数のプロトタイプ宣言を追加する。

//def main
typedef enum {
	GAME_INIT,
	GAME_BEGIN,
	GAME_EXEC,
	GAME_RELEASE,
	GAME_END,
	GAME_EXIT
}GAME_SEQ;

typedef struct{
	u16 act;
}ST_GAME;

void updateGame(void);

#ifdef __cplusplus
}
#endif

#endif


game.c

// GAME
//---------------------------------------------------------------------------------
#include <stdio.h>
#include "game.h"

//---------------------------------------------------------------------------------
//シーン遷移フラグ
static ST_GAME game = {GAME_INIT};

//---------------------------------------------------------------------------------
//ゲーム用、定数の定義
#define TIME_PER_SEC  60
#define TIME_OVER_SEC  8

//---------------------------------------------------------------------------------
//ゲーム用、変数の定義

static int time_count = 0, // タイマー用変数
           key_count  = 0; // キーカウント用変数

//---------------------------------------------------------------------------------
// ゲーム用、シーン遷移関数
static void initGame(void);
static void beginGame(void);
static void execGame(void);
static void releaseGame(void);
static void endGame(void);
static void exitGame(void);

// ゲーム用、動作別更新関数
static void updateKeys(void);
static void updateTimer(void);
static void drawPrompt(void);
static void drawAverage(void);

// デバッグ用、動作確認関数
static void drawStatus(void);

// ゲーム用、トリガチェック関数
static bool isBeginGame(void);
static bool isTimeOver(void);
static bool isSoftReset(void);

//---------------------------------------------------------------------------------
void updateGame(void)
{
	switch(game.act){
		
	case GAME_INIT:
		initGame();
		break;
		
	case GAME_BEGIN:
		beginGame();
		break;
		
	case GAME_EXEC:
		execGame();
		break;
		
	case GAME_RELEASE:
		releaseGame();
		break;
		
	case GAME_END:
		endGame();
		break;
		
	case GAME_EXIT:
		exitGame();
		break;
		
	default:
		break;
	}
	
	//デバッグ用
	drawStatus();
}

//---------------------------------------------------------------------------------
// ゲーム用、シーン遷移関数

//---------------------------------------------------------------------------------
static void initGame(void)
{
	consoleClear();
	key_count = 0;
	time_count = 0;
	drawPrompt();
	
	game.act = GAME_BEGIN;
}

//---------------------------------------------------------------------------------
static void beginGame(void)
{
	if(isBeginGame()){
		updateTimer();
		updateKeys();
		
		game.act = GAME_EXEC;
	}
}

//---------------------------------------------------------------------------------
static void execGame(void)
{
	updateTimer();
	updateKeys();
	
	if(isTimeOver())
		game.act = GAME_RELEASE;
}

//---------------------------------------------------------------------------------
static void releaseGame(void)
{
	consoleClear();
	drawPrompt();
	drawAverage();
	
	game.act = GAME_END;
}

//---------------------------------------------------------------------------------
static void endGame(void)
{
	if(isSoftReset())
		game.act = GAME_EXIT;
}

//---------------------------------------------------------------------------------
static void exitGame(void)
{
	game.act = GAME_INIT;
}

//---------------------------------------------------------------------------------
// ゲーム用、動作別更新関数

//---------------------------------------------------------------------------------
static void updateKeys(void)
{
	if(keysDown() & KEY_A)
		key_count++;
}

//---------------------------------------------------------------------------------
static void updateTimer(void)
{
	time_count++;
}

//---------------------------------------------------------------------------------
static void drawPrompt(void)
{
	iprintf("\x1b[9;9HPUSH A BUTTON\n");
}

//---------------------------------------------------------------------------------
static void drawAverage(void)
{
	iprintf("\x1b[12;6H%4d TIMES PER SEC\n", key_count / TIME_OVER_SEC);
}

//---------------------------------------------------------------------------------
// デバッグ用、動作確認関数

//---------------------------------------------------------------------------------
static void drawStatus(void){
	iprintf("\x1b[22;0HTIME_COUNT:%3d\nKEY_COUNT: %3d", time_count, key_count);
}

//---------------------------------------------------------------------------------
// ゲーム用、トリガチェック関数

//---------------------------------------------------------------------------------
static bool isBeginGame(void)
{
	return (keysDown() & KEY_A) ? true : false;
}

//---------------------------------------------------------------------------------
static bool isTimeOver(void)
{
	return ((time_count / TIME_PER_SEC) == TIME_OVER_SEC) ? true : false;
}

//---------------------------------------------------------------------------------
static bool isSoftReset(void)
{
	if((keysHeld() & KEY_START)&&(keysHeld() & KEY_SELECT)&&(keysHeld() & KEY_L)&&(keysHeld() & KEY_R))
		return true;
	
	return false;
}

//---------------------------------------------------------------------------------


consoleFunc.h

// TODO: ここに一意の識別子を定義する(重複インクルード防止用)。
#ifndef _CONSOLE_FUNC_H_
#define _CONSOLE_FUNC_H_

// TODO: ここに、このヘッダファイルが必要とする外部ヘッダファイルを記述する。
#include <nds.h>

#ifdef __cplusplus
extern "C" {
#endif

// TODO: ここに #define 定義、ならびに関数のプロトタイプ宣言を追加する。

void initConsole(void);

#ifdef __cplusplus
}
#endif

#endif


consoleFunc.c

// sonsoleFunc
//---------------------------------------------------------------------------------
#include <stdio.h>
#include <nds/arm9/console.h>
#include "consoleFunc.h"
#include "font.h"

//---------------------------------------------------------------------------------
PrintConsole console; // フォント変更を適用する為の PrintConsole 構造体
ConsoleFont font;     // フォントステータスを設定する為の ConsoleFont 構造体

//---------------------------------------------------------------------------------
static void initFont(void);

//---------------------------------------------------------------------------------
void initConsole(void)
{
	console = *consoleDemoInit();
	
	initFont();
}
//---------------------------------------------------------------------------------
static void initFont(void)
{
	//フォント変更の為の各種設定
	font.gfx = (u16*)fontTiles;
	font.bpp = 4;
	font.numChars = 128;
	font.convertSingleColor = true;
	
	//フォント変更の適応
	consoleSetFont(&console, &font);
}
//---------------------------------------------------------------------------------