Top / 奥内

奥内のページ

3月29日今日から一口日記を書こうと思います。

2007年2月20日 日本にいないでしょうが、日記のほうの容量がオーバーのようです

  • 相変わらず、活躍のようですね。去年のものを過去ログに移転しておきました(2007年2月20日)

最新の5件を表示しています。 コメントページを参照

  • 11月13日 今日は10時ごろ帰ってきました、結構きつい。 -- 奥内 2008-11-13 (木) 22:10:19
  • 11月15と16日 土曜も日曜もいつもどおりです、雨が降ってた。 -- 奥内 2008-11-16 (日) 18:50:57
  • 11月16日 今日は10時ごろ帰ってきました、あんまり進まない。 -- 奥内 2008-11-17 (月) 22:13:19
  • 11月18日 今日は10時ごろ帰ってきました、ほんとに進んでる気がしない。 -- 奥内 2008-11-18 (火) 22:08:49
  • 11月19日 今日は8時ごろ帰っていました、結構寒いかな〜。 -- 奥内 2008-11-19 (水) 21:06:31
お名前:

CharDef_2の改造

void CharDef_2(u8 id ,u16* image) {
  u16 *tiles = MEM_BG_CHAR(0); // タイルキャラクタデータ アドレス
  u8 i=0;

  AddImageIntoImagePool16(id,(u16 *)image);
  for(i=0;i<16;i++) {
		tiles[i+id*64] = image[i]; + //(image[2*i+1]<<8);
		tiles[i+16+id*64] = image[i+16]; //+ (image[2*i+1+32]<<8);
		tiles[i+32+id*64] = image[i+32]; //+ (image[2*i+1+64]<<8);
		tiles[i+48+id*64] = image[i+48]; //+ (image[2*i+1+96]<<8);
  }
}

3月5日11時半
お久しぶりです。奥内です。先週はカナダのバンクーバのダウンタウンにいました。 今東京でネットを使っています。GBA開発の環境が進んでいるようなので驚きました。 KNOPPIX でゲームボーイアドバンスの話などを聞きたいです。

  • 今度、いつ来る?旅行や研修の話など楽しみにしてますよ。 -- 佐藤伸也? 2005-03-07 18:36:24 (月)

1月31日16時00分
この下が発表用のファイルです。by 奥内

ついでにSOLAのファイルも載せています。

学校で作ったパレット(古い)

家で作ったパレット256(新しい)

家で作ったパレット16

ToDO

  • 飛行機データを 0番パレットで作成
  • 開発環境のページを作成

SOLA

1. はじめに

概要

概要
「ゲームボーイアドバンス」のプログラミングを行う場合、「ライブラリ」が整備されていないため大変に困難である。本論文では、ゲームボーイアドバンスの画面描画に関しての「ライブラリ」を示すことにする。本論文が示す「ライブラリ」によって、ゲームボーイアドバンスのプログラミングが容易になることを期待することができる。

スペック(仕様)

仕様
キャラクタは 16X16サイズ、最大 256キャラクタが使用可能。

2.ライブラリの説明、ライブラリを用いたゲームの作成例

2.1 変数とデータ型

GBA.h の定義を継承している。

u88bit符号無し整数で値域は0から255の間である変数宣言
s88bit符号付き整数で値域は-128から127の間である変数宣言
u1616bit符号無し整数で値域は0から65535の間である変数宣言
s1616bit符号付き整数で値域は-32768から32767の間である変数宣言
u3232bit符号無し整数で値域は0から4x10^9の間である変数宣言
s3232bit符号付き整数で値域は-2x10^9から2x10^9の間である変数宣言
int =def= s32

GBAメモリ領域が 32KB なので無駄に使ってはいけない。

2.2 基本的なプログラムの形

first_Step()okukiso.hを使うときは必ず必要である関数
WaitForVsync()ゲームでは必ず必要な垂直同期待ち関数
#include "okukiso.h" 

int main() {
   	first_Step();
	while(1) {
		WaitForVsync();
	}
 	return 0;
}

2.3 文字列を表示させる方法

cursor(x,y)次に宣言されるprintsやprint_intの位置を宣言する関数
xX座標を宣言する、0から240までの変数
yY座標を宣言する、0から160までの変数
 
