使用相机变换,同时避免在spriteBatch.draw()调用中缩放y轴



我正在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参数。我的问题有两个:

  1. 如何避免必须传递此缩放参数/调用spriteBatch的最长形式。Draw()(有点违反DRY,尽管我想我可以把它包起来)
  2. 我做错了什么吗(不是"它不会出错",但"这是错误的做法问题"错了"?我看到提到了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)。

回答您的问题:

  1. 最后,您很可能需要调用最长形式的spriteBatch。Draw(),因为它提供了大多数操作精灵的选项——这很可能是您以后需要的。所以这不是问题,但是负比例似乎不是绘制精灵的正确方式
  2. 您正在使用正确的方法在2D中使用相机变换绘制精灵,然而,正如我之前提到的,变换本身似乎不正确

第页。S.不要在draw调用中加载内容(content.load<Texture2D>("whiteSquare")),尽管它是缓存的,不会每次都加载,但你仍然不应该这样做。

最新更新