我是 XNA 的新手,想在它上面开发一个轻量级的 2D 引擎,将实体组织成父子层次结构。我在画孩子的时候会想到矩阵,因为他们的位置、旋转和比例取决于他们的父母。
如果我使用SpriteBatch.Begin()
,我的矩形可以在屏幕上绘制,但是当我将它们更改为:
this.DrawingMatrix = Matrix.Identity;
this.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullClockwise, null, this.DrawingMatrix);
什么都没有画了。我什至尝试过new Matrix()
或Matrix.CreateTranslation(0, 0, 0)
为DrawingMatrix
.
我的第一个问题是:为什么它不起作用?我没有使用任何相机或视口。
其次,在绘制实体之前,我调用PreDraw
来转换矩阵(然后我将在 处重置为原始状态PostDraw
):
protected virtual void PreDraw(Engine pEngine)
{
pEngine.DrawingMatrix *=
Matrix.CreateTranslation(this.X, this.Y, 0) *
Matrix.CreateScale(this.ScaleX, this.ScaleY, 1) *
Matrix.CreateRotationZ(this.Rotation);
}
请澄清上述代码的更正。而且我不需要在原点进行缩放,而是在ScaleCenterX
and ScaleCenterY
,我该如何实现呢?
添加:这是我的引擎绘制过程的示例:
调用这些代码:
this.DrawingMatrix = Matrix.CreateTranslation(0, 0, 0); this.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullClockwise, null, this.DrawingMatrix);
调用
PreDraw()
, 是:protected virtual void PreDraw(Engine pEngine) { pEngine.DrawingMatrix *= Matrix.CreateTranslation(this.X, this.Y, 0) * Matrix.CreateScale(this.ScaleX, this.ScaleY, 1) * Matrix.CreateRotationZ(this.Rotation); }
Draw()
例如,在我的Rect
课堂上调用:protected override void Draw(Engine pEngine) { pEngine.SpriteBatch.Draw(pEngine.RectangleTexture, new Rectangle(0, 0, (int)this.Width, (int)this.Height), new Rectangle(0, 0, 1, 1), this.Color); }
如果我用 替换上面的Begin
代码this.SpriteBatch.Begin()
,则矩形绘制正确,所以我猜这是因为矩阵。