読者です 読者をやめる 読者になる 読者になる

ワーブル・トレイン。


ワーブル・トレインです。うねうね動くプログラムです。
ソースは「ゲームショートプログラム」のベーシックリストを参考にしてます。


ワーブルの意味が分かりません。ベルギー?


devkitPro - NDS


・ビルド手順

1. 下記ソースを *.c ファイルに保存。

2. /* コンパイラ_ターゲットの選択設定 */ の部分にある
#define	_VC2010_WIN_ をコメントアウトして、
#define	_DEVKITPRO_NDS_ のコメントアウトを取り除く。

3. devkitPro/examples/nds/templates/arm9 等のテンプレートプロジェクトを流用して
./source/main.c を *.c と差し替える。

4. Makefile のリンクオプションに "-lm" を追記してビルド。
LIBS	:= 	-lnds9 -lm


Visual C++ 2010 - Win32 コンソール版


・ビルド手順

1. 下記ソースを *.c ファイルに保存。

2. /* コンパイラ_ターゲットの選択設定 */ の部分にある
#define	_DEVKITPRO_NDS_ をコメントアウトして、
#define	_VC2010_WIN_ のコメントアウトを取り除く。

3. ファイル-新規作成-プロジェクト-Win32 コンソール アプリケーション で空のプロジェクト作って
ソース ファイル-追加-既存の項目 で *.c を追加してビルド。


main.c

/*---------------------------------------------------------------------------------
	
	WavreTrain
	
	version 0.01
	Dec  07, 2011
	
	By REGEKATU
	
---------------------------------------------------------------------------------*/

/* コンパイラ_ターゲットの選択設定 */
//#define	_VC2010_WIN_
#define	_DEVKITPRO_NDS_


/* インクルードヘッダ設定 */
#include <math.h>
#include <stdio.h>
#include <string.h>

#ifdef	_VC2010_WIN_
#include <Windows.h>
#endif
#ifdef	_DEVKITPRO_NDS_
#include <nds.h>
#endif


/* ブール型定義 */
#ifndef bool
#define bool unsigned char
#endif

#ifndef true
#define true 1
#endif

#ifndef false
#define false 0
#endif

/* コンソール定数 */
#ifdef	_VC2010_WIN_
#define CONSOLE_WIDTH  80								/* 表示環境の横表示可能文字数*/
#define CONSOLE_HEIGHT 25								/* 表示環境の縦表示可能文字数*/
#endif
#ifdef	_DEVKITPRO_NDS_
#define CONSOLE_WIDTH  32								/* 表示環境の横表示可能文字数*/
#define CONSOLE_HEIGHT 24								/* 表示環境の縦表示可能文字数*/
#endif

typedef enum{    /* setColor 関数用色定義 */
	L_BLACK = 0, /* \x1b[30m 低輝度・黒色 */
	L_BLUE,      /* \x1b[34m 低輝度・青色 */
	L_GREEN,     /* \x1b[32m 低輝度・緑色 */
	L_CYAN,      /* \x1b[36m 低輝度・水色 */
	L_RED,       /* \x1b[31m 低輝度・赤色 */
	L_PURPLE,    /* \x1b[35m 低輝度・紫色 */
	L_YELLOW,    /* \x1b[33m 低輝度・黄色 */
	L_WHITE,     /* \x1b[37m 低輝度・白色 */
	
	H_BLACK,     /* \x1b[40m 高輝度・黒色 */
	H_BLUE,      /* \x1b[44m 高輝度・青色 */
	H_GREEN,     /* \x1b[42m 高輝度・緑色 */
	H_CYAN,      /* \x1b[46m 高輝度・水色 */
	H_RED,       /* \x1b[41m 高輝度・赤色 */
	H_PURPLE,    /* \x1b[45m 高輝度・紫色 */
	H_YELLOW,    /* \x1b[43m 高輝度・黄色 */
	H_WHITE      /* \x1b[47m 高輝度・白色 */
}COLOR;

/* ユーザ定数 */
#define DRAW_WIDTH  CONSOLE_WIDTH						/* 描画情報横幅 */
#define DRAW_HEIGHT CONSOLE_HEIGHT						/* 描画情報縦幅 */

#define DRAW_CENTER (DRAW_WIDTH / 2)					/* 描画範囲中心点 */
#define DRAW_RADIUS (DRAW_CENTER - (DRAW_CENTER / 4))	/* 描画範囲半径幅 */


/* コンソール変数 */
#ifdef	_VC2010_WIN_
HANDLE hOut;											/* コンソールスクリーンバッファのハンドル */
COORD dwPos;											/* コンソールスクリーンカーソル指定用構造体 */
CONSOLE_SCREEN_BUFFER_INFO csbi;						/* コンソールスクリーンバッファ情報の構造体 */
DWORD written;											/* 書き込まれたセル数へのポインタ */
#endif

/* ユーザ変数 */
int seed;												/* サインカーブ用シード値 */
int draw_buffer[DRAW_WIDTH * DRAW_HEIGHT];				/* 描画情報用配列 */


/* メイン関数 */
int main(void);											/* メインプログラム */

/* ユーザ関数 */
void init(void);										/* プログラムを初期化する */
void draw(void);										/* プログラム画面を表示する */
void update(void);										/* プログラムを更新する */

/* コンソール関数 */
void setLocate(int x, int y);							/* 文字の表示位置を設定する */
void setColor(int fore, int back);						/* 文字の表示色、背景色を設定する */
void clearScreen(void);									/* コンソール画面を消去する */