(color(i))次に宣言されるprintsやprint_intの色パレットからを宣言する関数(現在はまだ完成してません。)
iパレット番号を宣言する,0から15までの変数
prints("")""で囲まれた文字列を表示する関数
 
print_int(a,b,c)数字を表示する関数
a表示する数を宣言する変数
b桁の数を宣言する変数
c桁の間をどのくらい空けるか宣言する変数(現在はまだ完成してません)
 

サンプルソース(Hello GBA)

#include "okukiso.h"

int main() {
	first_Step();
	while(1) {
		cursor(0,0);
		prints("Hello GBA");
		cursor(0,1);
		print_int(1,3,0);
		WaitForVsync();
   	}
	return 0;
}

2.4 キーボード処理

PUSHED_UE上ボタンを押した場合の条件
PUSHED_SITA下ボタンを押した場合の条件
PUSHED_MIGI右ボタンを押した場合の条件
PUSHED_HIDARI左ボタンを押した場合の条件
PUSHED_AAボタンを押した場合の条件
PUSHED_BBボタンを押した場合の条件

サンプルソース(キーボード操作)

#include "okukiso.h"

int main() {
	first_Step();
	while(1) {
		if(PUSHED_UE)     {
			cursor( 0, 0);    prints("UP   ");
		}
		if(PUSHED_SITA)   {
			cursor( 0, 0);    prints("DOWN ");
		}
		if(PUSHED_MIGI)   {
			cursor( 0, 0);    prints("RIGHT");
		}
		if(PUSHED_HIDARI) {
			cursor( 0, 0);    prints("LEFT ");
		}
		if(PUSHED_A)      {
			cursor( 0, 0);    prints("A    ");
		}
		if(PUSHED_B)      {
			cursor( 0, 0);    prints("B    ");
		}
       		WaitForVsync();
	}
	return 0;
}

2.5 グラフィック

2.5.1グラフィックデータの定義の仕方

CharDef(id, data)自分で作った文字列"str"用のタイル番号を宣言し、スプライトを画像番号を返す関数
idタイル番号を宣言する変数
data自分で作る、画像用の文字列の名前
返り値スプライトプール番号

2.5.2スプライトの表示

SpriteSetPalleteNum(sp,paletto)表示するスプライトのパレットの種類を宣言する関数
spスプライト番号を宣言する変数
palettoパレットの種類を宣言する変数
SpriteFlipNormal(sp)ノーマルなスプライトを表示する関数
spスプライト番号を宣言する変数
ChangeCharAtSpritePlane(e, sp)どの絵を表示するか宣言する変数
eスプライトプール番号を宣言する変数
spスプライト番号を宣言する変数
SpriteSetPos(sp, x, y)スプライトを表示する関数
spスプライト番号を宣言する変数
xX座標を宣言する変数
yY座標を宣言する変数

サンプルソース(キャラクタを表示)

#include "okukiso.h"

const u8 hikou_data[16][(16+1)]={     //飛行機の画像データ

"0000000770000000",
"0000007667000000",
"0000007667000000",
"0000076556700000",
"0000076556700000",
"0060765445670600",
"0060765115670600",
"0067654114567600",
"0067654114567600",
"0076544664456700",
"0076544664456700",
"0765444664445670",
"0765444444445670",
"7765776556775677",
"0077006556007700",
"0077007777007700",

};

int main() {
   	u8 e=0;
   	first_Step();
   	e=CharDef(1, hikou_data);
   	while(1) {
      		SpriteSetPalleteNum(0, 11);
      		SpriteFlipNormal(0);
      		ChangeCharAtSpritePlane(e, 0);
      		SpriteSetPos(0, 0, 0);
      		WaitForVsync();
   	}
	return 0;
}
ChangeCharAtSpritePlane(e, sp)どの絵を表示するか宣言する変数
eスプライトプール番号を宣言する変数
spスプライト番号を宣言する変数

サンプルソース(キャラクタ変更)

#include "okukiso.h"

const u8 hikou_data[16][(16+1)]={     //飛行機の画像データ

"0000000770000000",
"0000007667000000",
"0000007667000000",
"0000076556700000",
"0000076556700000",
"0060765445670600",
"0060765115670600",
"0067654114567600",
"0067654114567600",
"0076544664456700",
"0076544664456700",
"0765444664445670",
"0765444444445670",
"7765776556775677",
"0077006556007700",
"0077007777007700",

};
const u8 teki_data[16][(16+1)]={	//敵の画像データ

"0000000000000000",
"2000000000000002",
"0200000000000020",
"0020000000000200",
"0002000000002000",
"0020200000020200",
"0020020000200200",
"0000000000000000",
"0200000000000020",
"0020000000000200",
"0202200000022020",
"0020022222200200",
"0202002002002020",
"0020002002000200",
"0002000220002000",
"0000000220000000",

};

