c# - 使用 viewmatrix 移动二维对象

标签 c# xna 2d

我正在开发一款基于二战中军队行动的小游戏。我首先开始制作一个相机来环顾四周,然后我编写了一个程序来慢慢地将一个排移动到我点击的地方,然后如果它在那里就停下来。直到那里一切正常,但后来我试图在移动相机的同时让它工作,所以矩阵不是标准矩阵。我还没有把这个排调到正确的工作地点。 如果有人能告诉我我必须做什么才能使其正常工作,我将不胜感激

移动代码:

    public void Update(MouseState mouse, GameTime gameTime,Matrix matrix)
    {

        if (mouse.LeftButton == ButtonState.Pressed)
        {
            mousePos = new Vector2(mouse.X, mouse.Y);
            Vector2.Transform(mousePos, matrix);
            oldPos = testObjPos;
            Vector2.Transform(oldPos, matrix);
            Difference = mousePos - oldPos;

            Difference.Normalize();
        }
        testObjPos += Difference * (float)gameTime.ElapsedGameTime.TotalSeconds * 20;
        if (testObjPos.X > mousePos.X - 1 && testObjPos.X < mousePos.X + 1 &&
            testObjPos.Y > mousePos.Y - 1 && testObjPos.Y < mousePos.Y + 1)
            Difference = new Vector2(0, 0);

    }

也许我的相机类是问题所在 相机代码

    float moveSpeed = 300;
    Vector2 position;
    Matrix viewMatrix;
    int screenwidth, screenheight;
   public void Update(KeyboardState keyState, GameTime gameTime)
    {
        if (keyState.IsKeyDown(Keys.W))
            position.Y -= moveSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
        if (keyState.IsKeyDown(Keys.S))
            position.Y += moveSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
        if (keyState.IsKeyDown(Keys.A))
            position.X -= moveSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
        if (keyState.IsKeyDown(Keys.D))
            position.X += moveSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
        if (position.X < -1000)
            position.X = -1000;
        if (position.Y < -1000)
            position.Y = -1000;
        if (position.X > 1000)
            position.X = 1000;
        if (position.Y > 1000)
            position.Y = 1000;
        viewMatrix = Matrix.CreateTranslation(new Vector3(-position, 0));
    }

感谢您花时间查看它。

最佳答案

我假设 matrix 是您的 View 矩阵。该矩阵用于将位置从世界空间转换到相机空间。

您的鼠标位置在 View 空间中,您希望将其转换为世界空间,因此采用另一种方式。因此,您需要 matrix 的逆矩阵。此外,Vector2.Transform() 方法返回转换后的向量。它不会改变原来的。所以现在,您不使用任何转换后的位置:

var invMatrix = Matrix.Invert(matrix);
mousePos = Vector2.Transform(mousePos, invMatrix);

您可能不想转换 oldPos,因为它已经在世界空间中(可能,我无法从代码片段中明确判断)。

顺便说一句,有一种更简单的方法可以检查 testObjPos 是否靠近 mousePos。只需检查差异向量的长度:

if((testObjPos - mousePos).Length() < 1)
    //stop

关于c# - 使用 viewmatrix 移动二维对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38495889/

相关文章:

c# - 如何在 C# 中读取 .wav 文件的比特率

c# - 泛型类型值和 '==' 关键字的 'default' 运算符的行为是什么?

c# - 2D Passes.apply() XNA 4.0

Java 小程序 : is there a simple way to draw and erase in a two-layered 2D scene?

2d - 什么类型的速度-时间曲线模拟在水平表面上滑动到停止的物体?

c# - 自定义消息弹出 WPF

c# - 如何查看 .NET IServiceProvider 可以提供的所有服务?

c# - 在Windows Phone 7上,如何在音频效果中使用压缩音频?

c# - 圆上的点按角度分布不均匀

c++ - ArrayFire异常(输入类型不同)