2011-10-01 10 views
8

私の問題は、Texture2Dを使用して長さ変更フロアを表現する必要があります。これは、辺に辺のイメージがあり、真ん中に同じ 'middle問題は、私は単一のものにそれらをマージする方法がわからないで、左端 『『ミドル』と『右端』テクスチャ:「イメージ、そのよう enter image description here複数のTexture2Dから1つのTexture2Dを生成する

はこれを実現するために、私は取得します』 texture2D、

床の長さが(水平方向に)変化しているので、実行時に行うことが重要です。 SetDataを使用して読み込むことができますが、私にはわかりません...

Farseer Physics Engineを使用してフロアを移動して使用するため、複数のテクスチャパーツではなく、1つのテクスチャとして機能することは非常に重要です。

私は、Visual Studio 2010でC#とXNAを使用しています、私はほとんど経験のあるC#のプログラマーだ、

ありがとうございます!

答えて

1

まず、適切な幅と高さを指定して床テクスチャとして機能する新しいTexture2Dを作成します。次に、GetData methodを使用してマージしたい3つのテクスチャのデータを取得します。最後に、を使用して、新しいテクスチャのデータを適切に設定します(リンクを確認し、開始インデックスを指定できます)。

警告:GetDataメソッドとSetDataメソッドは低速です。このテクスチャをゲームごとに1回だけ作成する必要がある場合(たとえば初期化時など)、問題はありません。

+0

私はそれらを何度も作成する必要がありますか? – Itamar

+0

それでは、以下の答えで提案されている戦略が優れています。 –

+0

@MajaRemicサンプルコード? – matrixugly

2

This answerお手伝いがあります。床を繰り返すにはHLSLを使用するか、RenderTargetに床を描画して単一のテクスチャとして保存する必要があります。楽しい。

+0

HLSLとは何ですか?第2の解決策の例を挙げてください。 – Itamar

+2

[レンダリングターゲット](http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Render_to_texture.php)のチュートリアルです。また、そのページをもう少し調べれば、HLSLを含む多くのチュートリアルを見つけることができます。 –

+0

SpriteBatchで処理できないことはないので、独自のHLSLシェーダを書く必要はありません。 –

1

私はfarseerを知らないが、私はそれが変換行列を提供しているとし...

をあなたはfarseerを使用している...しかし、それはタイルアプローチを使用するためにあなたを禁止していない...

do:

Vector2 pos = Vector2.Zero; 
spriteBatch.Begin(...,....,...,..., Transform); 

spriteBatch.Draw(LeftTexture, pos, null, Color.White); 
pos.X += LeftTexture.Width; 
for (int i=0; i<floor_repeats; i++) 
{ 
    spriteBatch.Draw(MidleTexture, pos , null, Color.White); 
    pos.X += MiddleTexture.Width; 
} 
spriteBatch.Draw(RightTexture, pos , null, Color.White); 
関連する問題