int main() {
  	u8 e1=0,e2=0;
  	u8 e_id=0;
  	first_Step();
  	e1=CharDef(1, hikou_data);
  	e2=CharDef(1,teki_data);
  	SpriteSetPalleteNum(0, 11);
  	while(1) {
     		if(PUSHED_UE)     {
        		e_id=e1;
     		} else {
        		e_id=e2;
     		}
     		ChangeCharAtSpritePlane(e_id, 0);
     		SpriteSetPos(0, 0, 0);
     		WaitForVsync();
  	}
	return 0;
}

パレット変更

サンプルソース(パレット変更)

#include "okukiso.h"

const u8 hikou_data[16][(16+1)]={     //飛行機の画像データ

"0000000770000000",
"0000007667000000",
"0000007667000000",
"0000076556700000",
"0000076556700000",
"0060765445670600",
"0060765115670600",
"0067654114567600",
"0067654114567600",
"0076544664456700",
"0076544664456700",
"0765444664445670",
"0765444444445670",
"7765776556775677",
"0077006556007700",
"0077007777007700",

};

int main() {
	u8 e=0;
  	u8 palette=10;
  	first_Step();
  	e=CharDef(1, hikou_data);
  	ChangeCharAtSpritePlane(e, 0);
  	SpriteSetPos(0, 0, 0);

  	while(1) {
     		if(PUSHED_UE)     {
        	palette=11;
     	} else {
        	palette=10;
     	}
     	SpriteSetPalleteNum(0, palette);
     	WaitForVsync();
  }
	return 0;
}

サンプルソース(キャラクタをキーボードで動かす)

#include "okukiso.h"//著者の作ったライブラリ

const u8 hikou_data[16][(16+1)]={     //飛行機の画像データ

"0000000770000000",
"0000007667000000",
"0000007667000000",
"0000076556700000",
"0000076556700000",
"0060765445670600",
"0060765115670600",
"0067654114567600",
"0067654114567600",
"0076544664456700",
"0076544664456700",
"0765444664445670",
"0765444444445670",
"7765776556775677",
"0077006556007700",
"0077007777007700",

};

int main() {
	u8 x=0,y=0;
	u8 e=0;
	first_Step();
	e=CharDef(1, hikou_data);
	while(1) {
     		if(PUSHED_UE)     {
        		y--;
     		}
     		if(PUSHED_SITA)   {
        		y++;
     		}
     		if(PUSHED_MIGI)   {
        		x++;
     		}
     		if(PUSHED_HIDARI) {
        		x--;
     		}
     		SpriteSetPalleteNum(0, 11);
     		SpriteFlipNormal(0); //
     		ChangeCharAtSpritePlane(e, 0);
     		SpriteSetPos(0, x, y);
     		WaitForVsync();
  	}
	return 0;
}

2.5.3背景の表示(マップデータの定義の仕方)

MAP(data)マップの配列宣言の関数
data自分で作る、マップ用の配列の名前

サンプルソース(背景を表示する)

#include "okukiso.h"

const u16 maphai_data[16][16]={

{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},

};
const u8 map0_data[16][16+1]={
 "DDDDDDDDDDDDDDDD",
 "D7DD7DD7DD7DD7DD",
 "7DD7DD7DD7DD7DD7",
 "7DD7DD7DD7DD7DD7",
 "DDDDDDDDDDDDDDDD",
 "7DD7DD7DD7DD7DD7",
 "DD7DD7DD7DD7DD7D",
 "DD7DD7DD7DD7DD7D",
 "DDDDDDDDDDDDDDDD",
 "DD7DD7DD7DD7DD7D",
 "D7DD7DD7DD7DD7DD",
 "D7DD7DD7DD7DD7DD",
 "DDDDDDDDDDDDDDDD",
 "7DD7DD7DD7DD7DD7",
 "DD7DD7DD7DD7DD7D",
 "DD7DD7DD7DD7DD7D",
};
const u8 map1_data[16][16+1]={
 "D7DD7111111DDD7D",
 "7DD717777771D7DD",
 "7DD17D7DD7D717DD",
 "DD17D7DDDD7D71DD",
 "D17D7DDDDDD7D71D",
 "17D7DDDDDDDD7D71",
 "17D7DDDDDDDD7D71",
 "17D7DDDDDDDD7D71",
 "17D7DDDDDDDD7D71",
 "D17D7DDDDDD7D71D",
 "DD17D7DDDD7D71DD",
 "DDD17D7DD7D71DDD",
 "DD7D17D77D71DDD7",
 "D7D1997777F91D7D",
 "D719FDF9FFD9F17D",
 "DDDDDDD9FDDDDDDD",
};
 
