2011-10-01 81 views
8

我的問題是我需要使用Texture2D來表示一個長度可變的地板,這意味着一個地板的兩側有兩側的圖像,並且在中間它重複相同的「中間「像,像這樣: enter image description here從多個Texture2D生成一個Texture2D

要做到這一點,我得到了‘左邊緣’,‘中等’和‘右邊’紋理,問題是我不知道如何將它們合併成一個單一的的Texture2D,

重要的是要做到這一點,在運行時因爲地板的長度改變(水平)是很重要的, 我看你能做到這一點使用SetData的,但我不知道如何...

對我來說,它將充當一個紋理而不是多個紋理部分,因爲我使用Farseer物理引擎來移動地板並使用它,這對我來說非常重要。

我使用C#和XNA在Visual Studio 2010中,我是一個幾乎有經驗的C#程序員,

謝謝!

回答

1

首先,創建一個新的Texture2D作爲您的地板紋理,指定適當的寬度和高度。然後,使用GetData method獲取要合併的三個紋理的數據。最後,使用SetData method根據需要設置新紋理的數據(檢查鏈接,可以指定開始索引)。

警告:GetData和SetData方法很慢。如果你需要每場比賽只創建一次該紋理(例如初始化),但這不是問題。

+0

如果我需要創造他們很多次? – Itamar

+0

然後在回答下面提出的策略更好。 –

+0

@MajaRemic示例代碼? – matrixugly

2

This answer可能會幫助你。要麼你應該使用HLSL來重複你的地板,要麼你應該在RenderTarget上繪製地板,並將其保存爲單個紋理。請享用。

+0

什麼是HLSL,請您舉個第二個解決方案的例子嗎? – Itamar

+2

這是一個關於[渲染目標]的小教程(http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Render_to_texture.php)。另外,如果你再查看一下這個頁面,你會發現很多其他的教程,包括HLSL。 –

+0

實際上沒有必要爲此編寫自己的HLSL着色器,因爲您不會做任何SpriteBatch無法處理的任何事情。 –

1

您正在使用先知...但它並不禁止你使用平鋪方法...

我不知道先知,但我想,它提供了一個變換矩陣...

做:

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);