ハートに16連射。(6)


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

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