ハートに16連射。(1)


RGKT-NDS-HMBR-006(001)


今作り途中の CAVE GAME がもうちょいって辺りまで来てて
仕事の合間の短い休憩時間中って訳に行かなくなって来たので。


何か手軽に休憩中の暇つぶしは無いかと考えて
シュウォッチもどきくらいならそんな頭使わずに作れるかな?作れるかな?
って思い付いて書いてみたとです。
まあこれはシュウォッチとは違うものなんだけど。


元ネタは
バックアップ活用テクニック PART5 のファミコンプログラム。


バックアップ活用テクニック PART5


高橋名人全盛の頃の連打をネタとしたPD。
Homebrew シーン最初期のコードだったり。


早射ち計測ゲーム


写真は2年くらい前に PART5 を入手して、ダンプリストをバイナリエディタで打ち込んで動作させたもの。


この元ネタゲームの基本的な動作としては
・起動時の初期化
・入力待ち受け
・Aボタンが押されたら入力カウントの開始
・8秒経過したら1秒当たりAボタンが何回押されたか、平均値を表示してプログラム終了


とまあいたって初歩的なものなので
まったり遊べるかなー?なんて思いながら書き始めてみたら
予想よりも早くベース部分は終わってしまった。


何せ単純な作りのプログラム。直ぐ終わって当然か。
コードもまだ全然手抜きだし。


シーケンス遷移なんて単純に switch 分岐の中にコードがそのまま入ってるまんま。
一応遊べるは遊べる状態(動作確認できる状態)ではあるが。
明日はシーンや処理として分けるべき箇所を関数化してく方向で進めてこうかと。


早射ち計測ゲームが出来るまで。Rev.1


ソースコード

/*---------------------------------------------------------------------------------
	
	SHOOTING MEASUREMENT GAME
	Revision.1
	
	Mar 24, 2009
	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 <nds.h>
#include <stdio.h>

#define TIME_PER_SEC  60
#define TIME_OVER_SEC  8

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;

int main(void)
{
	ST_GAME game = {GAME_INIT};
	int time_count = 0, key_count = 0;
	
	while(1) {
		scanKeys();
		
		switch(game.act){
			
		case GAME_INIT:
			consoleDemoInit();
			BG_PALETTE_SUB[0] = RGB8(48, 80, 128);
			
			game.act = GAME_PLAY_INIT;
			break;
			
		case GAME_PLAY_INIT:
			consoleClear();
			key_count = 0;
			time_count = 0;
			iprintf("\x1b[9;9HPUSH A BUTTON\n");
			
			game.act = GAME_PLAY_START;
			break;
			
		case GAME_PLAY_START:
			
			if(keysDown() & KEY_A){
				time_count++;
				key_count++;
				game.act = GAME_PLAY_EXEC;
			}
			break;
			
		case GAME_PLAY_EXEC:
			
			time_count++;
			if(keysDown() & KEY_A){
				key_count++;
			}
			
			if((time_count / TIME_PER_SEC) == TIME_OVER_SEC){
				consoleClear();
				game.act = GAME_PLAY_END;
			}
			break;
			
		case GAME_PLAY_END:
			iprintf("\x1b[9;9HPUSH A BUTTON\n");
			iprintf("\x1b[12;6H%4d TIMES PER SEC\n", key_count / 8);
			
			game.act = GAME_PLAY_EXIT;
			break;
			
		case GAME_PLAY_EXIT:
			if((keysHeld() & KEY_START)&&(keysHeld() & KEY_SELECT)&&(keysHeld() & KEY_L)&&(keysHeld() & KEY_R))
				game.act = GAME_EXIT;
			break;
			
		case GAME_EXIT:
			game.act = GAME_PLAY_INIT;
			break;
			
		default:
			break;
		}
		
		//debug print
		iprintf("\x1b[22;0HTIME_COUNT:%3d\nKEY_COUNT: %3d", time_count, key_count);
		
		swiWaitForVBlank();
	}

	return 0;
}
//---------------------------------------------------------------------------------