0

用图像填充 Texture2D 的最快方法是什么?

在 /Images/image.png 我有所需的图像。

我现有的代码只是用白色填充纹理。我怎样才能让它渲染图像?

Texture2D texture = new Texture2D(graphics.GraphicsDevice, this.Width, this.Height, false, SurfaceFormat.Color);
Color[] colors = new Color[this.Width * this.Height];
for (int j = 0; j < colors.Length; j++)
    colors[j] = color;
texture.SetData(colors);

也许我做错了,但是在屏幕上动态显示图像的最简单/最快的方法是什么?

更新

我将代码更改为使用 ContentManager。

ContentManager contentManager = (Application.Current as App).Content;
Texture2D texture = contentManager.Load<Texture2D>("/Images/block.png");

contentManager.Load<Texture2D>(@"Images/block.png")

抛出“找不到文件”。

contentManager.Load<Texture2D>(@"/Images/block.png")

抛出“加载“\Images\block.png”时出错。无法打开文件。”

4

3 回答 3

2

最简单的方法是只依赖建议的内容管道。

创建 XNA 项目时,您应该有两个项目:MyGame 和 MyGame (Content)。右键单击内容并选择“添加文件”。这将允许您导入可以轻松定位并编译为 .xnb 格式的图像。我相信这是为了加快速度。

完成后,您需要一个ContentManager对象。理想情况下,您Content将从您的游戏类中使用 - 这已经为您设置好了。但是您可以创建一个:

ContentMananger content = new ContentManager(Services, "Content");

来自Services您的游戏类(或IServiceProvider带有 a GraphicsDeviceService)的位置。第二个参数是内容文件夹的根目录。

这将允许您通过以下方式从内容管道加载任意数据格式:

content.Load<Texture2D>("myTexture");

(请注意,您不包括文件扩展名。)

为方便起见,我建议您在 Content 项目中创建一个“Images”文件夹,因为您最终将拥有大量资源,并且更易于组织。你也可以有一个 SFX、Music、XML 等文件夹来处理你的游戏需要的所有数据类型。

所以你会这样做:

Texture2D myTexture = content.Load<Texture2D>("images/myTexture");
SpriteBatch spriteBatch = new SpriteBatch(graphics.GraphicsDevice);

(请注意,这些对象显然需要在类范围内可见)。这将发生在您用于加载文件的初始化代码中。

之后,您将使用 Draw 方法实际绘制精灵

public override void Draw(SpriteBatch spriteBatch)
{
   spriteBatch.Begin();
   spriteBatch.Draw(myTexture, new Vector2(320, 240), Color.White);
   spriteBatch.End();
}

你的精灵被神奇地绘制了。

您所做的基本上是以编程方式定义图像然后绘制它。虽然他们有一些应用程序,但可能不是您想要的。

于 2012-12-12T22:13:47.917 回答
0

如果您不使用内容管道添加纹理,请使用Texture2D.FromStream()

FileInfo imageFile = new FileInfo("Images\\image.png");
Texture2D image = Texture2D.FromStream(GraphicsDevice, imageFile.OpenRead());

如果您正在加载大量纹理,您可能希望在不再需要它们时将它们处理掉

于 2012-12-13T02:30:09.830 回答
0

如果您尝试在运行时加载图像,则可以使用以下代码:

string file = @"Content/images/1.png"; // @ sign is to treat '/' as a character, not a control symbol
FileStream fs = new FileStream(file, FileMode.Open);
Texture2D texture = Texture2D.FromStream(GraphicsDevice, fs);
fs.Dispose();

…然后就texture这样使用:

spritebatch.Draw(texture, new Vector2(123, 456), Color.White);

要使用FileStream您可能需要添加using System.IO;您的游戏类。

这种方法不被认为是标准做法,它可能会导致 Alpha 通道出现问题,要修复它们,您需要使用不同的 Alpha 混合状态。您可以在这个问题中找到更多相关信息。

于 2012-12-12T21:49:24.337 回答