鼠标位置为世界位置。和鼠标位置屏幕重新缩放世界位置

时间:2015-07-05 11:31:01

标签: c# matrix xna

所以我使用相机(View Matrix)来移动瓷砖世界。 在XNA(MONOGAME)

我使用以下代码获取原始鼠标位置:

MouseState ms = Mouse.GetState();
Vector2 mousePosition = new Vector2(ms.X, ms.Y);

现在,如果我将X除以TILE_WIDTH而将Y除以TILE_WIDTH,它会给我一个可以从我的数组中取出的图块。但是一旦我移动矩阵,它就会抵消。如何将世界偏移量添加到鼠标位置?

还有另一个问题。当我重新调整窗口大小时。鼠标会偏移更多。无论如何解决这个问题。那么它可以在全屏窗口中以鼠标可以转换为worldPosition的任何分辨率窗口工作吗?

我的渲染:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, c2d.get_transformation(GraphicsDevice));
spriteBatch.End();

我的观点矩阵:

    public Matrix get_transformation(GraphicsDevice graphicsDevice)
    {
        _transform =       // Thanks to o KB o for this solution
          Matrix.CreateTranslation(new Vector3(-_pos.X, -_pos.Y, 0)) *
                                     Matrix.CreateRotationZ(Rotation) *
                                     Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) *
                                     Matrix.CreateTranslation(new Vector3(graphicsDevice.Viewport.Width * 0.5f, 
                                     graphicsDevice.Viewport.Height * 0.5f, 0));
        return _transform;
    }

我的获取方式:

 tile[(int)worldPosition.Y / TILE_SIZE, (int)worldPosition.X /  TILE_SIZE].color = Color.Red;

我尝试过的事情:

Vector2 worldPosition = Vector2.Transform(mousePosition, Matrix.Invert(viewMatrix));

https://gamedev.stackexchange.com/questions/21681/how-to-get-mouse-position-relative-to-the-map

TL; DR

即使重新调整窗口大小,我如何在世界视图中显示鼠标位置移动我的camera2D,Zoom,X,Y。

1 个答案:

答案 0 :(得分:2)

您需要将矩阵“取消应用”到鼠标位置。要做到这一点,首先必须反转矩阵:

Matrix inverseTransform = Matrix.Invert(_transform);

之后,您可以像这样转换鼠标矢量:

Vector2 mouseInWorld = Vector2.Transform(new Vector2(ms.X, ms.Y), inverseTransform);