0

私のコードの一番上に追加しました:

Matrix rotation;
private float angleRightLeft = 0f;
private float angleUpDown = 0f;

コンストラクターで私がした:

rotation = Matrix.Identity;

Update メソッドでキーを呼び出します。

float timeDifference = (float)gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f;
ProcessInput(timeDifference);

draw メソッドでは、変数 angleRightLeft を使用して世界 (地形) を回転させます。

protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
            device.Clear(Color.Black);
            RasterizerState rs = new RasterizerState();
            rs.CullMode = CullMode.None;
            rs.FillMode = FillMode.WireFrame;
            device.RasterizerState = rs;
            //Matrix worldMatrix = Matrix.CreateTranslation(-terrainWidth / 2.0f, 0, terrainHeight / 2.0f);
            //worldMatrix = Matrix.CreateTranslation(-terrainWidth / 2.0f, 0, terrainHeight / 2.0f) * Matrix.CreateRotationY(angle);
            worldMatrix = Matrix.CreateFromAxisAngle(this.rotation.Left,angleRightLeft);
            worldMatrix = Matrix.CreateTranslation(-terrainWidth / 2.0f, 0, terrainHeight / 2.0f) * Matrix.CreateRotationY(angleRightLeft);
            effect.CurrentTechnique = effect.Techniques["ColoredNoShading"];
            effect.Parameters["xView"].SetValue(viewMatrix);
            effect.Parameters["xProjection"].SetValue(projectionMatrix);
            effect.Parameters["xWorld"].SetValue(worldMatrix);

            foreach (EffectPass pass in effect.CurrentTechnique.Passes)
            {
                pass.Apply();

                device.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3, VertexPositionColor.VertexDeclaration);
            }

私がした描画方法で:

worldMatrix = Matrix.CreateFromAxisAngle(this.rotation.Left,angleRightLeft);
worldMatrix = Matrix.CreateTranslation(-terrainWidth / 2.0f, 0, terrainHeight / 2.0f) * Matrix.CreateRotationY(angleRightLeft);

したがって、A(左)キーを押すと左に移動しますが、D をクリックすると右に曲がりません。これはキー プロセス メソッドです。

private void ProcessInput(float amount)
        {
            previousState = currentState;
            currentState = Mouse.GetState();
            Vector3 moveVector = new Vector3(0 , 0 , 0);
            KeyboardState keyState = Keyboard.GetState();
            if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W))
                //cameraPosition += new Vector3(0.0f, 50.0f, +100);


            if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S))
                //cameraPosition -= new Vector3(0.0f, 50.0f, +100);


            if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D))
                //cameraPosition += new Vector3(1, 0, 0);
                angleRightLeft += 0.05f;

            if (keyState.IsKeyDown(Keys.Left) || keyState.IsKeyDown(Keys.A))
                //cameraPosition += new Vector3(-1, 0, 0);
                angleRightLeft -= 0.05f;

            if (keyState.IsKeyDown(Keys.Q))
                cameraPosition += new Vector3(0, 1, 0);
            if (keyState.IsKeyDown(Keys.Z))
                cameraPosition += new Vector3(0, -1, 0);
            if (keyState.IsKeyDown(Keys.Escape))
            {
                this.graphics.PreferredBackBufferWidth = 800;
                this.graphics.PreferredBackBufferHeight = 600;
                this.graphics.IsFullScreen = false;
                this.graphics.ApplyChanges();
            }
            if (this.graphics.PreferredBackBufferWidth < 1920)
            {

                if (WasDoubleClick())
                {
                    changeScreenNode(this.graphics, 1920, 1080, true);
                }
            }

            if (WasMouseLeftClick())
            {
                previousClick = DateTime.Now;
            }
        }

この行を移動すると: angleRightLeft += 0.05f; DキーからWキーの下に置き、Aを押すと左に移動し、Wは右に移動します。

しかし、WとSをクリックすると世界が上下に移動し、AとDをクリックすると世界が左右に移動します。だから私は変数 angleUpDown を作成しましたが、世界を回転させる Draw メソッドに何か問題があります。

押されたキーに応じて動作するようにするにはどうすればよいですか?

4

1 に答える 1