在XNA vs Primitives中使用spritebatch负缩放

本文关键字:spritebatch 缩放 XNA vs Primitives | 更新日期: 2023-09-27 18:09:01

我在XNA项目中同时使用原语和精灵。我使用以下代码绘制原语(一个总结,而不是从我的项目中逐字逐句):

transmatrix = Matrix.CreateTranslation(v23(-pos)) * Matrix.CreateScale(scale, -scale, 1f) * Matrix.CreateTranslation(v23(offset));   
basicEffect.World = transmatrix;
basicEffect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up);
basicEffect.Projection = Matrix.CreateOrthographicOffCenter(0, (float)GraphicsDevice.Viewport.Width, (float)GraphicsDevice.Viewport.Height, 0, 1.0f, 1000.0f);
basicEffect.Begin();
//draw primitives blah blah
basicEffect.End();
 spritebatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.None, transmatrix);
//draw sprites blah blah
spritebatch.end()

如果我有

transmatrix = Matrix.CreateTranslation(v23(-pos)) * Matrix.CreateScale(scale, scale, 1f) * Matrix.CreateTranslation(v23(offset)); 

原语和精灵都可以绘制(但y与我想要的相反)。如果我有

transmatrix = Matrix.CreateTranslation(v23(-pos)) * Matrix.CreateScale(scale, -scale, 1f) * Matrix.CreateTranslation(v23(offset)); 

原语可以正确绘制,但精灵根本不能绘制。我错过了什么?我试着摆弄了很多不同的东西,但似乎都不起作用。

在XNA vs Primitives中使用spritebatch负缩放

原来是另一个问题导致了这个问题。我必须用负y缩放所有精灵,让它们能够正确绘制,就像msdn社区内容中提到的那样。"当使用这种形式的方法将SpriteBatch映射到期望的坐标系统时,不明显的是负缩放对结果的影响。如果你在X轴或Y轴上缩放一个负数(例如,如果你想翻转Y轴以匹配你的游戏坐标),那么绘制精灵的多边形就会在这个过程中翻转,并被剔除背面。为了得到你期望的结果,有必要在相同的方向上对纹理进行负缩放。"

http://msdn.microsoft.com/en-us/library/ff433701.aspx

SpriteBatch使用自己的参数设置自己的"相机"。缩放你的相机,这样做:

basicEffect.View = Matrix.CreateScale(1.0f, -1.0, 1.0f) * Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up);

或者你可以为spritebatch创建一个不同的矩阵。

或者,你可以将BasicEffect传递给SpriteBatch:

http://msdn.microsoft.com/en-us/library/ff433700.aspx