シューティングモードです。
以前にも近いものをいくつか書いてたので
ストップウォッチモードよりかは簡単と踏んでたのですが多少悩んでしまったり。
デバッグプリントが printf なのはエスケープシーケンスを利用する為です。
ビルドには下記ソース以外に、
「ハートに16連射。(12)」に記した全てのモジュールが必要だったり…。
ハートに16連射。(12)
http://d.hatena.ne.jp/dumbo001/20100201/p1
main.c
/*--------------------------------------------------------------------------------- shtwatch stgMode module test version 0.01 Feb 02, 2010 By. REGEKATSU ---------------------------------------------------------------------------------*/ #include <string.h> #include <nds/ndstypes.h> #include <nds/interrupts.h> #include <nds/system.h> #include <nds/arm9/input.h> #include "Bg.h" #include "Spr.h" #include "State.h" #include "StgMode.h" typedef enum{ MAIN_INIT, MAIN_RESET, MAIN_EXEC }MAIN_ACT; typedef struct{ u16 act; }MainStatus; static MainStatus st_main; void main_Init(void); void main_Reset(void); bool main_IsReset(void); //--------------------------------------------------------------------------------- int main(void){ //--------------------------------------------------------------------------------- lcdSwap(); while(1) { swiWaitForVBlank(); scanKeys(); Spr_Update(); if(main_IsReset()){ st_main.act = MAIN_RESET; } switch(st_main.act){ case MAIN_INIT: main_Init(); st_main.act = MAIN_RESET; break; case MAIN_RESET: main_Reset(); st_main.act = MAIN_EXEC; break; case MAIN_EXEC: StgMode_Update(); if(StgMode_IsExit()){ return 0; } break; } } } //--------------------------------------------------------------------------------- void main_Init(void){ //--------------------------------------------------------------------------------- memset(&st_main, 0, sizeof(st_main)); Bg_Init(); Spr_Init(); State_Init(); Bg_DrawConsString(0, 0, "stgMode module test\n\nversion 0.01\nFeb 02, 2010\n\nBy. REGEKATSU\n\n\n"); } //--------------------------------------------------------------------------------- void main_Reset(void){ //--------------------------------------------------------------------------------- StgMode_Clear(); } //--------------------------------------------------------------------------------- bool main_IsReset(void){ //--------------------------------------------------------------------------------- bool ans = false; u32 keys; if(keysDown() & (KEY_L | KEY_R | KEY_SELECT | KEY_START)){ keys = keysDown() | keysHeld(); keys = keys & (KEY_L | KEY_R | KEY_SELECT | KEY_START); if(keys == (KEY_L | KEY_R | KEY_SELECT | KEY_START)){ ans = true; } } return ans; } //---------------------------------------------------------------------------------
stgMode.h
/*--------------------------------------------------------------------------------- shtwatch stgMode module header version 0.01 Feb 02, 2010 By. REGEKATSU ---------------------------------------------------------------------------------*/ #ifndef _STG_MODE_H_ #define _STG_MODE_H_ #ifdef __cplusplus extern "C" { #endif void StgMode_Clear(void); void StgMode_Update(void); bool StgMode_IsExit(void); #ifdef __cplusplus } #endif #endif //_STG_MODE_H_
stgMode.c
/*--------------------------------------------------------------------------------- shtwatch stgMode module routine version 0.01 Feb 02, 2010 By. REGEKATSU ---------------------------------------------------------------------------------*/ #include <stdio.h>//debug print #include <string.h> #include <nds/ndstypes.h> #include <nds/arm9/input.h> #include "StgMode.h" #include "State.h" #include "Spr.h" #define SCORE_MAX 9999 #define END_TIME 10 #define SET_TIME(x) ((x)*60) typedef enum{ STG_MODE_INIT, STG_MODE_BEGIN, STG_MODE_READY, STG_MODE_EXEC, STG_MODE_END, STG_MODE_EXIT }STG_MODE_ACT; typedef struct{ u16 act; u32 frame; int time; int score; bool update_high_score; }StgModeStatus; static StgModeStatus st_stg_mode; void stgMode_Init(void); void stgMode_Begin(void); void stgMode_Ready(void); void stgMode_Exec(void); void stgMode_End(void); void stgMode_Exit(void); void stgMode_SetReady(void); void stgMode_ExecTime(void); void stgMode_ShowTime(int time); void stgMode_HideTime(void); void stgMode_ExecScore(void); void stgMode_ShowScore(int score); void stgMode_HideScore(void); //--------------------------------------------------------------------------------- void StgMode_Clear(void){ //--------------------------------------------------------------------------------- stgMode_Exit(); } //--------------------------------------------------------------------------------- void StgMode_Update(void){ //--------------------------------------------------------------------------------- //debug print printf("\x01b[22;0H diceMode = %01d, slotMode = %01d", State_GetDiceMode(), State_GetSlotMode()); switch(st_stg_mode.act){ case STG_MODE_INIT: stgMode_Init(); break; case STG_MODE_BEGIN: stgMode_Begin(); break; case STG_MODE_READY: stgMode_Ready(); break; case STG_MODE_EXEC: stgMode_Exec(); break; case STG_MODE_END: stgMode_End(); break; case STG_MODE_EXIT: stgMode_Exit(); break; } } //--------------------------------------------------------------------------------- void stgMode_Init(void){ //--------------------------------------------------------------------------------- memset(&st_stg_mode, 0, sizeof(st_stg_mode)); Spr_SetColon(0); Spr_SetCursor(BIT(0)); stgMode_HideTime(); stgMode_ShowScore(State_GetHighScore()); st_stg_mode.act = STG_MODE_BEGIN; } //--------------------------------------------------------------------------------- void stgMode_Begin(void){ //--------------------------------------------------------------------------------- if( (keysDown() & KEY_START) && ( (keysCurrent() & ~KEY_START) == 0) ){ stgMode_SetReady(); st_stg_mode.act = STG_MODE_READY; } if( (keysDown() & KEY_SELECT) && ( (keysCurrent() & ~KEY_SELECT) == 0) ){ st_stg_mode.act = STG_MODE_EXIT; } } //--------------------------------------------------------------------------------- void stgMode_Ready(void){ //--------------------------------------------------------------------------------- if( ( ( (keysDown() & KEY_A) && !(keysCurrent() & KEY_B) ) || ( (keysDown() & KEY_B) && !(keysCurrent() & KEY_A) ) ) && ( (keysCurrent() & ~(KEY_A | KEY_B)) == 0) ) { stgMode_ExecScore(); st_stg_mode.frame--; st_stg_mode.act = STG_MODE_EXEC; } if( (keysDown() & KEY_SELECT) && ( (keysCurrent() & ~KEY_SELECT) == 0) ){ st_stg_mode.act = STG_MODE_EXIT; } } //--------------------------------------------------------------------------------- void stgMode_Exec(void){ //--------------------------------------------------------------------------------- if( ( ( (keysDown() & KEY_A) && !(keysCurrent() & KEY_B) ) || ( (keysDown() & KEY_B) && !(keysCurrent() & KEY_A) ) ) && ( (keysCurrent() & ~(KEY_A | KEY_B)) == 0) ) { stgMode_ExecScore(); } if(st_stg_mode.frame % SET_TIME(1) == 0){ stgMode_ExecTime(); } if(st_stg_mode.frame != 0){ st_stg_mode.frame--; }else{ //diceMode on if(st_stg_mode.score == 62){ State_SetDiceMode(true); } //slotMode on else if(st_stg_mode.score == 160){ State_SetSlotMode(true); } if(st_stg_mode.score > State_GetHighScore()){ State_SetHighScore(st_stg_mode.score); st_stg_mode.score = 0; st_stg_mode.update_high_score = true; } st_stg_mode.act = STG_MODE_END; } } //--------------------------------------------------------------------------------- void stgMode_End(void){ //--------------------------------------------------------------------------------- if(st_stg_mode.update_high_score == true){ if(st_stg_mode.frame == 0){ stgMode_HideScore(); }else if(st_stg_mode.frame == 30){ stgMode_ShowScore( State_GetHighScore() ); } if(st_stg_mode.frame < 59){ st_stg_mode.frame++; }else{ st_stg_mode.frame = 0; } } if( (keysDown() & KEY_START) && ( (keysCurrent() & ~KEY_START) == 0) ){ stgMode_SetReady(); st_stg_mode.act = STG_MODE_READY; } if( (keysDown() & KEY_SELECT) && ( (keysCurrent() & ~KEY_SELECT) == 0) ){ st_stg_mode.act = STG_MODE_EXIT; } } //--------------------------------------------------------------------------------- void stgMode_Exit(void){ //--------------------------------------------------------------------------------- Spr_Clear(); st_stg_mode.act = STG_MODE_INIT; } //--------------------------------------------------------------------------------- void stgMode_SetReady(void){ //--------------------------------------------------------------------------------- st_stg_mode.update_high_score = false; st_stg_mode.time = END_TIME; st_stg_mode.frame = SET_TIME(END_TIME); stgMode_ShowTime(st_stg_mode.time); stgMode_ShowScore(State_GetHighScore()); } //--------------------------------------------------------------------------------- void stgMode_ExecTime(void){ //--------------------------------------------------------------------------------- st_stg_mode.time--; stgMode_ShowTime(st_stg_mode.time); } //--------------------------------------------------------------------------------- void stgMode_ShowTime(int time){ //--------------------------------------------------------------------------------- printf("\x01b[9;5H%2d", time);//debug print Spr_SetNumber(SEG_SECOND, time, false); } //--------------------------------------------------------------------------------- void stgMode_HideTime(void){ //--------------------------------------------------------------------------------- printf("\x01b[9;5H ");//debug print Spr_SetSegment(0, 0, SEG_SECOND); } //--------------------------------------------------------------------------------- void stgMode_ExecScore(void){ //--------------------------------------------------------------------------------- if(st_stg_mode.score < SCORE_MAX){ st_stg_mode.score++; } stgMode_ShowScore(st_stg_mode.score); } //--------------------------------------------------------------------------------- void stgMode_ShowScore(int score){ //--------------------------------------------------------------------------------- printf("\x01b[9;0H%4d", score);//debug print if(score == 0){ Spr_SetNumber(SEG_MINUTE, score, true); Spr_SetNumber(SEG_HOUR, score, false); }else if(score < 100){ Spr_SetNumber(SEG_MINUTE, score, false); Spr_SetSegment(0, 0, SEG_HOUR); }else if(score <= SCORE_MAX){ Spr_SetNumber(SEG_MINUTE, score % 100, true); Spr_SetNumber(SEG_HOUR, score / 100, false); } } //--------------------------------------------------------------------------------- void stgMode_HideScore(void){ //--------------------------------------------------------------------------------- printf("\x01b[9;0H ");//debug print Spr_SetSegment(0, 0, SEG_MINUTE); Spr_SetSegment(0, 0, SEG_HOUR); } //--------------------------------------------------------------------------------- bool StgMode_IsExit(void){ //--------------------------------------------------------------------------------- return (st_stg_mode.act == STG_MODE_INIT) ? true:false; } //---------------------------------------------------------------------------------