2011-08-23 78 views
1

任何建议一个好办法做到这一点?XNA SpriteBatches-使他们绘制抵消?

我希望能够在XNA中绘制大量2D事物 - 通常位于偏移位置。例如,如果有东西在位置(X,Y),那么理想情况下我希望能够传递一个修改后的SpriteBatch,当Draw(X,Y)被调用时将考虑偏移并在(X + OffsetX,Y + OffsetY)。

我不想将这个偏移量传递给孩子,必须分别在每个孩子中处理它 - 这可能会搞砸,并且还会使我的界面搞砸!

首先,我想到了一个装饰器到SpriteBatch,如果我为位置(X,Y)的某个东西调用Decorator.Draw,会将其路由到原始SpriteBatch(X + offsetX,y + offsetY)。但是后来我无法重写SpriteBatch类中的Draw方法,即使我创建了自己的“Decorator.DrawOffset”,装饰器似乎也需要调用“SpriteBatch.Begin()”以及似乎要破坏的东西...... :(

然后我想到扩展方法,但我认为他们需要传递给他们的偏移量作为每次调用draw()时的变量?哪些仍然需要我将偏移量传递给儿童。 。

另一种办法是给孩子们画的渲染目标(或不管他们是在XNA4),然后使这个在偏移位置的屏幕......但似乎可怕效率低下?

感谢任何意见!

回答

5

你应该使用转换矩阵。

Matrix Transform = Matrix.CreateTranslation(offsetX, offsetY, 0); 

SpriteBatch.Begin(...,...,...., Transform); 
+1

啊哈!这是一个很好的做法。非常感谢! 嗯,如果我已经打电话给SpriteBatch.Begin,该怎么办?难道还有比一个更好的方式: SpriteBatch.End() SpriteBatch.Begin(...,变换) SpriteBatch.End() SpriteBatch.Begin(回到它是怎么下手) ? – user908588

+0

同样的问题在这里。该文档指出,最好不要在Draw循环中多次调用Spritebatch.Begin和End!那么你如何转换一个对象,但不是所有对象? – Kokodoko