[英]Texture2D render image
使用图像填充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“。无法打开文件。”
最简单的方法是按照建议依赖内容管道。
在创建XNA项目时,您应该有两个项目:MyGame和MyGame(Content)。 右键单击“内容”,然后选择“添加文件”。 这将允许您导入可以轻松修改并编译为.xnb格式的图像。 我相信这是为了加速一点事情。
完成后,您需要一个ContentManager
对象。 理想情况下,您将使用游戏类中的Content
- 这已经为您设置了。 但你可以创建一个:
ContentMananger content = new ContentManager(Services, "Content");
Services
来自您的游戏类(或具有GraphicsDeviceService
的IServiceProvider
)。 第二个参数是内容文件夹的根目录。
这将允许您通过以下方式从内容管道加载任意数据格式:
content.Load<Texture2D>("myTexture");
(请注意,您不包含文件扩展名。)
为方便起见,我建议您在Content项目中创建一个“Images”文件夹,因为最终会有大量资源,这样可以更轻松地进行组织。 您还可以使用SFX,音乐,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();
}
而你的精灵是神奇地画出来的。
你正在做的主要是以编程方式定义一个图像,然后绘制它。 虽然他们有点应用,可能不是你想要的。
如果您尝试在运行时加载图像,则可以使用以下代码:
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;
添加using System.IO;
在你的游戏课上。
此方法不被视为标准做法,可能会导致alpha通道出现问题,要修复它们,您需要使用不同的Alpha混合状态。 您可以在此问题中找到更多相关信息。
如果您没有使用内容管道添加纹理,请使用Texture2D.FromStream()
:
FileInfo imageFile = new FileInfo("Images\\image.png");
Texture2D image = Texture2D.FromStream(GraphicsDevice, imageFile.OpenRead());
如果您正在加载大量纹理,则可能需要在不再需要它们时处置它们 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.