繁体   English   中英

用viewmatrix移动对象2d

[英]Moving object 2d with viewmatrix

我正在开发一个基于ww2军队运动的小型游戏。 我第一次开始用相机环顾四周,然后我写了一个程序,慢慢地移动一个排在我点击的排,然后停在那里。 在那里UNTIL一切都很好,但后来我试图让它工作,同时移动相机,所以矩阵不是标准矩阵。 我没有把排的位置推到正确的位置去工作。 如果有人能告诉我我要做些什么才能让它发挥作用,我将不胜感激

搬家代码:

    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);

    }

也许我的相机类是Camera COde的问题

    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是你的视图矩阵。 该矩阵用于将位置从世界空间转换为相机空间。

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

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

您可能不希望转换oldPos,因为它已经存在于世界空间中(可能,我无法从代码片段中确切地说出来)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM