XNA 2D将世界位置转换为屏幕位置

时间:2011-12-23 10:13:33

标签: xna position screen 2d

好的伙计们,我花了两周的时间试图解决这个问题。我已经尝试了一些自己的方法来单独用数学来解决这个问题并且没有成功。我也到处寻找并看到人们推荐Viewport.Project()

这不是那么简单。我看过的每个地方,包括MSDN领域和所有论坛,只是建议能够使用它但是当我尝试使用它时,它们不解释它需要工作的矩阵和值。我没有找到关于如何正确使用这种方法的有用信息,这严重让我感到疯狂。请帮助这个可怜的家伙。

我要做的第一件事是发布我当前的代码。我有五个左右的不同版本,但没有一个有效。我得到的最接近的是NAN,我不明白。我试图根据小行星的位置在屏幕上显示文字,如果它们很远,文本将作为指导,玩家可以去小行星。

Vector3 camLookAt = Vector3.Zero;
Vector3 up = new Vector3(0.0f, 0.0f, 0.0f);

float nearClip = 1000.0f;
float farClip = 100000.0f;
float viewAngle = MathHelper.ToRadians(90f);
float aspectRatio = (float)viewPort.Width / (float)viewPort.Height;

Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 0), camLookAt, up);
Matrix projection = Matrix.CreatePerspectiveFieldOfView(viewAngle, aspectRatio, nearClip, farClip);

Matrix world = Matrix.CreateTranslation(camPosition.X, camPosition.Y, 0);

Vector3 projectedPosition = graphicsDevice.Viewport.Project(new Vector3(worldPosition.X, worldPosition.Y, 0), projection, view, Matrix.Identity);

screenPosition.X = projectedPosition.X;
screenPosition.Y = projectedPosition.Y;


if (screenPosition.X > 400) screenPosition.X = 400;
if (screenPosition.X < 100) screenPosition.X = 100;
if (screenPosition.Y > 400) screenPosition.Y = 400;
if (screenPosition.Y < 100) screenPosition.Y = 100;
return screenPosition;  

据我所知,Project是相机的位置。我的游戏是2D所以vector3很烦人我想也许我的Z可能是CameraZoom,投影可能是我们要转换为2D屏幕的对象,视图可能是相机可以看到多少的大小,最后一个我是不确定。

在搜索信息后大约2周没有可能的代码或知识方面的改进,并且在看MDSN教程时更加困惑我决定发布一个问题,因为我非常接近于没有实现世界位置转换屏幕位置。感谢所有帮助谢谢:)

另外我正在使用2D游戏,当大多数时候人们谈论Z轴时,当2D游戏没有Z轴时它确实会增加混乱,只是变换精灵看起来像缩放或移动。再次感谢:)

1 个答案:

答案 0 :(得分:0)

我可能在这里误会,但我认为您不需要使用XNA提供的3D相机进行2D游戏。除非您尝试使用3D制作某种视差系统或其他任何类型的2.5D游戏,否则您根本不需要使用它。看看这些:

2D Camera Implemetation in XNA

Simpler 2D Camera

XNA 2D tutorials

XNA中的2D与3D不同。您无需担心3D视口或3D相机或任何其他问题。没有近距离或远距离滑动。 2D在XNA中处理得很好,我认为你对XNA的工作方式有些误解。

PS:您不需要使用Vector3s。相反,使用Vector2s。我想你会发现它们在2D游戏中更容易使用。 ^^