int main() {
	u8 e=0;
	first_Step();

  	e=CharDef(1, map0_data);
  	e=CharDef(2, map1_data);
  	MAP(maphai_data);
  	while(1) {
     		WaitForVsync();
  	}
	return 0;
}

サンプルソース(上のものと組み合わせる)

#include "okukiso.h"//著者の作ったライブラリ

const u16 maphai_data[16][16]={

{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},
{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2},

};
const u8 map0_data[16][16+1]={
 "DDDDDDDDDDDDDDDD",
 "D7DD7DD7DD7DD7DD",
 "7DD7DD7DD7DD7DD7",
 "7DD7DD7DD7DD7DD7",
 "DDDDDDDDDDDDDDDD",
 "7DD7DD7DD7DD7DD7",
 "DD7DD7DD7DD7DD7D",
 "DD7DD7DD7DD7DD7D",
 "DDDDDDDDDDDDDDDD",
 "DD7DD7DD7DD7DD7D",
 "D7DD7DD7DD7DD7DD",
 "D7DD7DD7DD7DD7DD",
 "DDDDDDDDDDDDDDDD",
 "7DD7DD7DD7DD7DD7",
 "DD7DD7DD7DD7DD7D",
 "DD7DD7DD7DD7DD7D",
};
const u8 map1_data[16][16+1]={
 "D7DD7111111DDD7D",
 "7DD717777771D7DD",
 "7DD17D7DD7D717DD",
 "DD17D7DDDD7D71DD",
 "D17D7DDDDDD7D71D",
 "17D7DDDDDDDD7D71",
 "17D7DDDDDDDD7D71",
 "17D7DDDDDDDD7D71",
 "17D7DDDDDDDD7D71",
 "D17D7DDDDDD7D71D",
 "DD17D7DDDD7D71DD",
 "DDD17D7DD7D71DDD",
 "DD7D17D77D71DDD7",
 "D7D1997777F91D7D",
 "D719FDF9FFD9F17D",
 "DDDDDDD9FDDDDDDD",
};
const u8 hikou_data[16][(16+1)]={     //飛行機の画像データ

"0000000770000000",
"0000007667000000",
"0000007667000000",
"0000076556700000",
"0000076556700000",
"0060765445670600",
"0060765115670600",
"0067654114567600",
"0067654114567600",
"0076544664456700",
"0076544664456700",
"0765444664445670",
"0765444444445670",
"7765776556775677",
"0077006556007700",
"0077007777007700",
};
 
int main() {
	u8 x=0,y=0;
  	u8 e=0;
  	first_Step();

  	e=CharDef(1, map0_data);
  	e=CharDef(2, map1_data);
  	e=CharDef(3, hikou_data);
  	MAP(maphai_data);
  	while(1) {
     		if(PUSHED_UE)     {
        		y--;
     		}
	      	if(PUSHED_SITA)   {
       	 	y++;
     		}
     		if(PUSHED_MIGI)   {
        		x++;
     		}
     		if(PUSHED_HIDARI) {
        		x--;
     		}
     		SpriteSetPalleteNum(0, 11);
     		SpriteFlipNormal(0);
     		ChangeCharAtSpritePlane(e, 0);
     		SpriteSetPos(0, x, y);
     		WaitForVsync();
  	}
	return 0;
}

2.6 サウンドの鳴らし方

