2011-08-23 9 views
1

これを行うには良い方法がありますか?XNA SpriteBatches - オフセットを描画しますか?

多くの場合、オフセットされた位置にあるXNAで2Dのものを描画できます。例えば、何かが位置(X、Y)にある場合、理想的にはDraw(X、Y)が呼び出されたときに、オフセットを考慮してXを描画する、変更されたSpriteBatchを渡すことができます。 + OffsetX、Y + OffsetY)。

私はこのオフセットを子供に渡したくないので、子供一人一人で個別に対処しなければなりません。

私はSpriteBatchにDecorator.Drawを置くことを考えました。私がDecorator.Drawを何らかの位置(X、Y)に呼び出すと、元のSpriteBatchにこれを(X + offsetX、y + offsetY)としてルーティングします。しかし、SpriteBatchクラスのDrawメソッドをオーバーライドすることはできません。自分の「Decorator.DrawOffset」を作成しても、デコレータには「SpriteBatch.Begin()」と呼ばれるものが必要なようです。 :(

私はExtension Methodsについて考えましたが、draw()が呼び出されるたびに変数に渡されるオフセットが必要なのでしょうか?それでも私は子供たちにオフセットを渡す必要があります。 。

別のオプションは、レンダーターゲットに子供たちを描くことであろう(あるいは、彼らはXNA4にあるものは何でも)、その後、オフセット位置で画面にこれをレンダリングする...しかし、それは恐ろしく非効率的なようだ?用

感謝任意のコメント!

答えて

5

変換行列を使用する必要があります。

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

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

Aha!それはそれを行う良い方法です。どうもありがとう! ええと、SpriteBatch.Beginを既に呼びましたが、どうすればいいですか? SpriteBatch.End() SpriteBatch.Begin(...、変換) SpriteBatch.End() SpriteBatch.Begin (それはで開始することだったかに戻って):よりもよりよい方法はありますか? – user908588

+0

ここに同じ質問があります。ドキュメントでは、Spritebatch.BeginとEndをDrawループで複数回呼び出さないほうがよいことを述べています。だから、あなたはどのように一つのオブジェクトを変換するのですか? – Kokodoko

関連する問題