続 イテレータでマイクロスレッドもどき

一昨日作った「C# 2.0 のイテレータでマイクロスレッドもどき」、やっぱりぱっと見れるデモが欲しいよなぁってことで、XBAP 化してみた。

http://ufcpp.net/study/csharp/demo/FullBullet/FullBullet.xbap

.NET Framework 3.0 が入ってる環境なら見れるはず。

あと、いろいろと整理。
まず、プロジェクトを3つに分割。

敵とか弾もちょっとまともな動きするように修正。

  • グラディウスの各面の最初に出てくる雑魚みたいな動きする敵。
  • 前から入ってきて、弾幕貼って逃げていく敵。
  • フェードイン → 全方向弾幕 → フェードアウトする敵。

例えば、1つ目の敵のソースコードは、動作に関係する部分だけ抜き出すと以下のような感じ。

protected override IEnumerator GetUpdater()
{
	return DoUntilOneEnd(this.Move(), this.Shoot());
}

IEnumerator Move()
{
	while (this.X >= 0)
	{
		this.X -= VX;
		yield return null;
	}

	while (this.X < screen.Width
		&& (top ? this.Y < this.screen.Height - LAST_Y : this.Y > LAST_Y))
	{
		this.X += VX;
		if (top)
			this.Y += VY;
		else
			this.Y -= VY;
		yield return null;
	}

	while (this.X >= 0)
	{
		this.X -= VX;
		yield return null;
	}
}

Random rnd = new Random();
const double BULLET_SPEED = 1;

IEnumerator Shoot()
{
	for (int i = 0; ; ++i)
	{
		if (i % 32 == 0)
		{
			double t = 2 * Math.PI * this.rnd.NextDouble();
			double vx = BULLET_SPEED * Math.Cos(t);
			double vy = BULLET_SPEED * Math.Sin(t);
			this.Manager.Add(new SimpleBullet(this.screen, this.X, this.Y, vx, vy));
		}
		yield return null;
	}
}

最後にビッグコアみたいなのも作るかどうか迷ったけど、さすがに面倒で。余裕見て追加するかも。
ちなみに、名前の FullBullet はフロントミッションのスキル(全弾打ちつくし)から。