Music1("")""で囲まれたMMLで書かれた文字列の曲を流す関数その1
Music2("")""で囲まれたMMLで書かれた文字列の曲を流す関数その2
Percussion("")""で囲まれたMMLで書かれた文字列の曲を流す関数その3
Music1Repeat("")""で囲まれたMMLで書かれた文字列の曲を繰り返し流す関数その1(Music2もPercussionも同じ)
Music1Stop()Music1で流れている曲を止める関数(Music2もPercussionも同じ)

サンプルソース(サウンドの鳴らし方)

#include "okukiso.h"

int main() {
	first_Step();
	Music1Repeat("T220O4L4 RRRRRRRR CDEFEDCR EFGAGFER CRCRCRCR L8CCDDEEFF L4EDCR");
	Music2("T220O5L4 CDEFEDCR EFGAGFER CRCRCRCR L8CCDDEEFF L4EDCR RRRRRRRR");
	Percussion("T220L4Q1 RBRBRBRB RBRBRBRB8B8 RBRBRBRB RBRBRBRB8B8 RB8B8RBRBBC");
	while(1) {
		WaitForVsync();
  	}
	return 0;
}

2.7 セーブの仕方

SaveGet_u16(s)u16の形でセーブしたデータを出力する関数
sセーブナンバーのための変数
返り値u16の形で出力される変数
SaveGet_s8( s)s8の形でセーブしたデータを出力する関数
sセーブナンバーのための変数
返り値s8の形で出力される変数
SaveGet_u16(s,a)u16の形でセーブするための関数
sセーブナンバーのための変数
a入力するためのu16の形の変数
SaveGet_s8( s,a)s8の形でセーブするための関数
sセーブナンバーのための変数
a入力するためのs8の形の変数

サンプルソース(セーブの仕方)

#include "okukiso.h"//私の作ったライブラリ

int main() {
  first_Step();
  s8 a=SaveGet_16(0);
  while(1){
     if(PUSHED_UE){
        a++;
        SaveSet_16(0,a);
     }
     if(PUSHED_SITA){
        a--;
        SaveSet_16(0,a);
     }
     if(PUSHED_A){
        a=0;
        SaveSet_16(0,a);
     }
     cursor(0,0);
     print_int(a,10,0);
     WaitForVsync();
  }
  return 0;
}

2.8 テーブルテニスの作成

#include "okukiso.h"

const u16 maphai_data[16][16]={
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
};
const u8 map0_data[16][16+1]={
 "DDDDDDDDDDDDDDDD",
 "D7DD7DD7DD7DD7DD",
 "7DD7DD7DD7DD7DD7",
 "7DD7DD7DD7DD7DD7",
 "DDDDDDDDDDDDDDDD",
 "7DD7DD7DD7DD7DD7",
 "DD7DD7DD7DD7DD7D",
 "DD7DD7DD7DD7DD7D",
 "DDDDDDDDDDDDDDDD",
 "DD7DD7DD7DD7DD7D",
 "D7DD7DD7DD7DD7DD",
 "D7DD7DD7DD7DD7DD",
 "DDDDDDDDDDDDDDDD",
 "7DD7DD7DD7DD7DD7",
 "DD7DD7DD7DD7DD7D",
 "DD7DD7DD7DD7DD7D",
};

const u8 tama_data[16][(16+1)]={     //ボールの画像データ
 
"000000AAAA000000",
"0000AA8888AA0000",
"00AA88888888AA00",
"00A8866666688A00",
"0A886666666688A0",
"0A866644446668A0",
"A88664444446688A",
"A88664433446688A",
"A88664433446688A",
"A88664444446688A",
"0A866644446668A0",
"0A886666666688A0",
"00A8866666688A00",
"00AA88888888AA00",
"0000AA8888AA0000",
"000000AAAA000000",
};
const u8 tate0_data[16][(16+1)]={     //ラケットの画像データその1

"8888155555555555",
"8888155555555555",
"8888155555555555",
"8888155555555555",
"0888815555555555",
"0888815555555555",
"0888815555555555",
"0088881555555555",
"0088881555555555",
"0008888155555555",
"0000888815555555",
"0000008888155555",
"0000000000000000",
"0000000000000000",
"0000000000000000",
"0000000000000000",
};
const u8 tate1_data[16][(16+1)]={     //ラケットの画像データその2

"5555555555518888",
"5555555555518888",
"5555555555518888",
"5555555555518888",
"5555555555188880",
"5555555555188880",
"5555555555188880",
"5555555551888800",
"5555555551888800",
"5555555518888000",
"5555555188880000",
"5555518888000000",
"0000000000000000",
"0000000000000000",
"0000000000000000",
"0000000000000000",
};
#define INIT         0
#define PLAY         1
#define GAME_OVER    2
#define KABE_SITA    9*16
#define KABE_UE      1*16
#define KABE_MIGI    13*16
#define KABE_HIDARI  1*16

