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

by key

その後外出したので記事が遅くなってしまいましたが、昨日に引き続きミニDTL.xnaをやりました。

今回の内容は以下の通り。


Mini DTL.xna (2)

Xbox 360のゲームパッドで画像を動かせるようにする

Xbox 360の有線コントローラは、Windows機につなぐだけで普通に使えます。

書き換えたコードは、前回Updateメソッド中で三角関数を使った部分を

  1. gamePadState = GamePad.GetState(PlayerIndex.One);
  2. syoboPos.X += gamePadState.ThumbSticks.Left.X * 10.0f;
  3. syoboPos.Y -= gamePadState.ThumbSticks.Left.Y * 10.0f;

たったこれだけ。簡単ですね。gamePadState変数はGamePadState型で宣言しておきます。

最初両方 += にしていたのですが、入力のY方向と2DスクリーンのY方向が逆らしく、上下反対の動きになってしまいました。そのためYだけ -= にしてあります。

自弾の絵を描く

例によってペイントで描きました。ちなみに僕はFireworksが大好きなのですが、ミニDTL.xnaを見た人が真似しやすいように、なるべく標準搭載のソフトで進めようと思います。

というのはタテマエで、良いツールを使うと絵が描けないのがばれるからです。

shot.png

shot.png


と思ったら、Vistaのペイントって透過画像作れないんですね。ギャー。

自弾クラスを作る

ソリューションエクスプローラで[追加]-[既存の項目]でクラスを選んでShot.csを作ります。

  1. namespace MiniDTL {
  2.     class Shot {
  3.         private static Texture2D texture;
  4.         public Vector2 Position;
  5.         public Shot() {
  6.         }
  7.         public void Update(GameTime gameTime) {
  8.             Position.Y -= 15.0f;
  9.         }
  10.         public void Draw(SpriteBatch spriteBatch, GameTime gameTime) {
  11.             spriteBatch.Draw(texture, Position, Color.White);
  12.         }
  13.         public static void LoadContent(ContentManager content) {
  14.             texture = content.Load<Texture2D>("shot");
  15.         }
  16.     }
  17. }

MとかVとか、こまけぇこたぁいいんだよ!!(AA略) 30分しかないしね。

usingほにゃららは、Game1.csのをまるっと持ってきて問題ないです。

自弾クラスのContent読み込み

Game1クラスのLoadContentメソッド中で

  1. Shot.LoadContent(Content);

さっき作ったShotのLoadContentを呼びます。

自弾の配列を用意

Shot型を格納するListを作ります。ジェネリクスというやつですね。AS3の人はVector.<Shot>だと思ってください。

  1. List<Shot> shots;

しばらくC#を触っていなかったので、Shot[] shots;とか普通に配列を使おうとしておりました。こんな僕でもゲーム作れるよ!

Initializeメソッド中で忘れずにインスタンス作ります。

  1. shots = new List<Shot>();

というか、実際これを忘れてて2回もNull Reference Exceptionを出しました。ゆるい。

ボタンが押されたら自弾を出す

Updateメソッド中に

  1. if (gamePadState.Buttons.A == ButtonState.Pressed) {
  2.     Shot shot = new Shot();
  3.     shot.Position.X = syoboPos.X;
  4.     shot.Position.Y = syoboPos.Y;
  5.     shots.Add(shot);
  6. }

新しいShotインスタンスを作って、自機の座標に合わせて、Listに追加しています。

自弾を更新する

Updateメソッド中に

  1. foreach (Shot shot in shots) {
  2.     shot.Update(gameTime);
  3. }

後はShotクラスに任せます。今のところ15.0f上に移動させています。

自弾を描画する

Drawメソッド中に

  1. foreach (Shot shot in shots) {
  2.     shot.Draw(spriteBatch, gameTime);
  3. }

こちらも同じく、後はShotクラスに任せています。

ちょうどここで30分経過。

毎回新しいShotインスタンスを作る上に、画面から出てもListには残り続けるので、もう少し丁寧に作る必要がありますが、ざっくりこんな感じで自機が弾を撃てるようになりました。

今回の感想ですが、30分あればもう少し多くのことができると思ってたのですが、言語+環境に慣れないとこんなものかも。9/12のイベント本番までにゲームの形になりますように。

あとSaqooshaさんがlivestream procasterが良いよと教えてくれたので、次回試してみようと思います。ありがとー!

タグ: , , ,

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

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

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

コメントをどうぞ