【发布时间】:2013-01-09 07:07:19
【问题描述】:
我是 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 和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); } -
例如,在我的
Rect类中调用Draw():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(),矩形绘制正确,所以我猜是因为矩阵。
【问题讨论】:
-
使用 Matrix.Identity 应该导致与根本不指定矩阵相同的行为,所以我认为这不是你的问题。你能发布一些实际负责绘制精灵的代码吗?
-
@ColeCampbell 刚刚添加 :)
标签: algorithm matrix xna 2d transformation