s16 x=0,y=0,bx=1*16,by=1*16;
s8 vect_bx=0,vect_by=0;
u16 map,tama,tate0,tate1;
u16 time_c;
u8 Init(){//初期化
  first_Step();
  map=CharDef(1,map0_data);
  tama=CharDef(2,tama_data);
  tate0=CharDef(2,tate0_data);
  tate1=CharDef(2,tate1_data);
  MAP(maphai_data);
  x=1*16,y=KABE_SITA,bx=1*16,by=1*16,vect_bx=1,vect_by=1;

  cls(); cursor(0,0); prints("tennis");
  time_c=0;
  return PLAY;
}
u8 Syoutotu(s16 n_1,s16 n_2,s16 sa){
  s16 sa2=0;
  if(n_1-n_2<0){
     sa2=(n_1-n_2)*(-1);
  }else{
     sa2=(n_1-n_2);
  }
  if(sa2<sa){
     return 1;
  }else{
     return 0;
  }
}

u8 Syoutotu_xy(u16 ax,u16 ay, u8 ax_1,u8 ay_1,u8 ax_2, u8 ay_2,
              u16 bx,u16 by, u8 bx_1,u8 by_1,u8 bx_2, u8 by_2){
  u16 kyori_ax_half = (ax_2-ax_1)/2;
  u16 kyori_ay_half = (ay_2-ay_1)/2;
  u16 kyori_bx_half = (bx_2-bx_1)/2;
  u16 kyori_by_half = (by_2-by_1)/2;

  if((Syoutotu(ax+ax_1+kyori_ax_half,
               bx+bx_1+kyori_bx_half,
               kyori_ax_half+kyori_bx_half))
     &&
     (Syoutotu(ay+ay_1+kyori_ay_half,
               by+by_1+kyori_by_half,
               kyori_ay_half+kyori_by_half))){
     return 1;
  }else{
     return 0;
  }
}
u8 gamePlay(){
  if(time_c%2==0){ //勝手に動くボールのムーブカウント
     // ボールの移動
     bx+=vect_bx*2;
     by+=vect_by*2;

     // 画面に画像を出力する
     SpriteSetPalleteNum(0, 11);
     SpriteFlipNormal(0);
     ChangeCharAtSpritePlane(tama, 0);
     SpriteSetPos(0, bx, by);

     SpriteSetPalleteNum(1, 12);
     SpriteFlipNormal(1);
     ChangeCharAtSpritePlane(tate0, 1);
     SpriteSetPos(1, x, y);

     SpriteSetPalleteNum(2, 12);
     SpriteFlipNormal(2);
     ChangeCharAtSpritePlane(tate1, 2);
     SpriteSetPos(2, x+16, y);

     cursor(22,7);
     print_int(time_c,4,0);//print_intは数字の出力

     // 壁との衝突判定と処理(向きの反転)
     if((bx<KABE_HIDARI)||(bx>KABE_MIGI))
        vect_bx=-vect_bx;
     if((by<KABE_UE)||(by>y))
        vect_by= -vect_by;

  }

     if(PUSHED_MIGI){ //右カーソル
        x+=2;
        if(x>KABE_MIGI-16){ //バーの右にいける限界
           x=KABE_MIGI-16;
        }
     }

     if (PUSHED_HIDARI){  //左カーソル
        x-=2;
         if(x<KABE_HIDARI){ //バーの左にいける限界
           x=KABE_HIDARI;
        }
     }

  if(Syoutotu_xy(bx,by,0,13,16,15,
                  x, y,0,0,16*2,1)){

     SpriteSetPalleteNum(0, 13);
     SpriteSetPalleteNum(1, 14);
     SpriteSetPalleteNum(2, 14);
     vect_by= -vect_by;
     by=y-16;
  }

  if(by>y)
     return GAME_OVER;

  time_c++;//時間のカウント
  return PLAY;
}

