【问题标题】:Generating one Texture2D from multiple Texture2Ds从多个 Texture2D 生成一个 Texture2D
【发布时间】:2011-10-01 08:23:36
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    This answer 可以帮助你。您应该使用 HLSL 来重复您的地板,或者您应该在 RenderTarget 上绘制您的地板并将其保存为单个纹理。享受。

    【讨论】:

    • 什么是 HLSL,你能举一个第二个解决方案的例子吗?
    • 这里有一个关于Render Target的小教程。此外,如果您多查看该页面,您会发现很多其他教程,包括 HLSL。
    • 实际上没有必要为此编写自己的 HLSL 着色器,因为您不会做任何 SpriteBatch 无法处理的事情。
    【解决方案2】:

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

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

    【讨论】:

    • 如果我需要多次创建它们怎么办?
    • 那么下面答案中建议的策略更好。
    【解决方案3】:

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

    我不知道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);
    

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多