ミニDTL.xna “ゲームはイチニチ30分まで!” 第5回
ミニDTL.xnaその5です。
これは月曜日の配信分のまとめ記事です。
Mini DTL.xna (5)
こんなことをやりました。
自弾発射をFighterクラスに任せる
今までは、せっかくFighterクラスでコントローラの面倒をみていたのにList
さすがにそれではGame1側が複雑になってしまうので、Fighter.UpdateにList
Fighter.Updateの定義を
- public void Update(GameTime gameTime, List<Shot> shots)
として、その中に
- if (shotButtonState > 0) {
- if (shotButtonState % 4 == 1) {
- Shot shot = new Shot();
- shot.Position.X = Position.X;
- shot.Position.Y = Position.Y;
- shots.Add(shot);
- }
- }
を入れました。ついでにShotButtonStatesをprivateにしました。
が、さすがにデータを素手で扱ってる感が強くなってまいりました。次回はここを作り直したい。
敵に敵弾を発射させる
同じ要領で、EnemyにEnemyShot(前回半分ぐらい作ってた)を撃たせるようにしました。
敵弾を自機に向かって発射する
自弾は真上に向かって飛ばしていますが、敵弾はそれだとつまらないので速度ベクトルを作り
- public Vector2 Speed;
毎フレームその速度で移動させるようにしました。
- Position += Speed;
Enemyクラス側では、弾の発射時に敵と時機の位置関係を計算し、EnemyShot.Speedを設定するようにしています。
- if (rand.NextDouble() < 0.02) {
- EnemyShot enemyShot = new EnemyShot();
- Vector2 relPos = fighter.Position - Position;
- relPos.Normalize();
- relPos.X *= 5;
- relPos.Y *= 5;
- enemyShot.Position.X = Position.X;
- enemyShot.Position.Y = Position.Y;
- enemyShot.Speed.X = relPos.X;
- enemyShot.Speed.Y = relPos.Y;
- enemyShots.Add(enemyShot);
- }
これを行うため、Enemy.UpdateにはList
- public void Update(GameTime gameTime, List<EnemyShot> enemyShots, Fighter fighter)
やはり、この構造は気持ち悪いです。
爆発エフェクトの実装
例によってペイントで絵を描きました。
全然爆発に見えない。追々描きなおします。
ExplosionEffectクラスを作り、Game1クラスに対応するリストを作ります。
- List<ExplosionEffect> effects;
ExplosionEffectのListなのに名前がeffectsなのは、そのうち基底クラスEffectを作りたいからです。この手のTODOは次回一気に回収したいですね。
後はいつも通りLoadContentして、リストへの追加、リスト内での更新、リストからの削除、リストの描画を行います。
リストからの削除条件ですが、いつも通りのDestroyedを以下のようにtrueにしています。
ExplosionEffectのUpdateで
- public void Update(GameTime gameTime) {
- count++;
- drawDest.Width = drawDest.Height = count * 3;
- drawDest.X = (int)(Position.X - drawDest.Width * 0.5);
- drawDest.Y = (int)(Position.Y - drawDest.Height * 0.5);
- if (count > 30) {
- Destroyed = true;
- }
- }
ついでに、drawDestの大きさをcountにあわせてみました。爆発がのろーりと広がります。
30分経過してしまったのでここまで。
今日の感想
- 構造の汚さが限界を超えてしまいました。次回はリファクタリングDayにしたいと思います。ゲームの要素的な進歩はなくなってしまいますが、ご了承ください。
タグ: DeskTopLive, desktoplivexna, MiniDTL, XNA

2009 年 8 月 25 日 11:02 PM
[...] ミニDTL.xna “ゲームはイチニチ30分まで!” 第5回 [...]