s8 gameover(){
  cursor(3,7); prints("  GAME OVER");
  cursor(3,9); prints("Push A Button!");

  while(1)

     if(PUSHED_A) //Aボタン
        break;
  return INIT;
}

void game(){
  s8 fase=INIT;
  while (1) {
     switch(fase) {
        case INIT:
           fase=Init(); break;
        case PLAY:
           fase=gamePlay(); break;
        case GAME_OVER:
           fase=gameover(); break;
     }
     WaitForVsync();
  }
}

// メイン関数
int main(){
  game();
}

3. 「ライブラリ」の詳細説明

すべての「ライブラリ」関数の説明

u88bit符号無し整数で値域は0から255の間である変数宣言
s88bit符号付き整数で値域は-128から127の間である変数宣言
u166bit符号無し整数で値域は0から65535の間である変数宣言
s1616bit符号付き整数で値域は-32768から32767の間である変数宣言
u3232bit符号無し整数で値域は0から4x10^9の間である変数宣言
s3232bit符号付き整数で値域は-2x10^9から2x10^9の間である変数宣言
PUSHED_UE上ボタンを押した場合の条件
PUSHED_SITA下ボタンを押した場合の条件
PUSHED_MIGI右ボタンを押した場合の条件
PUSHED_HIDARI左ボタンを押した場合の条件
PUSHED_AAボタンを押した場合の条件
PUSHED_BBボタンを押した場合の条件
first_Step()okukiso.hを使うときは必ず必要である関数
WaitForVsync()ゲームでは必ず必要な垂直同期待ち関数
cursor(x,y)次に宣言されるprintsやprint_intの位置を宣言する関数
xX座標を宣言する、0から240までの変数
yY座標を宣言する、0から160までの変数
(color(i))次に宣言されるprintsやprint_intの色パレットからを宣言する関数(現在はまだ完成してません。)
iパレット番号を宣言する,0から15までの変数
prints("")で囲まれた文字列を表示する関数
print_int(a,b,c)数字を表示する関数
a表示する数を宣言する変数
b桁の数を宣言する変数
c桁の間をどのくらい空けるか宣言する変数(現在はまだ完成してません)
CharDef(id, data)自分で作った文字列"str"用のタイル番号を宣言し、スプライトを画像番号を返す関数
idタイル番号を宣言する,変数
data自分で作る、画像用の文字列の名前
返り値スプライトプール番号
SpriteSetPalleteNum(sp,paletto)表示するスプライトのパレットの種類を宣言する関数
spスプライト番号を宣言する変数
palettoパレットの種類を宣言する変数
SpriteFlipNormal(sp)ノーマルなスプライトを表示する関数
spスプライト番号を宣言する変数
ChangeCharAtSpritePlane(e, sp)どの絵を表示するか宣言する変数
eスプライトプール番号を宣言する変数
spスプライト番号を宣言する変数
SpriteSetPos(sp, x, y)スプライトを表示する関数
spスプライト番号を宣言する変数
xX座標を宣言する変数
yY座標を宣言する変数
setmap(x,y,tilenum):ップの(x,y)に画像番号の画像を出力する関数
xx軸の数値0から16までの変数
yy軸の数値0から16までの変数
tilenum出力したいタイル番号
MAP(data)マップの配列宣言の関数
data自分で作る、マップ用の配列の名前
SaveGet_u16(s)u16の形でセーブしたデータを出力する関数
sセーブナンバーのための変数
返り値u16の形で出力される変数
SaveGet_s8( s)s8の形でセーブしたデータを出力する関数
sセーブナンバーのための変数
返り値s8の形で出力される変数
SaveGet_u16(s,a)u16の形でセーブするための関数
sセーブナンバーのための変数
a入力するためのu16の形の変数
SaveGet_s8( s,a)s8の形でセーブするための関数
sセーブナンバーのための変数
a入力するためのs8の形の変数
UnitGetting(x,y,e,re,sp,c,palette)キャラクタの設定のための関数
xキャラクタの初期X軸座標0から16*16までの変数
yキャラクタの初期Y軸座標0から16*16までの変数
e画像番号の変数
re上下や左右の反転 0ならそのまま 1なら上下反転 2なら左右反転 3なら上下左右反転
spスプライト番号
c画像番号の変化があれば1なければ0
palette16種類のパレット番号を選ぶ
GtimeSet_time_0()経過時間の初期化のための関数
GtimeGet_time()経過時間の出力するための関数
返り値経過時間の出力する0から4x10^9の間である変数
GtimeSet_time_1()経過時間の継続の関数
Scrolling(x,y)マップををスクロールする関数
xX軸のスクロールを管理する変数
yY軸のスクロールを管理する変数