//---------------------------------------------------------------------------------
int main(void){
//---------------------------------------------------------------------------------
	
	/* メインプログラム */
	
	/* コンソールを初期化する */
#ifdef	_VC2010_WIN_
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
#endif
#ifdef	_DEVKITPRO_NDS_
	consoleDemoInit();
#endif
	
	/* プログラムを初期化する*/
	init();
	
	/* メインループ */
	while(1){
		
		/* プログラムを一定間隔で更新する */
#ifdef	_VC2010_WIN_
		Sleep(16);
#endif
#ifdef	_DEVKITPRO_NDS_
		swiWaitForVBlank();
#endif
		
		/* プログラム画面を表示する */
		draw();
		
		/* プログラムを更新する */
		update();
		
	}
	
}

//---------------------------------------------------------------------------------
void init(void){
//---------------------------------------------------------------------------------
	
	/* プログラムを初期化する */
	
	/* 画面を消去する */
	clearScreen();
	
	/* 描画情報を初期化する */
	memset(&draw_buffer, 0x00, sizeof(draw_buffer));
	
	/* プログラムの初期値を設定する */
	seed = 0;
	
}

//---------------------------------------------------------------------------------
void draw(void){
//---------------------------------------------------------------------------------
	
	/* プログラム画面を表示する */
	
	int x, y;
	
	setLocate(0, 0);
	
	for(y = 0;y < DRAW_HEIGHT;y++){
		for(x = 0;x < DRAW_WIDTH;x++){
			
			if(draw_buffer[x + y * DRAW_WIDTH]){
				setColor(draw_buffer[x + y * DRAW_WIDTH], L_BLACK);
				printf("*");
			}else{
				printf(" ");
			}
			
		}
		if(x < CONSOLE_WIDTH) printf("\n");
	}
	
}

//---------------------------------------------------------------------------------
void update(void){
//---------------------------------------------------------------------------------
	
	/* プログラムを更新する */
	
	int i, x;
	
	/* 描画情報を1ライン分進める */
	for(i = DRAW_WIDTH;i < DRAW_WIDTH * DRAW_HEIGHT;i++)
		draw_buffer[ i - DRAW_WIDTH ] = draw_buffer[i];
	
	/* 新しい描画情報を更新する */
	for(i = 0;i < 8;i++){
		x =(int)( DRAW_CENTER + DRAW_RADIUS * sin( (double)seed / 10 * ((double)i / 10 + 1) ) );
		draw_buffer[ x + (DRAW_HEIGHT - 2) * DRAW_WIDTH ] = i;
	}
	seed++;	
	
}

//---------------------------------------------------------------------------------
void setLocate(int x, int y){
//---------------------------------------------------------------------------------
	
	/* 文字の表示位置を設定する */
	
#ifdef	_VC2010_WIN_
	dwPos.X = (short)x;
	dwPos.Y = (short)y;
	SetConsoleCursorPosition(hOut, dwPos);
#else
	printf("\x01b[%d;%dH", y, x);
#endif
	
}

//---------------------------------------------------------------------------------
void setColor(int fore, int back){
//---------------------------------------------------------------------------------
	
	/* 文字の表示色、背景色を設定する */
	
	/* 下位 4 ビットを色番号として使用する */
	fore &= 0x0f;
	back &= 0x0f;
	
#ifdef	_VC2010_WIN_
	SetConsoleTextAttribute( hOut, (WORD)fore + ((WORD)back << 4) );
#else
	static const int font_color[] = {
		30, 34, 32, 36, 31, 35, 33, 37, 
		40, 44, 42, 46, 41, 45, 43, 47
	};
	
	static const int back_color[] = {
		RGB15( 0,  0,  0), 	//30 normal black
		RGB15( 0,  0, 15), 	//34 normal blue
		RGB15( 0, 15,  0), 	//32 normal green
		RGB15( 0, 15, 15), 	//36 normal cyan
		RGB15(15,  0,  0), 	//31 normal red
		RGB15(15,  0, 15), 	//35 normal magenta
		RGB15(15, 15,  0), 	//33 normal yellow
		RGB15(24, 24, 24), 	//37 normal white
		
		RGB15(15, 15, 15), 	//40 bright black
		RGB15( 0,  0, 31), 	//44 bright blue
		RGB15( 0, 31,  0), 	//42 bright green
		RGB15( 0, 31, 31), 	//46 bright cyan
		RGB15(31,  0,  0), 	//41 bright red
		RGB15(31,  0, 31), 	//45 bright magenta
		RGB15(31, 31,  0), 	//43 bright yellow
		RGB15(31, 31, 31)	//47 & 39 bright white
	};
	
	printf("\x1b[%dm", font_color[fore]);
	BG_PALETTE_SUB[0] = back_color[back];
#endif
	
}

//---------------------------------------------------------------------------------
void clearScreen(void){
//---------------------------------------------------------------------------------
	
	/* コンソール画面を消去する */
	
#ifdef	_VC2010_WIN_
	dwPos.X = 0;
	dwPos.Y = 0;
	if(GetConsoleScreenBufferInfo(hOut, &csbi))
		FillConsoleOutputCharacter(hOut, ' ', 
			csbi.dwSize.X * csbi.dwSize.Y, dwPos, &written);
#else
	printf("\x1b[2J");
#endif
	
}

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