RGKT-NDS-HMBR-006(006)
スクロール処理を実装しますた。
って、一番最初のソース上げたその日に調査済みだったりするんですが。
これでちゃんと、文字列がぐるぐる回るようになりました。
今回は変更したソースのみ公開します
(毎回面倒なのと、一日にアップできる文字数制限に引っかからないようにする為)。
ビルドしてみたいという奇特な方は、
"main.h", "game.h" は「ハートに16連射。(5)」のものを、
"font.h", "font.c" は「NDS Homebrew 用に利用可能なフォントリソース。(4)」のものを、
使ってください。
ハートに16連射。(5)
http://d.hatena.ne.jp/dumbo001/20090331/1238471040
NDS Homebrew 用に利用可能なフォントリソース。(4)
http://d.hatena.ne.jp/dumbo001/20090325/1237984081
早射ち計測ゲームが出来るまで。Rev.5 ソースコード(変更のあった分)
main.c
// MAIN //--------------------------------------------------------------------------------- #include <stdio.h> #include "consoleFunc.h" #include "main.h" #include "game.h" //--------------------------------------------------------------------------------- // メイン初期化処理 void initMain(void); //--------------------------------------------------------------------------------- // メインループ int main(void) { initMain(); while(1) { swiWaitForVBlank(); scanKeys(); updateGame(); } return 0; } //--------------------------------------------------------------------------------- // メイン初期化処理 //--------------------------------------------------------------------------------- void initMain(void) { initConsole(); BG_PALETTE_SUB[0] = RGB8(48, 80, 128); } //---------------------------------------------------------------------------------
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); // コンソールBG スクロール用関数 void consoleBgSetScrollX(u16); void consoleBgResetScrollX(void); void consoleBgUpdate(void); #ifdef __cplusplus } #endif #endif
consoleFunc.c
// consoleFunc //--------------------------------------------------------------------------------- #include <stdio.h> #include "consoleFunc.h" #include "font.h" //--------------------------------------------------------------------------------- static PrintConsole console; // フォント変更を適用する為の PrintConsole 構造体 static ConsoleFont font; // フォントステータスを設定する為の ConsoleFont 構造体 static BgState bg_state = {0}; // スクロール値を渡す為の BgState 構造体 //--------------------------------------------------------------------------------- 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); } //--------------------------------------------------------------------------------- void consoleBgSetScrollX(u16 set_scrollX) { // + とすることで左へ、- とすることで右へスクロールする。 bg_state.scrollX += set_scrollX; } //--------------------------------------------------------------------------------- void consoleBgResetScrollX(void) { // 0 とすることで画面を初期位置へ戻す。 bg_state.scrollX = 0; } //--------------------------------------------------------------------------------- void consoleBgUpdate(void) { // BGスクロールを適用・更新する為の処理。 bgSetScroll(console.bgId, bg_state.scrollX, bg_state.scrollY); bgUpdate(); } //---------------------------------------------------------------------------------
game.c
// GAME //--------------------------------------------------------------------------------- #include <stdio.h> #include "game.h" #include "consoleFunc.h" // コンソールBG スクロール用 //--------------------------------------------------------------------------------- //シーン遷移フラグ 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(); consoleBgResetScrollX(); consoleBgUpdate(); 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){ consoleBgSetScrollX(2); consoleBgUpdate(); 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; } //---------------------------------------------------------------------------------