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