instant.d 作ってます。

大遅刻しました。大変すみません。

またまたゲームネタです。
世の中にはゲームを作る前にゲームライブラリを作り始める人種というものがいるらしく、私もその一人です。
やりすぎるとゲームがいつまで経っても出来上がらないので注意しましょう。

そんなわけで、instant.d というD言語用のゲームライブラリを開発中です。
現在開発中なので使い物にならないと思います。今後の進捗を乞うご期待。

##概要
Unreal EngineやUnityみたいなオーサリングツールで作っていくようなものではなく、
ゴリゴリとコーディングしてゲームを作っていくタイプのエンジンです。
現状Windowsのみ対応ですが、クロスプラットフォームを目指しています。

とりあえずGitHubで公開しました。
まだ全然使い物にならないので、ソース見るくらいにしておいてください（汗
https://github.com/ueshita/instant.d


##いきなりサンプルプログラム

```d:example.d
import std.random;
import instant.d;

void main()
{
	// ゲーム設定
	auto settings = new GameSettings;
	settings.title = "instant.d example [2DSprites]";
	settings.screen.size = Size2(800, 480);
	settings.screen.mode = ScreenMode.Window;
	
	// ゲーム実行！
	Game.run!(MyGame)(settings);
}

class MyGame : Game
{
	const int numBalls = 128;
	Ball[] balls;
	SpriteRenderer spriteRenderer;
	
	// 開始時に呼ばれる
	override void onStartup() {
		// スプライトレンダラーを作成
		this.spriteRenderer = new SpriteRenderer(numBalls);
		// テクスチャをロードして指定
		this.spriteRenderer.texture = Texture.load("sprite.png");
		// ランダムに沢山ボールを作る
		auto rnd = Xorshift(unpredictableSeed);
		this.balls = new Ball[numBalls];
		foreach (ref ball; this.balls) {
			ball = new Ball(rnd);
		}
	}
	// 終了時に呼ばれる
	override void onShutdown() {
	}
	// フレーム更新時に呼ばれる
	override void onUpdate() {
		foreach (ref ball; this.balls) {
			ball.update();
		}
	}
	// フレーム描画時に呼ばれる
	override void onRender() {
		// 画面クリア
		Gfx.clear();
		
		// 2D画面開始
		Gfx.begin2DScene();
		
		// アルファブレンディングする
		Gfx.blend = Blend.Alpha;
		
		// スプライト描画開始
		this.spriteRenderer.begin();
		// ボールを沢山描画する
		foreach (ball; this.balls) {
			ball.draw(this.spriteRenderer);
		}
		// スプライト描画終了
		this.spriteRenderer.end();
		
		// 2D画面終了
		Gfx.end2DScene();
	}
}

class Ball
{
	Sprite sprite;
	Vector2 position;
	Vector2 velocity;	
	Vector2 size;
	float angle = 0.0f;
	float angleVelocity = 0.0f;
	
	this(ref Xorshift rnd) {
		int type = uniform(0, 4, rnd);
		this.size = Vector2(26, 26);
		this.position.x = uniform(0.0f, Gfx.frameSize.x, rnd);
		this.position.y = uniform(0.0f, Gfx.frameSize.y, rnd);
		this.velocity.x = uniform(-2.0f, 2.0f, rnd);
		this.velocity.y = uniform(-2.0f, 2.0f, rnd);
		this.angle = uniform(0.0f, 360.0f, rnd);
		this.angleVelocity = uniform(-4.0f, 4.0f, rnd);
		
		this.sprite.updateTexCoord(type * 26, 32, 26, 26);
		this.sprite.updateColor(ColorPalette.White);
	}
	void update() {
		this.position += this.velocity;
		this.angle += this.angleVelocity;
		
		// 画面の端にぶつかったら跳ね返す
		if (this.velocity.x < 0 && this.position.x < 0.0f) {
			this.velocity.x = -this.velocity.x;
		}
		if (this.velocity.x > 0 && this.position.x > Gfx.frameSize.x) {
			this.velocity.x = -this.velocity.x;
		}
		if (this.velocity.y < 0 && this.position.y < 0.0f) {
			this.velocity.y = -this.velocity.y;
		}
		if (this.velocity.y > 0 && this.position.y > Gfx.frameSize.y) {
			this.velocity.y = -this.velocity.y;
		}
		this.sprite.updatePosition(this.position, this.size, this.angle);
	}
	void draw(SpriteRenderer renderer) {
		renderer.draw(this.sprite);
	}
}
```

こんな感じです。
これを動かすと↓の画面になります。

![ss.png](http://nsplus.dojin.com/ueshita/blogimg/ss.png)

##作るにあたって

gdcとか今後iOSやAndroidの対応をする噂があるみたいなのでグラフィックスには
クロスプラットフォームなOpenGL ES 2.0を採用します。

[Wikipedia](http://ja.wikipedia.org/wiki/OpenGL_ES)より

>OpenGL ES（OpenGL for Embedded Systems）は、3Dコンピューターグラフィックス用 API である OpenGL のサブセットであり、主に携帯電話などの組み込みシステムで広く使用される。iOSやAndroid 、Symbian OSなどの携帯端末向けオペレーティングシステムで採用されているほか、プレイステーション3やニンテンドー3DSにも採用されており、近年ではゲーム開発での使用が注目される。OpenGL と同様にクロノス・グループによって管理されている。

OpenGL ES 2.0のAPIはだいたいOpenGLにも存在します。
PCやMac等でも同じようなグラフィックス表現が可能です。

……と言いたいところですが、WindowsはOpenGLがボロボロなので、[ANGLE](http://code.google.com/p/angleproject/)という
OpenGL ES 2.0のAPIとシェーダをDirectXに変換するGoogle先生のライブラリを使用しています。


##作った

###コア部分
必要最低限。
DirectXほどじゃないにしろ、OpenGLを使えるようにするのは結構手間なので、
簡単に初期化してすぐゲーム制作できるようになっています。

###SpriteRenderer
![sprite.png](http://nsplus.dojin.com/ueshita/blogimg/sprite.png)
↑こんな画像から一部を切り出して大量に描画するためのシステムです。

###Image, Texture
画像を読み込んでテクスチャ化します。
PNGに対応。BMPとJPGにも対応予定。

##これから作る
###Input
なんと現状入力システムが無く、このままだとゲームが作れないので最優先で作ります！

###Audio
音が無いとゲームとは言えませんね。近日中に作る予定です。
WavとOggあたりに対応しておけば問題無い？

###SimpleFontRenderer
あらかじめ画像に描きだされた
スプライトフォントを描画する機能です。

###FontRenderer
シンプルじゃないフォント描画機能です。
FreeTypeを使ってTTFから書きます。日本語を表示するには必須です。

###TileRenderer
いわゆるマップチップをタイル状に配置するやつです。2D支援系ですね。

###GUI
ゲームGUI作成支援機能です。
イベントドリブンにスマートに作りたいですね（願望

###3D
がんばる。

###Mac対応
そのうち。

###スマフォ対応
コンパイラが対応したら本気出す。

##まとめ
以上。instant.dの軽い紹介でした。

まだ全然出来上がっていないものをいきなり公開してしまっていいものか考え物ですが、
生暖かい目で見守っていただければ幸いです。

今後は他のエンジン（enchant.js、Unity、XNAなど）から良さそうなところを真似して、
どんどん便利にしていきたいです。
とりあえず、年末のイベントまでに1本ゲームが作れたらいいなと思っています。

9日目は[@youxkei](http://qiita.com/users/youxkei)さんです。すでに投稿されていますね…。