Texture2D рендеринг изображения

Какой самый быстрый способ заполнить 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". Не удается открыть файл."

3 ответа

Самый простой способ - просто полагаться на конвейер контента, как это предлагается.

Когда вы создаете свой проект XNA, у вас должно быть два проекта: MyGame и MyGame (Content). Щелкните правой кнопкой мыши по содержанию и выберите "Добавить файлы". Это позволит вам импортировать изображения, которые можно легко исправить и скомпилировать в формате.xnb. Я считаю, что это должно немного ускорить процесс.

Как только вы это сделали, вам нужно ContentManager объект. В идеале вы будете использовать Content из вашего игрового класса - который уже настроен для вас. Но вы можете создать один с:

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

куда Services от вашего игрового класса (или IServiceProvider с GraphicsDeviceService). Второй аргумент - это корневой каталог вашей папки содержимого.

Что позволит вам загружать произвольные форматы данных из конвейера контента через:

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

(Обратите внимание, что вы не включаете расширение файла.)

Для простоты я предлагаю вам создать папку "Изображения" в проекте Content, так как в конечном итоге у вас будет большое количество ресурсов, и это упростит организацию. Вы также можете иметь папки 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();
}

И твой спрайт волшебно нарисован.

По сути, вы программно определяете изображение, а затем рисуете его. Хотя у них есть приложения в точках, вероятно, не то, что вы ищете.

Если вы не используете конвейер содержимого для добавления текстуры, используйте Texture2D.FromStream():

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

Если вы загружаете много текстур, вы можете избавиться от них, когда они вам больше не нужны.

Если вы пытаетесь загрузить изображение во время выполнения, вы можете использовать этот фрагмент кода:

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; в вашем игровом классе.

Этот метод не считается стандартной практикой, он может привести к проблемам с альфа-каналом, и для их устранения вам потребуется использовать другое состояние альфа-смешивания. Вы можете найти больше об этом в этом вопросе.

Другие вопросы по тегам