Лучшее направление для отображения игровой графики в приложении С#

Я делаю небольшую игру в качестве тестового проекта, ничего серьезного. Я только начал и работаю над графикой, но я не уверен, как лучше всего рисовать графику на экране.

Это будет что-то вроде старой Zelda, очень простое использование растровых изображений и тому подобного. Я начал думать, что могу просто рисовать в элементе управления Picture Box, используя Drawing.Graphics с ручкой из элемента управления, но это кажется громоздким. Я также не уверен, могу ли я использовать двойную буферизацию с этим методом.

Я посмотрел на XNA, но сейчас я хотел использовать простой метод для отображения всего.

Итак, мой вопрос. Каков наилучший подход к отображению игровой графики с использованием текущих элементов управления и инфраструктуры C# для окон (например, Picture Box, создание пользовательского элемента управления и т. д.)

РЕДАКТИРОВАТЬ: я добавлю, как я сейчас рисую, в окно изображения. У меня есть объект Tile, который просто содержит пиксели для плитки ( List< List< Color>> texture; ), ничего более для простоты. Затем я рисую это в поле изображения, перебирая пиксели и используя метод FillRectangle, используя кисть с текущим цветом пикселя и размером, заданным переменной масштаба:

int scale = 5;
for (int i = 0; i < texture.Width;)
{
    for (int j = 0; j < texture.Height; ++j)
    {
        int x = i * scale;
        int y = j * scale;
        picBox.FillRectangle(new SolidBrush(currentPixelColor), new Rectangle(x, y, scale, scale));
    }
}

Ага, довольно громоздко. Любые предложения или комментарии приветствуются.


person Mike Webb    schedule 02.06.2010    source источник
comment
См. этот ответ для примера приложения (включая исходный код), которое поможет вам начать работу.   -  person MusiGenesis    schedule 02.06.2010
comment
Я действительно думаю, что вам следует пересмотреть использование XNA. Простого переопределения Draw() достаточно, чтобы нарисовать объект на экране. Кроме того, у него есть несколько служебных методов, расширяемость и т. д. для создания игр.   -  person Julien Lebosquain    schedule 02.06.2010
comment
Можете ли вы объяснить, почему вы считаете, что это громоздко? Если вы считаете GDI громоздким, я не думаю, что XNA/DirectX/OpenGL/и т. д. помогут в категории простоты.   -  person Neil N    schedule 02.06.2010
comment
XNA, безусловно, проще и легче, чем рисовать все самостоятельно, но в результате это меньше опыта обучения, не говоря уже о том, что он привязывает вас к способу работы XNA.   -  person MusiGenesis    schedule 02.06.2010
comment
Я считаю, что XNA — один из самых простых API, такой же простой, как GDI+, но более быстрый. Управляемые сторонние механизмы Direct-X и .net (например, TrueVision) более сложны. WPF также основан на Direct-X, но более ориентирован на пользовательский интерфейс :)   -  person Andrew Florko    schedule 02.06.2010
comment
MusiGenesis, я полностью согласен, и быть запертым в этих рамках — основная причина, по которой я хотел посмотреть на другие площадки. Кроме того, я не думаю, что XNA кроссплатформенный, не так ли?   -  person Mike Webb    schedule 02.06.2010
comment
Майк Уэбб, образец, который вы разместили, совершенно не нужен. GDI будет определять размеры прямоугольников для заданных вами исходных и целевых прямоугольников. Не говоря уже о том, что в вашем цикле есть два новых вызова, которые следует удалить для повышения производительности.   -  person Neil N    schedule 02.06.2010
comment
Нил Н, спасибо за комментарии. Код выше — это именно то, почему я публикую здесь. Я использовал переменную масштаба, потому что изображение размером 16x16 пикселей, очевидно, крошечное, и я хотел масштабировать его до нужного размера. Будет ли GDI+ легко масштабировать небольшие изображения до нужного мне размера? Кроме того, было бы лучше хранить текстуры плитки в виде растровых изображений, а не использовать только их пиксели (т.е. я пытаюсь слишком упростить)?   -  person Mike Webb    schedule 02.06.2010
comment
Всем спасибо за ваши предложения. Дайте мне несколько дней, чтобы снова поиграть с XNA и просмотреть/опробовать ваши предложения, и я приму один из ваших ответов.   -  person Mike Webb    schedule 02.06.2010
comment
@Mike: GDI+ может масштабировать маленькие изображения, чтобы они были больше, но обычно это не рекомендуется в игровом приложении. Чтобы это выглядело прилично, вы должны вызвать DrawImage для объекта Graphics с его InterpolationMode, установленным в HighQualityBicubic (или один из других режимов высокого качества), что значительно замедляет работу. Наиболее эффективным подходом было бы начать с изображения любого желаемого размера и нарисовать его без какого-либо масштабирования. Или нарисуйте меньшее изображение, масштабированное один раз, до большего изображения, а затем нарисуйте большее изображение без масштабирования.   -  person MusiGenesis    schedule 03.06.2010


