C# 从多个Texture2D生成一个Texture2D 我的问题是我需要用一个TrimeU2D表示一个长度变化的地板,这意味着一个地板,两边都有边的图像,在中间它重复同样的“中间”图像,像这样:

C# 从多个Texture2D生成一个Texture2D 我的问题是我需要用一个TrimeU2D表示一个长度变化的地板,这意味着一个地板,两边都有边的图像,在中间它重复同样的“中间”图像,像这样: ,c#,xna,C#,Xna,为了实现这一点,我得到了“左边缘”、“中间”和“右边缘”纹理,问题是我不知道如何将它们合并为一个纹理2d 在运行时这样做很重要,因为地板长度正在(水平)变化, 我知道你可以用SetData做,但我不知道怎么做 这对我来说是非常重要的,它将作为一个纹理,而不是多个纹理部分,因为我使用Farseer物理引擎来移动地板并使用它 我在Visual Studio 2010中使用C#和XNA,我几乎是一名经验丰富的C#程序员 谢谢大家! 首先,创建一个新的地板纹理,指定适当的宽度和高度。然后,使用获取要合并

为了实现这一点,我得到了“左边缘”、“中间”和“右边缘”纹理,问题是我不知道如何将它们合并为一个纹理2d

在运行时这样做很重要,因为地板长度正在(水平)变化, 我知道你可以用SetData做,但我不知道怎么做

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

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

谢谢大家!

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


警告:GetData和SetData方法速度较慢。如果每个游戏只需要创建一次此纹理(例如在初始化时),则这不是问题。

可能会对您有所帮助。您可以使用HLSL重复地板,也可以在渲染目标上绘制地板并将其保存为单个纹理。享受

您正在使用farseer。。。但这并不禁止您使用平铺方法

我不知道farseer,但我想它提供了一个变换矩阵

做:

vector2pos=Vector2.Zero;
spriteBatch.Begin(…,…,变换);
spriteBatch.Draw(LeftTexture,pos,null,Color.White);
位置X+=左纹理宽度;

对于(int i=0;如果我需要多次创建它们,我该怎么办?那么下面回答中建议的策略会更好。什么是HLSL,请给出第二种解决方案的示例?这里有一个小教程。另外,如果你再查看一下该页面,你会发现很多其他教程,包括HLSL。实际上没有必要编写您的HLSLn HLSL着色器,因为您不会做任何SpriteBatch无法处理的事情。
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);