我正在创建一个2D平台型游戏在XNA。
我目前有一个相机对象,它有一个位置/旋转/缩放级别,用于生成传递给SpriteBatch.Begin()的转换矩阵。这允许我在游戏坐标中绘制,而不是屏幕坐标。
相机代码的相关部分:
public Matrix GetViewMatrix() {
cameraMatrix = Matrix.CreateScale(new Vector3(1f, -1f, 1f))
* Matrix.CreateTranslation(position.X, position.Y, 0f)
* Matrix.CreateScale(new Vector3(zoom,zoom,1f))
* Matrix.CreateRotationZ(rotation)
* Matrix.CreateTranslation(new Vector3(screenWidth*0.5f,screenHeight*0.5f,0));
return cameraMatrix;
}
它的用法如下:
spriteBatch.Begin(SpriteSortMode.BackToFront, null, null, null,
null, null, camera.GetViewMatrix());
//Draw Stuff
spriteBatch.End();
问题是,为了真正绘制任何东西,当我调用spriteBatch.Draw()时,我必须缩放(1,-1),否则我相信纹理会被裁剪得很深。
spriteBatch.Draw(content.Load<Texture2D>("whiteSquare"), Vector2.Zero, null,
Color.White, 0f, Vector2.Zero,
new Vector2(1f, -1f),
SpriteEffects.None,0f);
注意最后一个示例第3行中的向量缩放参数。我的问题有两个:
非常感谢。
编辑:在重新阅读我的帖子和第一个答案/评论之后,我认为我对这个问题的思考是错误的。
我其实不想在游戏中画坐标。我想要的是,能够指定并使用游戏坐标,这样的方式是,正y轴向上,1单位游戏距离等于1米,等于多少屏幕像素,以确保您总是查看(例如)从左边框到视图端口右边框的10米游戏距离。
初步的实验让我相信,将世界转换矩阵传递给spriteBatch.begin()方法是解决这一问题的方法,但现在我认为这可能要复杂一些。有人对实现上述目标有什么建议吗?我见过示例代码,其中每个可绘制实体都实现了一个基于当前实体位置/等等的世界转换矩阵附带的可绘制接口,但是我在哪里使用这样的矩阵呢?是否为每个可绘制实体分离spriteBatch.Begin()/End()调用?
很抱歉,如果这是一个不完善的问题,甚至试图把我的头脑围绕目标的概念是很困难的。
发布于 2014-04-15 16:58:34
是的,你做错了。您正在尝试更改框架的2d坐标系,其原点位于左上角(在directX中遵循纹理坐标约定)。你被允许做出这种改变,权衡的是你必须一直这样做,每次平局。因为这是你似乎不喜欢的,你可能会认为这个缺点太大了。
取决于您对平台代码的理解程度,停止这种努力并“随心所欲”可能为时已晚。我想你们已经建立了一些物理和逻辑,需要y坐标来正向上。但是如果你能改变它(永远不要太晚重构!),那么你就不需要时时刻刻地改变一切。
编辑:我看到你已经有意识地做出了这个选择。你想在世界坐标下操作,而不是屏幕坐标。同样,这是一个很好的选择,但是Spritebatch
在屏幕坐标下工作。令人困惑。
你可以停止使用Spritebatch
。你可以相当容易地渲染世界空间四边形。您将忽略XNA的2d部分提供的其他批处理功能。但这只是更多的权衡考虑。
关于你的枯燥考虑:如果你只是不喜欢传递太多的参数,你可以考虑C#命名参数。它可以使您的方法调用更清晰。
https://gamedev.stackexchange.com/questions/73460
复制相似问题