我正在XNA中创建一个2D平台型游戏。
我目前有一个相机对象,带有一个位置/旋转/缩放级别,用于生成要传递给SpriteBatch的变换矩阵。开始()。这使我可以在游戏中绘制坐标,而不是屏幕坐标。
相机代码的相关位:
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时,我必须按(1,-1)缩放。Draw(),否则我相信纹理会被深度剔除。
spriteBatch.Draw(content.Load<Texture2D>("whiteSquare"), Vector2.Zero, null,
Color.White, 0f, Vector2.Zero,
new Vector2(1f, -1f),
SpriteEffects.None,0f);
请注意最后一个示例的第3行中的Vector scaling参数。我的问题有两个:
- 如何避免必须传递此缩放参数/调用spriteBatch的最长形式。Draw()(有点违反DRY,尽管我想我可以把它包起来)
- 我做错了什么吗(不是"它不会出错",但"这是错误的做法问题"错了"?我看到提到了viewport.Update()函数和Matrix.CreateOrthagonal等,但我不太确定使用它们是否比简单的自定义相机更简单/更好
非常感谢。
为什么使用Matrix。CreateScale(新矢量3(1f,-1f,1f))?如果你创建2d平台,创建相机变换的正确方法是:
Matrix.CreateTranslation(new Vector3(-Position.X, -Position.Y, 0))*
Matrix.CreateRotationZ(Rotation)*
Matrix.CreateScale(new Vector3(Zoom, Zoom, 1))*
Matrix.CreateTranslation(
new Vector3(
GraphicsDevice.Viewport.Width*0.5f,
GraphicsDevice.Viewport.Height*0.5f, 0));
使用此摄影机变换时,可以在精灵上使用默认比例(1;1)。
回答您的问题:
- 最后,您很可能需要调用最长形式的spriteBatch。Draw(),因为它提供了大多数操作精灵的选项——这很可能是您以后需要的。所以这不是问题,但是负比例似乎不是绘制精灵的正确方式
- 您正在使用正确的方法在2D中使用相机变换绘制精灵,然而,正如我之前提到的,变换本身似乎不正确
第页。S.不要在draw调用中加载内容(content.load<Texture2D>("whiteSquare")),尽管它是缓存的,不会每次都加载,但你仍然不应该这样做。