ミニDTL.xna “ゲームはイチニチ30分まで!” 第10回
ミニDTL.xnaその10です。
8/30の分です。この日は自宅からノートPCで配信しました。
キーボードに対応する
有線コントローラを会社に置いてきてしまったので、ゲームが動かせない!ピンチ!
ということは全くなく、さくっとキーボードでも遊べるようにしました。
まず移動。
- KeyboardState keyboardState = Keyboard.GetState();
- if (keyboardState.IsKeyDown(Keys.Right)) {
- Position.X += 5.0f;
- }
- if (keyboardState.IsKeyDown(Keys.Left)) {
- Position.X -= 5.0f;
- }
- if (keyboardState.IsKeyDown(Keys.Down)) {
- Position.Y += 5.0f;
- }
- if (keyboardState.IsKeyDown(Keys.Up)) {
- Position.Y -= 5.0f;
- }
実行して確認。ちゃんと動いてます。
ショットボタンの判定も
- if (gamePadState.Buttons.A == ButtonState.Pressed || keyboardState.IsKeyDown(Keys.Z)) {
- }
他、ゲームの終了もEscでできるようにしました。
さて、ここまでで7分。まだまだ時間があるので、大ネタに取り掛かってみました。
3Dレンダリング
今まではSpriteBatchを使ってPNGを表示していましたが、そろそろ3Dの機能を使ってみます。
といってもいきなりモデルデータを使うのではなく、コード中に頂点座標を書いた、単純な図形からです。
使う変数の宣言。
- private static VertexPositionColor[] data;
- private static VertexDeclaration vertexDecl;
- private static BasicEffect effect;
ここら辺は素人なので詳しくないのですが、グラフィックデバイスに送るデータフォーマットは一種類ではなく、用意された複数の形式(そして多分独自形式も?)から選べるため、データと一緒にそのデータの構造も知らせてやる必要があるようです。
今回選んだのは、頂点ごとの座標と色を保持するVertexPositionColorです。
VertexDeclaration型のvertexDeclは、選んだVertexPositionColorの構造を入れるのに使うと思われます。
またBasicEffectはあんまり理解していません。ありがちなパラメータを設定してやることで、シェーダを自前で書くのを肩代わりしてくれるものだと思っています。
さて、LoadContentで
- effect = new BasicEffect(graphicsDevice, null);
- effect.VertexColorEnabled = true;
- vertexDecl = new VertexDeclaration(graphicsDevice, VertexPositionColor.VertexElements);
- data = new VertexPositionColor[] {
- new VertexPositionColor(new Vector3(-16, +16, 0), Color.Blue),
- new VertexPositionColor(new Vector3(+16, +16, 0), Color.Blue),
- new VertexPositionColor(new Vector3( 0, -16, 0), Color.Blue),
- };
effectを作って頂点色を有効にしています。
vertexDeclに、VertexPositionColorの各頂点にはこういうもの(座標と色)が入ってるよーという宣言を入れています。
dataに頂点情報をハードコーディング。青い頂点が3つだけです。
で、これを描画。
- graphicsDevice.VertexDeclaration = vertexDecl;
- effect.Projection = Matrix.CreatePerspectiveFieldOfView((float)(Math.PI / 4), graphicsDevice.Viewport.AspectRatio, 0.01f, 1000.0f);
- effect.View = Matrix.CreateLookAt(new Vector3(0, 0, 500), Vector3.Zero, Vector3.Up);
- effect.World = Matrix.CreateTranslation(Position.X, Position.Y + ScrollPosition, 0);
- effect.Begin();
- foreach (EffectPass pass in effect.CurrentTechnique.Passes) {
- pass.Begin();
- graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, data, 0, 1);
- pass.End();
- }
- effect.End();
グラフィックデバイスに、これから描画する頂点データの形式を伝えます。
BasicEffectのWorld, View, Projectionを設定します。まだ適当です。
あとは慣用句です。テクニックとかパスとか登場しますが、まだ理解していません。
graphicsDevice.DrawUserPrimitivesのパラメータだけ自分で考える必要があります。この場合は、「3頂点ごとに三角形を描くルール」「頂点の配列」「配列の先頭から」「1個の三角形を」という指定です。

三角形が出るようになった!
あまり深く考えて作っていないので、自機がでたらめに動いています。次回はゲーム内の座標系をしっかり考える必要がありそうです。
ではまた。
タグ: DeskTopLive, desktoplivexna, MiniDTL, XNA
2009 年 9 月 7 日 11:57 PM
[...] ミニDTL.xna “ゲームはイチニチ30分まで!” 第10回 [...]