ミニDTL.xna “ゲームはイチニチ30分まで!” 第7回

by key

ミニDTL.xnaその7です。

前回見た目の変化がなかったので、今回はそこを意識しました。


MiniDTL.xna (7)

背景を付けました

background.png

background.png

640*480の背景画像(仮)を描きました。いままでで一番の力作です。

スクロールの実装を始めました

いままでどんなゲームを作るか考えておらず、まだあまり定まっていないのですが、少々やりたいことが出てきたので、深く考えず実装していきます。

Fighterクラスにfloat ScrollPositionを作り、毎フレーム増やしていきます。

このScrollPositionはWorld.Drawの引数として渡し、さらにその中で各要素のDrawにも渡されます。もちろんWorld.fighter1.ScrollPositionでも取得できるのですが、これは将来1フレームでWorldの複数の位置をDrawしたくなったときのための布石です。

背景をスクロール位置に応じて動かすように

そのまんまです。背景画像の2回の描画で画面を覆っています。

  1. Vector2 backgroundPos = new Vector2(0, scrollPosition % background.Height);
  2. spriteBatch.Draw(background, backgroundPos, Color.White);
  3. backgroundPos.Y -= background.Height;
  4. spriteBatch.Draw(background, backgroundPos, Color.White);

Rトリガーを引いている間はスクロールが早くなるように

急いで飛ぶことができます。面白いかどうかは作ってみないとなんとも。

  1. if (gamePadState.Triggers.Right > 0.5f) {
  2.     ScrollPosition += 5;
  3.     Position.Y -= 5;
  4. } else {
  5.     ScrollPosition += 1;
  6.     Position.Y -= 1;
  7. }

Positionをスクロールに応じて減らすことで、画面から取り残されないようにしています。

各要素のPositionがステージ中の座標を表すように

いままではFighter、EnemyなどのPositionはスクリーン中の座標を表していました。

今後はスクロールを導入するため、「ステージ中の座標」と「スクリーン中の座標」を分けるようにしました。以前からあったPositionプロパティはステージ中の座標を表します。描画に使うためのdrawDestの計算は、Positionと(Draw時に渡される)
scrollPosition引数から算出するようにしました。

全クラスに修正することで、弾の発射や当たり判定などの動作が正しく動くようになりました。

他、弾のライフタイムの設定や若干のリファクタリングを行って30分完了。

今日の感想

  • 初めてゲーム内容にひねり(ちょっと変わったスクロールだけですが)を加えてみました。どんなゲームになるのかはあまり見えていません。
  • 今回は20人以上の人が見てくれていました!PM11:00ごろに行ったのが良かったのかな。

ではまた!

タグ: , , ,

コメント / トラックバック 1 件

  1. XNA Today » ミニDTL.xna 第7回 より:

    [...] ミニDTL.xna “ゲームはイチニチ30分まで!” 第7回 [...]

コメントをどうぞ