Мнение новичка на этом форуме но не новичка в программировании.
Хочу сказать что это мое мнение и никому я ничего не навязываю даже если кому то покажется что я хвалю C# и XNA. Вначале хочется сказать несколько слов о C++ и C# да простят меня за оффтоп.
В С++ все намного сложнее чем на C#. Очистка памяти целиком ложится на программиста. Почти полное отсутствие Intellisense(знающие люди поймут что без этого кодинг превращается в мучение с копанием в MSDN). Попрограммировав немного на Dx9 и попробовав Dx10 я понял что на чистом нативном API ничего особенного не сделаешь. А OpenGL просто ужасен, когда программируешь на на нем чувствуешь что работаешь с примитивной рисовалкой т.к все функции реализованы в этих расширениях а работать с ними это верх маразма тем более по непонятной причине он у меня тормозит.
Вконец измучавшись над тем чтобы сделать на C++ Directx чтото вроде Boulder dash я бросил этот язык(я вначале изучал C#) и обратил внимание на XNA. Но сначала я хочу досказать мысль которая будет полезна тем кто выбирает язык.
Вот некоторые из проблем что мучали меня в C++ и которые отсутствуют в NET и C#
- Отсутствие иерархичности в библиотеках совершенно дикие и непонятные различные названия функций
- То что функции располагаются не в удобных классах а в хедер файлах
- Отсутствие Intellisense и в следствие этого необходимость лазать в справку постоянно
- Необходимость контроля над памятью и указатели
- Уродские синтаксические конструкции вроде ((*void)&ptr) вслдествии этого необходимость серьезно вчитываться в код
- Сложности в том что называется Generic в C# а в С++ - template
- Библиотеки и муки с ними (кто пробовал тот знает)
- Постоянные муки с компиляцией чужого кода (да эти unidentifited symbols by Linker)
- Ощущение что ООП(полиморфизм,интерфейсы и прочее) сделаны там только для галочки
- Необходимоть помнить огромное кол-во всего и вся
Из единственных плюсов C++ могу выделить разве что быстродействие и ощущение себя крутым когда пишешь нечто вроде malloc(*mydata) + &foo ? 0 : 1.
А вот несколько слов о движках и почему мне нравится программирование на API а не готовых движках
Разумеется мое мнение касается движков которые берут на себя все функции игры а не скажем физический движок.
1 - Нежелание разбираться в нем из-за ощущения что он неподойдет для целей которые мне захочется реализовать
2 - Нежелание осознавать что я использую чей-то движок с лицензией.
3 - Даже если движок бесплатный то есть ощущение что он неполноценный (XNA это не касается потому что это не движок а API)
4 - Я ненавижу ограничения движка (но меня устраивают ограничения в XNA)
5 - Ну и уже тем более мне не хочется использовать такие вещи как GameMaker для создания игр (см п 4)
XNA
Сам XNA это не просто голая библиотека - но целый SDK то есть в комплекте поставляется несколько утилит, при установке в Visual Studio устанавливается плагин и шаблоны проектов.
А сама библиотека называется XNA Framework и это не движок а API. Именно Application Programming Interface !
Почему же это все таки не движок ? Первое - В нем нету всяких редакторов уровней,моделей и скриптов. Да в нем есть некоторые функции движка в частности особенности загрузки Контента(т.е текстур,моделей и прочего) Второе - Там нет уже готовых классов для казалось бы банальных вещей присущих любому движку - камеры для обзора, графических примитивов(вроде куба или сферы) для рисования, менеджеров сцены и объектов, модели со скелетной анимацией. Все это придется писать самим для своих нужд используя функционал XNA. Там есть Content pipeline который при компиляции сериализует эти файлы в расширение xnb. Это сделанно в частности для единобразия и кроссплатформенности. Движок вашей игры делается над XNA. Т.е вы в своей игре пишете классы которые используют этот API.
Но (тем кто заинтересовался) не расстраивайтесь там есть и множество классов для ваших нужд, например SpriteBatch - для рисования спрайтов и текста. Вспомогательные математические классы особенно нужны и поэтому в XNA они присутствуют и вам не нужно изобретать велосипед. Для простой 2д игры особых знаний не требуется - только загрузка текстур из готовой папочки Content и вызов функции Draw класса SpriteBatch. Помимо этого чтобы например изменить разрешение экрана, переключить в полноэкранный режим, проверить пересечения объекта и скажем. сферы все это как и многое другое делается одной строчкой. В этом, я согласен XNA похож на движок.
Теперь о кроссплатформенности. Напоминаю XNA кроссплатформенен для продуктов Microsoft. Последнии версии поддерживают Windows XP SP4,Windows Vista SP2,Windows 7,XBOX360,Windows phone 7 и Zune. Также существует Mono XNA позволяющее разрабатывать на Linux,iPhone и пр.(пока что не поддерживает 3д насколько я помню). Еще существует порт на silverlight позволяющая делать игры для броузера(тоже пока 2д) - пруфлинк
Вернемся к функциям XNA. Он построен на Directx9 (но все уже идет к тому чтобы перейти на более высокие версии(надеюсь DX11)). Он поддерживает практически все функции Directx9 и позволяет использовать собственные шейдеры. Также если функционала например Content pipeline не хватает его можно расширить - например - создать текстурный контур объекта из текстуры, или изменить цвет вначале загрузки объекта, или загрузить модель со анимацией. Для этого используется шаблон Content pipeline extension и подключается как библиотека к основному проекту.
Хочу заметить что XNA нельзя в полной мере назвать враппером над Directx9 т.к много из тех функций что разработчики посчитали сложными, малопонятными и некроссплатформенными подверглись удалению и видоизменению.
Для программиста
Чтобы использовать XNA(последней версии) достаточно установить
Visual Studio 2010 (можно Express C# качается вот отсюда - http://www.microsoft.com/express/Downloads/)
XNA 4.0 (если вам не нужна платформа windows phone 7 качайте - http://go.microsoft.com/fwlink/?LinkId=197288)
(если нужна то http://go.microsoft.com/fwlink/?LinkId=201927)
Для конечного пользователя.
Сейчас XNA 4.0 для запуска игр на PC у конечного пользователя должно быть установлена
Directx9 - ну вы знаете где его скачать он везде есть.
Net Framework 4.0
XNA Redistributable 4.0
Для запуска игр на XBOX требуется регистрация на creators.xna.com/ и платная подписка. Стоимость может варьироваться от региона к региону. Также походу дела Россия не является страной в которой запущен XBOX Live. Соответвенно даже если вы игру на своей приставке и запустите то продать ее вам не получится. Походу дела в XBox уже есть библиотеки с поддержкой XNA.
Для windows phone 7 - тоже вроде никаких библиотек на него устанавливать не надо. Чтобы распространять тоже требуется платить (для студентов по программе DreamSpark несколько игр бесплатно)
Чтобы соединится с Windows phone 7 или XBox нужно использовать утилиту Microsoft Connect которая поставляется с XNA.
Плюсы XNA
-вся мощь и плюсы NET и C#
-легкие и удобные классы для различных нужд
-множество уже готовых движков(откройте хотя бы codeplex)
-отличная документация (не впример врапперу SlimDx или DirextxSDK)
-множество примеров, обучалок на англоязычных сайтах(гуглите)
-бесплатная лицензия EULA. Т.е можно разработать коммерческую игру и продавать без проблем.
Минусы XNA
-ограничение Directx9(пока)
-несколько меньшее быстродействие по сравнению с SlimDX и уж тем более нативного Dx9 на C++.Но уверяю, в грамотно разработанной игре это даже не будет заметно.
-отсутствие хэндлов(т.е указателей IntPtr на нативные интерфейсы в классах где они внутренне используются).
-некоторых вещей из dx9 нету (но их можно реализовать другими путями)
-документация не включает в себя шейдеры HLSL (скачайте DirectxSDK и используйте документацию оттуда)
Особенности некоторых компонентов XNA Framework
-Microsoft.Xna.Framework.Net - предназначена для XBOX360 и сервиса Live. Для мульиплеера лучше использовать стороннии библиотеки
-Microsoft.Xna.Framework.Input - не соединяется с DirectInput т.е нет поддержки джойстика. Внутренне использует простые API функции из windows.h для клавиатуры и мыши и xinput.h для XBOX геймпада. Если вам нужна мощь вашего джойстика,руля,педалей итп - совет - создайте для этого библиотеку и вставьте DirectInput из SlimDX(он опенсорсный).
-Microsoft.Xna.Framework.GamerServices - предназначена для XBOX360. Не поставляется в redistributable для windows поэтому использование в большинстве случаев ненужно.
-Microsoft.Xna.Framework.Sound - звук легко использовать, есть 3d, но присутствует поддержка только двух колонок(вроде) т.е нет 5.1 или 8 каналов.
Как связаться с разработчиками XNA
Прежде всего заглянуть на http://forums.create.msdn.com/forums/ и спросить там(на англ языке конечно) Там они часто тусуются.
Если вам хочется внести предложение или рассказать о найденной ошибке - гоу сюда connect.microsoft.com/site226/Feedback (нужна бесплатная Live регистрация)
Если вас заинтресовало как внутри XNA устроено ?
Используйте Reflector и загляните внутрь XNA Framework !
Если вы не знаете как например сделать какую либо вещь на ней - прежде всего загляните на http://create.msdn.com/en-US/education/catalog/ Хоть поиск там и кривой но обучалок там много и из различных компонентов этих обучалок можно вполне сделать игру ! Русскоязычных сайтов - Очень мало. единственный это - xnadev.ru - мне кажется что особо умных программистов там нет.
Поэтому, вперед, изучать англ.яз и смотреть http://forums.create.msdn.com/forums/
Напоследок почитать о XNA можно в блоге одного из главных разрабов - blogs.msdn.com/b/shawnhar/