ハートに16連射。(4)


RGKT-NDS-HMBR-006(004)


昨日一先ず関数化してみました版です。
ゲームに利用する関数郡がまだメイン内に入ってるのは頂けないので
次はメイン関数とゲーム関数郡(ゲームシーンで利用するもの)を
別のソースファイルに分けることとします。


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


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


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


main.h

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

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

#ifdef __cplusplus
extern "C" {
#endif

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

//def main
typedef enum {
	GAME_INIT,
	GAME_PLAY_INIT,
	GAME_PLAY_START,
	GAME_PLAY_EXEC,
	GAME_PLAY_END,
	GAME_PLAY_EXIT,
	GAME_EXIT
}GAME_SCENE;

typedef struct{
	u16 act;
}ST_GAME;




#ifdef __cplusplus
}
#endif

#endif

main.c

/*---------------------------------------------------------------------------------
	
	SHOOTING MEASUREMENT GAME
	Revision.2
	
	Mar 26, 2009 
	Mar 25, 2009 Rev.2
	Mar 24, 2009 Rev.1
	
	CODING BY. AYUMI @REGEKATSU
	This program was made from devkitPro Version 1.4.10
	
	REGEKATSU
	-Console/Homebrew Programming-
	
	this web site.
	http://akiba.geocities.jp/consolehomebrewprogramming/

---------------------------------------------------------------------------------*/
#include <stdio.h>
#include "main.h"
#include "font.h"

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

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

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

// フォント変更を適用する為のコンソール構造体と、
// フォントステータスを設定する為のフォント構造体を用意する。
PrintConsole console;
ConsoleFont font;

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

//---------------------------------------------------------------------------------
// ゲーム用、シーン遷移関数
static void initGame(void);
static void initGamePlay(void);
static void startGamePlay(void);
static void execGamePlay(void);
static void endGamePlay(void);
static void exitGamePlay(void);
static void exitGame(void);

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

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

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

//---------------------------------------------------------------------------------
int main(void)
{
	while(1) {
		scanKeys();
		
		switch(game.act){
			
		case GAME_INIT:
			initGame();
			break;
			
		case GAME_PLAY_INIT:
			initGamePlay();
			break;
			
		case GAME_PLAY_START:
			startGamePlay();
			break;
			
		case GAME_PLAY_EXEC:
			execGamePlay();
			break;
			
		case GAME_PLAY_END:
			endGamePlay();
			break;
			
		case GAME_PLAY_EXIT:
			exitGamePlay();
			break;
			
		case GAME_EXIT:
			exitGame();
			break;
			
		default:
			break;
		}
		
		//デバッグ用
		drawStatus();
		
		swiWaitForVBlank();
	}

	return 0;
}
//---------------------------------------------------------------------------------
// ゲーム用、シーン遷移関数
//---------------------------------------------------------------------------------
static void initGame(void)
{
	//フォント変更を適用するコンソールステータスを得る。
	console = *consoleDemoInit();
	
	//フォント変更の為の各種設定を行う。
	font.gfx = (u16*)fontTiles;
	font.bpp = 4;
	font.numChars = 128;
	font.convertSingleColor = true;
	
	//フォント変更の為の設定を現在のコンソールステータスに適用する。
	consoleSetFont(&console, &font);
	
	BG_PALETTE_SUB[0] = RGB8(48, 80, 128);
	
	game.act = GAME_PLAY_INIT;
}
//---------------------------------------------------------------------------------
static void initGamePlay(void)
{
	consoleClear();
	key_count = 0;
	time_count = 0;
	drawPrompt();
	
	game.act = GAME_PLAY_START;
}
//---------------------------------------------------------------------------------
static void startGamePlay(void)
{
	if(isStartGamePlay()){
		updateGamePlay();
		
		game.act = GAME_PLAY_EXEC;
	}
}
//---------------------------------------------------------------------------------
static void execGamePlay(void)
{
	updateGamePlay();
	
	if(isTimeOver())
		game.act = GAME_PLAY_END;
}
//---------------------------------------------------------------------------------
static void endGamePlay(void)
{
	consoleClear();
	drawPrompt();
	drawAverage();
	
	game.act = GAME_PLAY_EXIT;
}
//---------------------------------------------------------------------------------
static void exitGamePlay(void)
{
	if(isSoftReset())
		game.act = GAME_EXIT;
}
//---------------------------------------------------------------------------------
static void exitGame(void)
{
	game.act = GAME_PLAY_INIT;
}
//---------------------------------------------------------------------------------
// ゲーム用、動作別更新関数
//---------------------------------------------------------------------------------
static void updateGamePlay(void)
{
	updateTimer();
	updateKeys();
}
//---------------------------------------------------------------------------------
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 isStartGamePlay(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;
}
//---------------------------------------------------------------------------------