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

by key

ミニDTL.xnaその10です。

8/30の分です。この日は自宅からノートPCで配信しました。


MiniDTL.xna (10)

キーボードに対応する

有線コントローラを会社に置いてきてしまったので、ゲームが動かせない!ピンチ!

ということは全くなく、さくっとキーボードでも遊べるようにしました。

まず移動。

  1. KeyboardState keyboardState = Keyboard.GetState();
  2.  
  3. if (keyboardState.IsKeyDown(Keys.Right)) {
  4.     Position.X += 5.0f;
  5. }
  6. if (keyboardState.IsKeyDown(Keys.Left)) {
  7.     Position.X -= 5.0f;
  8. }
  9. if (keyboardState.IsKeyDown(Keys.Down)) {
  10.     Position.Y += 5.0f;
  11. }
  12. if (keyboardState.IsKeyDown(Keys.Up)) {
  13.     Position.Y -= 5.0f;
  14. }

実行して確認。ちゃんと動いてます。

ショットボタンの判定も

  1. if (gamePadState.Buttons.A == ButtonState.Pressed || keyboardState.IsKeyDown(Keys.Z)) {
  2. }

他、ゲームの終了もEscでできるようにしました。

さて、ここまでで7分。まだまだ時間があるので、大ネタに取り掛かってみました。

3Dレンダリング

今まではSpriteBatchを使ってPNGを表示していましたが、そろそろ3Dの機能を使ってみます。

といってもいきなりモデルデータを使うのではなく、コード中に頂点座標を書いた、単純な図形からです。

使う変数の宣言。

  1. private static VertexPositionColor[] data;
  2. private static VertexDeclaration vertexDecl;
  3. private static BasicEffect effect;

ここら辺は素人なので詳しくないのですが、グラフィックデバイスに送るデータフォーマットは一種類ではなく、用意された複数の形式(そして多分独自形式も?)から選べるため、データと一緒にそのデータの構造も知らせてやる必要があるようです。

今回選んだのは、頂点ごとの座標と色を保持するVertexPositionColorです。

VertexDeclaration型のvertexDeclは、選んだVertexPositionColorの構造を入れるのに使うと思われます。

またBasicEffectはあんまり理解していません。ありがちなパラメータを設定してやることで、シェーダを自前で書くのを肩代わりしてくれるものだと思っています。

さて、LoadContentで

  1. effect = new BasicEffect(graphicsDevice, null);
  2. effect.VertexColorEnabled = true;
  3. vertexDecl = new VertexDeclaration(graphicsDevice, VertexPositionColor.VertexElements);
  4. data = new VertexPositionColor[] {
  5.     new VertexPositionColor(new Vector3(-16, +16, 0), Color.Blue),
  6.     new VertexPositionColor(new Vector3(+16, +16, 0), Color.Blue),
  7.     new VertexPositionColor(new Vector3(  0, -16, 0), Color.Blue),
  8. };

effectを作って頂点色を有効にしています。

vertexDeclに、VertexPositionColorの各頂点にはこういうもの(座標と色)が入ってるよーという宣言を入れています。

dataに頂点情報をハードコーディング。青い頂点が3つだけです。

で、これを描画。

  1. graphicsDevice.VertexDeclaration = vertexDecl;
  2. effect.Projection = Matrix.CreatePerspectiveFieldOfView((float)(Math.PI / 4), graphicsDevice.Viewport.AspectRatio, 0.01f, 1000.0f);
  3. effect.View = Matrix.CreateLookAt(new Vector3(0, 0, 500), Vector3.Zero, Vector3.Up);
  4. effect.World = Matrix.CreateTranslation(Position.X, Position.Y + ScrollPosition, 0);
  5. effect.Begin();
  6. foreach (EffectPass pass in effect.CurrentTechnique.Passes) {
  7.     pass.Begin();
  8.     graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, data, 0, 1);
  9.     pass.End();
  10. }
  11. effect.End();

グラフィックデバイスに、これから描画する頂点データの形式を伝えます。

BasicEffectのWorld, View, Projectionを設定します。まだ適当です。

あとは慣用句です。テクニックとかパスとか登場しますが、まだ理解していません。

graphicsDevice.DrawUserPrimitivesのパラメータだけ自分で考える必要があります。この場合は、「3頂点ごとに三角形を描くルール」「頂点の配列」「配列の先頭から」「1個の三角形を」という指定です。

三角形が出るようになった!

三角形が出るようになった!

あまり深く考えて作っていないので、自機がでたらめに動いています。次回はゲーム内の座標系をしっかり考える必要がありそうです。

ではまた。

タグ: , , ,

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

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

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

コメントをどうぞ