【问题标题】:XNA SpriteBatches- making them draw offset?XNA SpriteBatches - 使它们绘制偏移?
【发布时间】:2011-08-24 07:50:44
【问题描述】:

有什么好的方法可以做到这一点吗?

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

我不想将此偏移量传递给孩子,而必须在每个孩子中单独处理它——这可能会搞砸,也会搞砸我的界面!

首先,我想有一个 SpriteBatch 的装饰器,如果我为位置 (X,Y) 的某物调用 Decorator.Draw,它将把它作为 (X+offsetX, y+offsetY) 路由到原始 SpriteBatch。但是我无法覆盖 SpriteBatch 类中的 Draw 方法,即使我创建了自己的“Decorator.DrawOffset”,Decorator 似乎也需要调用“SpriteBatch.Begin()”,而这些东西似乎会破坏...... :(

然后我想到了扩展方法,但我认为每次调用 draw() 时都需要将偏移量作为变量传递给它们?这仍然需要我通过孩子们传递偏移量......

另一种选择是将孩子绘制到 RenderTarget(或 XNA4 中的任何内容),然后将其渲染到屏幕上的偏移位置......但这似乎效率低得可怕?

感谢任何cmets!

【问题讨论】:

    标签: c#-4.0 xna xna-4.0


    【解决方案1】:

    您应该使用转换矩阵。

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

    【讨论】:

    • 啊哈!这是一个很好的方法。非常感谢!嗯,如果我已经调用了 SpriteBatch.Begin 该怎么办?有没有更好的方法:SpriteBatch.End() SpriteBatch.Begin(..., transform) SpriteBatch.End() SpriteBatch.Begin(回到最初的样子)?
    • 这里有同样的问题。文档指出,最好不要在 Draw 循环中多次调用 Spritebatch.Begin 和 End!那么如何转换一个对象,而不是所有对象呢?
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多