从多个Texture2D生成一个Texture2D

发布于 2024-12-07 06:36:12 字数 418 浏览 1 评论 0原文

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

为了实现此目的,我得到了“左边缘”、“中边缘”和“右边缘”纹理,问题是我不知道如何将它们合并成一个单一的texture2D,

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

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

我正在使用 C# 和 XNA 与 Visual Studio 2010,我是一个几乎有经验的 C# 程序员,

谢谢!

My problem is the I need to represent a length-changing floor using a Texture2D, which means a floor that the sides has the image of the sides, and in the middle it repeats the same 'middle' image, like so:
enter image description here

To achieve this, I get the 'left edge', the 'middle' and the 'right edge' textures, problem is I don't know how to merge them into one single texture2D,

It is important to do that at run-time because the floor length is changing (horizontally),
I read you can do that using SetData but I have no idea how...

It is very important for me that it will act as one texture and not multiple texture parts because I am using Farseer Physics Engine to move the floor and use it.

I am using C# and XNA with Visual Studio 2010, I am an almost-experienced C# programmer,

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

┊风居住的梦幻卍 2024-12-14 06:36:12

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

This answer may help you. Either you should use HLSL for repeating your floor or you should draw your floor on a RenderTarget and save it as single Texture. Enjoy.

冷月断魂刀 2024-12-14 06:36:12

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

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

First, create a new Texture2D to serve as your floor texture, specifying the appropriate width and height. Then, get the data of the three textures you want to merge, using the GetData method. Finally, use the SetData method to set the data of the new texture as appropriate (check the link, you can specify the start index).

Warning: GetData and SetData methods are slow. If you need to create this texture only once per game (at the initialization for example), it's not a problem, though.

荒岛晴空 2024-12-14 06:36:12

您正在使用 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);

You are using farseer... but it does not prohibit you to use a tiling approach...

I don't know farseer, but I suppose that it provide a transform matrix...

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文