続 イテレータでマイクロスレッドもどき
一昨日作った「C# 2.0 のイテレータでマイクロスレッドもどき」、やっぱりぱっと見れるデモが欲しいよなぁってことで、XBAP 化してみた。
http://ufcpp.net/study/csharp/demo/FullBullet/FullBullet.xbap
.NET Framework 3.0 が入ってる環境なら見れるはず。
あと、いろいろと整理。
まず、プロジェクトを3つに分割。
- MicroThread … マイクロスレッド関係のコードだけ抜き出してコンポーネント化。
- Shooting2D … シューティングゲーム風のスクリーン(WPF ユーザコントロール)。
- FullBullet … 具体例。完成物。
敵とか弾もちょっとまともな動きするように修正。
例えば、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 はフロントミッションのスキル(全弾打ちつくし)から。