Ответы (3)


Я бы порекомендовал вам еще раз взглянуть на XNA и попробовать несколько образцов. С XNA очень просто делать простые игры, если вы придерживаетесь 2D. Фреймворк отлично справляется со всеми деталями в простом для понимания потоке, где вы, так сказать, в основном заполняете пробелы.

Я сделал полную (но очень простую) игру для Xbox всего за 8 часов без особого опыта.

Если вы переходите к 3D, все становится сложнее, так как вам нужно понимать различные модели представления, шейдеры и так далее, но для 2D очень просто начать работу.

Еще одним преимуществом 2D является то, что необходимые инструменты легче получить. Всю графику я сделал с помощью Photoshop, звуки были в формате MP3, а голоса я записал с помощью диктофона Windows. Для 3D вам нужны сложные инструменты для создания и экспорта моделей и так далее.

person Brian Rasmussen    schedule 02.06.2010
comment
Я действительно думал о том, что могу загрузить игру на XBox, что было бы здорово, но я также хотел перейти на кросс-платформу, если бы захотел. Может ли XNA быть кроссплатформенным, или мне придется перекодировать свой проект для другой платформы? - person Mike Webb; 02.06.2010
comment
Нет, если вы не считаете Windows, Xbox, Zune и грядущий Windows Phone кроссплатформенными. Однако из-за несколько ограниченной настройки опыт разработчиков действительно хорош. Вы используете Visual Studio и для разработки и отладки игр, работающих на консоли. Это действительно гладко имхо. Единственным недостатком является лицензия на 100 долларов для возможности развертывания на Xbox. Если вы просто хотите делать игры для Windows, лицензии нет. - person Brian Rasmussen; 02.06.2010
comment
Есть ли довольно хороший всеобъемлющий учебник или справочный сайт для изучения XNA? - person Mike Webb; 02.06.2010
comment
Немного не по теме, но можно ли развернуть приложение C# WinForms на Xbox? - person MusiGenesis; 02.06.2010
comment
@ Брайан: спасибо за ссылку. Я очень обрадовался, когда увидел, что xbox поддерживает подмножество компактного фреймворка, но потом я увидел, что он даже не поддерживает System.Drawing. Ну что ж. - person MusiGenesis; 03.06.2010
comment
Снова занялся изучением XNA. Довольно простые вещи. Похоже, я буду использовать его. Спасибо за предложения и комментарии всем вам. - person Mike Webb; 04.06.2010

Я искренне считаю, что XNA на сегодняшний день является одной из самых простых сред разработки игр, которые я использовал. Кроме того, вы можете использовать WPF для рисования объектов на экране.

person Adam Driscoll    schedule 02.06.2010

Во-первых, я настоятельно рекомендую использовать XNA или DirectX для разработки игр...

Однако, если вам не нужна помощь XNA или DirectX.... вам придется использовать .Net GDI+ инструменты рисования.....

Таким образом, вы можете рисовать точки, линии, окружности, прямоугольники, дуги, растровые изображения, тексты и многое другое с помощью GDI+ (все это, конечно же, доступно в C# и .Net...)

Вы можете создать новый простой элемент управления (или использовать существующий, такой как окно изображения или сама форма!), тогда вам придется переопределить его функцию OnPaint(PaintEventArgs e)... Затем вы будете использовать e.Graphics, чтобы рисовать все, что хотите...


Пример:
Простая игра в тетрис Учебник по C#


РЕДАКТИРОВАТЬ:
Использование GDI+ для отрисовки попиксельного изображения приводит к значительному падению производительности!


Лучше рисовать фигуры самостоятельно (круги и т. д.)

person Betamoo    schedule 02.06.2010