1

David Amador からのこれら 2 つのサンプルを組み合わせようとしています。

http://www.david-amador.com/2010/03/xna-2d-independent-resolution-rendering/

http://www.david-amador.com/2009/10/xna-camera-2d-with-zoom-and-rotation/

マウス座標を取得するのに苦労していることを除けば、すべて正常に動作しています。個々のサンプルごとにそれらを取得できましたが、両方を考慮に入れるための私の計算は間違っているようです.

仮想解像度と通常の解像度が同じであれば、マウスの座標は正しいです。Resolution.SetVirtualResolution(1920, 1080) や Resolution.SetResolution(1280, 720, false) のようなことをすると、カメラを動かすと座標がゆっくりと同期しなくなります。

コードは次のとおりです。

    public static Vector2 MousePositionCamera(Camera camera)
    {
        float MouseWorldX = (Mouse.GetState().X - Resolution.VirtualWidth * 0.5f + (camera.position.X) * (float)Math.Pow(camera.Zoom, 1)) /
            (float)Math.Pow(camera.Zoom, 1);

        float MouseWorldY = ((Mouse.GetState().Y - Resolution.VirtualHeight * 0.5f + (camera.position.Y) * (float)Math.Pow(camera.Zoom, 1))) /
        (float)Math.Pow(camera.Zoom, 1);

        Vector2 mousePosition = new Vector2(MouseWorldX, MouseWorldY);
        Vector2 virtualViewport = new Vector2(Resolution.VirtualViewportX, Resolution.VirtualViewportY);
        mousePosition = Vector2.Transform(mousePosition - virtualViewport, Matrix.Invert(Resolution.getTransformationMatrix()));

        return mousePosition;     
    }

解決策として、これを追加しました:

virtualViewportX = (_Device.PreferredBackBufferWidth / 2) - (width / 2);
virtualViewportY = (_Device.PreferredBackBufferHeight / 2) - (height / 2);

それ以外はサンプルコードと同じです。前もって感謝します!

4

1 に答える 1

2

David Gouveia のおかげで、問題を特定することができました... 私のカメラ行列は間違った計算を使用していました。

同様のことをしようとしている人を助けることを期待して、すべてのコードを投稿します。

カメラ変換行列:

        public Matrix GetTransformMatrix()
        {
            transform = Matrix.CreateTranslation(new Vector3(-position.X, -position.Y, 0)) * Matrix.CreateRotationZ(rotation) *
                        Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) * Matrix.CreateTranslation(new Vector3(Resolution.VirtualWidth
                            * 0.5f, Resolution.VirtualHeight * 0.5f, 0));

            return transform;
        }

これにより、カメラも中央に配置されます。Resolution クラスと Camera クラスの両方を組み合わせてマウス座標を取得する方法は次のとおりです。

    public static Vector2 MousePositionCamera(Camera camera)
    {
        Vector2 mousePosition;
        mousePosition.X = Mouse.GetState().X;
        mousePosition.Y = Mouse.GetState().Y;

        //Adjust for resolutions like 800 x 600 that are letter boxed on the Y:
        mousePosition.Y -= Resolution.VirtualViewportY;

        Vector2 screenPosition = Vector2.Transform(mousePosition, Matrix.Invert(Resolution.getTransformationMatrix()));
        Vector2 worldPosition = Vector2.Transform(screenPosition, Matrix.Invert(camera.GetTransformMatrix()));

        return worldPosition;     
    }

私が投稿/言及した他のすべてのコードと組み合わせると、解像度の独立性と素晴らしいカメラを実現するために必要なものはこれだけです!

于 2013-01-19T19:57:20.897 に答える