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