4. 残された課題

4.1 「ライブラリ」作成面の課題

「衝突判定」と「セーブ機能」と「マップの拡大」の関数をを「ライブラリ」に入れたい。

4.2 「ライブラリ」使用面の課題

実際に「ライブラリ」を作った著者のゲーム作成と今後読者がこの「ライブラリ」を使い作るゲーム作成では差があるのが当たり前である。だから今後は著者はこの「ライブラリ」を使う人の意見を重要視しライブラリ」を発展させていくことを考える。

5. 終わりに

この卒論を通して言いたい事

5.1 著者が「プログラミング」を学ぼうと思った理由

著者がプログラミングを学ぼうと思った理由は「誰もがプレイできる環境で自分でゲームを開発したかったから」である。もちろんプログラミングの知識がなかったとしても「開発ツール」を使えば開発をすることができる。しかしそれでは表向きの「開発」はできたとしても、根本の「開発」はできないと感じる。そこでできるだけ大学の「プログラミング」の授業を取りいれた。そこで現在「ゲーム開発」に使っているCやJavaなどを勉強を経験した。

5.2 著者にとっての「ゲーム開発」の環境

しかし多少授業で学んだ知識では「誰でもプレイできる環境」ではできないと感じた。もちろん「パソコン」があり「パソコンが使える人」ならば「誰でもプレイできる環境」かもしれないが、著者が求めた「誰でもプレイできる環境」とは「ゲームを遊ぶことを重視した環境」である。例えば「ファミリーコンピュータ」などの「ゲーム機種」である。 そこで著者が選んだのは「ゲームボーイアドバンス」の環境であった。理由は「持ち運びができる」ことと「今の著者のゲームの開発能力の限界(実際ゲームボーイアドバンス開発は能力的に限界でした。)」と感じたからである。

5.3 「プログラミング」と「ゲーム開発」

著者のように「ゲーム開発」をしたいが、願望があるのに「プログラミング」と「ゲーム開発」という二つの壁にぶつかり、妥協してしまった人も多いと感じられる。実際、著者も「プログラミング」と「ゲーム開発」をつなげるのに、2,3回失敗し妥協した経験がある。その経験のおかげでこの二つをつなげることができた現在だからこそ「ゲーム開発」に夢中になれたと感じる。
「プログラミング」を「ゲーム開発」の中で学びたい人または著者のように「ゲーム開発」をするために「プログラミング」を学びたい人に著者の作った「ライブラリ」を使って「プログラミング」の勉強と「ゲーム開発」の楽しさを知ってもらえることがこの卒論の存在意義である。

6. 参考集

6.1 参考文献

基本情報技術者【午前】問題集
編者「日高 哲郎」
発行所「日本経済新聞社」

Linuxから目覚める僕らのゲームボーイ!
著者「西田 亙」
発行所「ソフトバンクパブリッシング株式会社」

ゲームボーイアドバンス・プログラミングバイブル
著者「大橋 修」
発行所「株式会社すばる舎」

無料ツールでゲームプログラミング

6.2 参考ホームページアドレス

GBAプログラミング研究所
http://j-gbadev.hp.infoseek.co.jp/

題名「C言語講座」
http://www.sgnet.co.jp/c/

ドット絵講座
http://www.enterbrain.co.jp/digifami/digiweb/dot_teck/index.html

東大ゲームボーイ
http://ks.ms.u-tokyo.ac.jp/00-II/pres/yanagita/

ANSI C++書式
http://homepage1.nifty.com/~umetani/ims/2002/20020319001/0.html

Counter: 6237, today: 2, yesterday: 4

添付ファイル: filesoturonn0130.pdf 517件 [詳細] filesoturonn0130.doc 626件 [詳細] filesola.h 559件 [詳細] filecolor.dpf 521件 [詳細] filec.h 561件 [詳細] filesola.c 565件 [詳細] filecolor16.dpf 562件 [詳細] file16color1222.dpf 543件 [詳細] filec.c 559件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-10-03 (金) 06:37:10 (47d)