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; } //---------------------------------------------------------------------------------