从多个Texture2D生成一个Texture2D

时间:2011-10-01 08:23:37

标签: c# xna

我的问题是我需要使用Texture2D来表示一个长度在变化的地板,这意味着一个侧面具有两侧图像的地板,并且在中间它重复相同的“中间”图像,如下所示: enter image description here

要实现这一点,我得到'左边','中间'和'右边'纹理,问题是我不知道如何将它们合并为一个单一的texture2D,

在运行时这样做很重要,因为地板长度正在变化(水平), 我读过你可以使用SetData做到这一点,但我不知道如何......

对我来说非常重要的是它将作为一个纹理而不是多个纹理部分,因为我使用Farseer Physics Engine来移动地板并使用它。

我在Visual Studio 2010中使用C#和XNA,我是一位经验丰富的C#程序员,

谢谢!

3 个答案:

答案 0 :(得分:2)

This answer可能会对您有所帮助。您应该使用HLSL来重复地板,或者您应该在RenderTarget上绘制地板并将其保存为单个纹理。请享用。

答案 1 :(得分:1)

首先,创建一个新的Texture2D作为地板纹理,指定适当的宽度和高度。然后,使用GetData method获取要合并的三个纹理的数据。最后,使用SetData method根据需要设置新纹理的数据(检查链接,可以指定起始索引)。

警告:GetData和SetData方法很慢。如果你只需要为每个游戏创建一次这个纹理(例如在初始化时),那么这不是问题。

答案 2 :(得分:1)

您正在使用farseer ......但它并不禁止您使用平铺方法......

我不知道更狡猾,但我想它提供了一个变换矩阵......

做的:

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