Microsoft XNA: Арканоид шаг за шагом

    Несколько дней назад, бороздя просторы великого и могучего Интернета, наткнулся на Microsoft XNA Studio. Не то чтобы услышал об этом фреймворке в первый раз, но все предыдущие разы как-то проходил мимо, времени разбираться не было совершенно.
    В этот раз что-то меня дернуло покопаться поглубже. Справедливо рассудив что для знакомства с библиотекой лучшего метода чем реализовать что нибудь на нем нет, а также имея в распоряжении свободный вечер, решил написать что нибудь простенькое, например любимый мною с детства Arkanoid (Brick Out), не корысти ради, а ознакомления для.

    Это моя первая статья на хабре, убедительно прошу ногами не пинать

    Смысл данной статьи показать как легко можно начать создавать свои игры при помощи XNA и, собственно, дать стимул для дальнейшего изучения этой платформы. Посему, на полноценную игру не претендует, графика — никакая, как и художник из меня. Да и физика могла бы быть пореалистичнее, но это уже выходит за рамки данной статьи, уверен что интересующиеся разработкой игр найдут немало достойных (и не очень) материалов в сети.

    Исходники можно скачать тут



    Итак, что же такое Microsoft XNA?

    Microsoft XNA это набор инструментов и библиотека для разработки мультиплатформенных 2D и 3D игр в управляемой среде Microsoft Managed Runtime Environment. Поддерживаются платформы Windows, Microsoft Xbox 360 и Microsoft Zune. Теоретически писать можно на любом .Net языке, в любой IDE, но оффициально поддерживаются только C# и XNA Game Studio Express и все версии Visual Studio 2005 и выше. XNA также дает возможность портировать игры на поддерживаемые платформы с минимальными изменениями.

    Последняя версия на момент написания статьти – Microsoft XNA Game Studio 3.1 (73.2 MB)

    Создание проекта



    Создадим новый проект – XNA Game Studio 3.1 – Windows Game (3.1)

    Photobucket

    Мастер создаст скелет игры:



    Самый большой интерес для нас представляет файл Game1.cs, в котором определен класс Game1, наследованный от Microsoft.Xna.Framework.Game, где мы и будем разрабатывать нашу игру.
    В классе Game1 переопределены следующие методы Game:

    void Initialize() – Вызывается единожды, для инициализации ресурсов до начала игры
    void LoadContent() – Вызывается единожды, используется для загрузки контента (спрайты и т.д.)
    void UnloadContent() – Вызывается единожды, используется для выгрузки контента
    void Update(GameTime gameTime) – В этом методе реализуется собственно логика игры, обработка коллизий, обработка событий клавиатуры или джойстика, проигрывание аудио и т.д.
    void Draw(GameTime gameTime) – Вызывается для прорисовки игрового поля.

    На данный момент скомпилированная игра выглядит вот так



    Добавление контента



    Добавим игровые ресурсы, в данном случае картинки фона кирпича, ракетки и мячика – Content (Right Click) -> Add -> Existing Item…



    Обратите внимание на свойство Asset Name, его мы используем для создания обьекта Texture2D необходимого для дальнейшей анимации.

    Рисуем фон игрового поля



    Загрузим изображение для фона игрового поля:

    1. private Rectangle _viewPortRectangle; // Границы игрового поля
    2. private Texture2D _background; // Фон игрового поля
    3.  
    4. protected override void LoadContent()
    5. {
    6.   <... skip ...>
    7.   // Границы игрового поля
    8.   _viewPortRectangle = new Rectangle(0, 0,
    9.   graphics.GraphicsDevice.Viewport.Width,
    10.   graphics.GraphicsDevice.Viewport.Height);
    11.  
    12.   _background = Content.Load<Texture2D>(@"background");
    13.   <... skip ...>
    14. }
    * This source code was highlighted with Source Code Highlighter.


    Отрисовка фона

    1. protected override void Draw(GameTime gameTime)
    2. {
    3.   GraphicsDevice.Clear(Color.CornflowerBlue);
    4.  
    5.   spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
    6.  
    7.   // Рисуем фон
    8.   spriteBatch.Draw(_background, _viewPortRectangle, Color.White);
    9.  
    10.   spriteBatch.End();
    11.  
    12.   base.Draw(gameTime);
    13. }
    * This source code was highlighted with Source Code Highlighter.


    Метод SpriteBatch.Begin подготавливает графическое устройство к отрисовке спрайтов, SpriteBatch.End завершает процесс отрисовки и возвращает устройство к начальному состоянию. Все методы SpriteBatch.Draw должны быть заключены в SpriteBatch.Begin — SpriteBatch.End.

    Создание игрового обьекта



    Создадим класс GameObject инкапсулирующий любой из наших игровых обьектов:

    1. using Microsoft.Xna.Framework;
    2. using Microsoft.Xna.Framework.Graphics;
    3.  
    4. namespace Arkanoid
    5. {
    6.   public class GameObject
    7.   {
    8.     public Texture2D Sprite { get; set; } // Спрайт
    9.  
    10.     public Vector2 Position; // Положение
    11.     public Vector2 Velocity; // Скорость
    12.     public int Width { get { return Sprite.Width; } } // Ширина
    13.     public int Height { get { return Sprite.Height; } } // Высота
    14.     public bool IsAlive { get; set; } // Жив ли обьект
    15.     public Rectangle Bounds // Границы обьекта
    16.     {
    17.       get
    18.       {
    19.         return new Rectangle((int)Position.X, (int)Position.Y, Width, Height);
    20.       }
    21.     }
    22.  
    23.     // Разворачивание движения по горизонтальной оси
    24.     public void ReflectHorizontal()
    25.     {
    26.       Velocity.Y = -Velocity.Y;
    27.     }
    28.  
    29.     // Разворачивание движения по вертикальной оси
    30.     public void ReflectVertical()
    31.     {
    32.       Velocity.X = -Velocity.X;
    33.     }
    34.     
    35.     public GameObject(Texture2D sprite)
    36.     {
    37.       Sprite = sprite;
    38.       IsAlive = true;
    39.       Position = Vector2.Zero;
    40.       Velocity = Vector2.Zero;
    41.     }
    42.   }
    43. }
    * This source code was highlighted with Source Code Highlighter.


    Отрисовка и анимация ракетки



    Сначала создадим обьект представляющий ракетку и расположим его в середине игрового поля чуть повыше от его нижнего края

    1. private GameObject _paddle; // Ракетка
    2.  
    3. protected override void LoadContent()
    4. {
    5.   <... skip ...>
    6.  
    7.   // Создание ракетки, начальное положение в середине игрового поля, повыше нижнего края
    8.   _paddle = new GameObject(Content.Load<Texture2D>(@"paddle"));
    9.   _paddle.Position = new Vector2((_viewPortRectangle.Width - _paddle.Width) / 2,
    10.                   _viewPortRectangle.Height - _paddle.Height - 20);
    11.                  
    12.   <... skip ...>
    13. }
    * This source code was highlighted with Source Code Highlighter.


    Отрисовка ракетки на экране

    1. protected override void Draw(GameTime gameTime)
    2. {
    3.   <... skip ...>
    4.  
    5.   spriteBatch.Draw(_paddle.Sprite, _paddle.Position, Color.White);
    6.  
    7.   <... skip ...>
    8. }
    * This source code was highlighted with Source Code Highlighter.


    На данном этапе, если скомпилировать приложение, получим что-то вроде этого:



    Неплхо было бы заставить реагировать ракетку на нажатие клавиш, для этого добавим в метод Update следующий код

    1. protected override void Update(GameTime gameTime)
    2. {
    3.   <... skip ...>
    4.  
    5.   KeyboardState keyboardState = Keyboard.GetState();
    6.  
    7.   // Двигаем ракетку вправо
    8.   if (keyboardState.IsKeyDown(Keys.Right))
    9.    _paddle.Position.X += 6f;
    10.  
    11.   // Двигаем ракетку влево
    12.   if (keyboardState.IsKeyDown(Keys.Left))
    13.    _paddle.Position.X -= 6f;
    14.  
    15.   // Ограничиваем движение ракетки игровым полем
    16.   _paddle.Position.X = MathHelper.Clamp(_paddle.Position.X, 0, _viewPortRectangle.Width - _paddle.Width);
    17.  
    18.   <... skip ...>
    19. }
    * This source code was highlighted with Source Code Highlighter.


    Отрисовка кирпичей



    Создадим массив GameObject представляющий кирпичи которые собственно и будем разбивать

    1. private int _brickPaneWidth = 10; // Сколько кипричей рисовать в ширину
    2. private int _brickPaneHeight = 5; // Сколько кипричей рисовать в высоту
    3. private Texture2D _brickSprite; // Спрайт кирпича
    4. private GameObject[,] _bricks; // Массив кирпичей
    * This source code was highlighted with Source Code Highlighter.


    Добавим следующий код в метод LoadContent()

    1. protected override void LoadContent()
    2. {
    3.   <... skip ...>
    4.  
    5.   // Создание массива кирпичей
    6.   _brickSprite = Content.Load<Texture2D>(@"brick");
    7.   _bricks = new GameObject[_brickPaneWidth,_brickPaneHeight];
    8.  
    9.   for (int i = 0; i < _brickPaneWidth; i++)
    10.   {
    11.    for (int j = 0; j < _brickPaneHeight; j++)
    12.    {
    13.      _bricks[i, j] = new GameObject(_brickSprite)
    14.      {
    15.       Position = new Vector2(i * 55 + 120, j * 25 + 100)
    16.      };
    17.    }
    18.   }
    19.  
    20.   <... skip ...>
    21. }
    * This source code was highlighted with Source Code Highlighter.


    Отрисовка массива кирпичей, отисовка производится если кирпич “жив”, т.е. не разбит мячем

    1. protected override void Draw(GameTime gameTime)
    2. {
    3.   <... skip ...>
    4.  
    5.   // Рисуем кирпичи
    6.   foreach (var brick in _bricks)
    7.    if (brick.IsAlive)
    8.      spriteBatch.Draw(brick.Sprite, brick.Position, Color.White);
    9.  
    10.   <... skip ...>
    11. }
    * This source code was highlighted with Source Code Highlighter.


    На данном этапе игровое поле выглядит следующим образом



    Отрисовка мячика



    Создаем обьект мячика

    1. private GameObject _ball; // Мячик
    2.  
    3. protected override void LoadContent()
    4. {
    5.   <... skip ...>
    6.  
    7.   // Создание мячика, начальное положение в середине на ракетке,
    8.   // начальное направление - вправо, вверх
    9.   _ball = new GameObject(Content.Load<Texture2D>(@"ball"));
    10.   _ball.Position = new Vector2((_viewPortRectangle.Width - _ball.Width) / 2,
    11.             _viewPortRectangle.Height - _paddle.Height - _ball.Height - 20);
    12.   _ball.Velocity = new Vector2(3,-3);
    13.   <... skip ...>
    14. }
    * This source code was highlighted with Source Code Highlighter.


    Для анимации мячика добавим новый метод UpdateBall(), и его вызов в в метод Update(). Данный метод нам понадобится в дальнейшем для обработки столкновений мячика с кирпичами и ракеткой

    1. private void UpdateBall()
    2. {
    3.   _ball.Position += _ball.Velocity;
    4. }
    5.  
    6. protected override void Update(GameTime gameTime)
    7. {
    8.   <... skip ...>
    9.  
    10.   // Двигаем мячик
    11.   UpdateBall();
    12.  
    13.   <... skip ...>
    14. }
    * This source code was highlighted with Source Code Highlighter.


    Для отрисовки мячика добавим следующий код в метод Draw()

    1. protected override void Draw(GameTime gameTime)
    2. {
    3.   <... skip ...>
    4.  
    5.   // Рисуем мячик
    6.   spriteBatch.Draw(_ball.Sprite, _ball.Position, Color.White);
    7.  
    8.   <... skip ...>
    9. }
    * This source code was highlighted with Source Code Highlighter.


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

    Обработка столкновений



    Создадим новый метод определяющий место столкновения обьектов и меняющий направление полета мяча.

    1. // Определение стороны столкновения и отражение направления полета мячика
    2. public void Collide(GameObject gameObject, Rectangle rect2)
    3. {
    4.  
    5.   // Обьект столкнулся сверху или снизу, отражаем направление полета по горизонтали
    6.   if (rect2.Left <= gameObject.Bounds.Center.X && gameObject.Bounds.Center.X <= rect2.Right)
    7.    gameObject.ReflectHorizontal();
    8.    
    9.   // Обьект столкнулся слева или справа, отражаем направление полета по вертикали
    10.   else if (rect2.Top <= gameObject.Bounds.Center.Y && gameObject.Bounds.Center.Y <= rect2.Bottom)
    11.    gameObject.ReflectVertical();
    12. }
    * This source code was highlighted with Source Code Highlighter.


    Добавим следующий код в метод UpdateBall()

    1. private void UpdateBall()
    2. {
    3.   // Будущее положение мяча, нужно для предотвращения "залипания" мяча на поверхности обьекта
    4.   Rectangle nextRect = new Rectangle((int)(_ball.Position.X + _ball.Velocity.X),
    5.     (int)(_ball.Position.Y + _ball.Velocity.Y),
    6.     _ball.Width, _ball.Height);
    7.  
    8.   // Столкновение с верхним краем игрового поля
    9.   if (nextRect.Y <= 0)
    10.     _ball.ReflectHorizontal();
    11.  
    12.   // При сталкивании мяча с нижним краем игрового поля, мячик "умирает"
    13.   if (nextRect.Y >= _viewPortRectangle.Height - nextRect.Height)
    14.   {
    15.     _ball.IsAlive = false;
    16.   }
    17.  
    18.   // Столкновение мячика с левым или правым краем игрового поля
    19.   if ((nextRect.X >= _viewPortRectangle.Width - nextRect.Width) || nextRect.X <= 0)
    20.   {
    21.     _ball.ReflectVertical();
    22.   }
    23.  
    24.   // Столкновение мячика с ракеткой
    25.   if (nextRect.Intersects(_paddle.Bounds))
    26.     Collide(_ball, _paddle.Bounds);
    27.  
    28.   // Столкновение мячика с кирпичами
    29.   foreach (var brick in _bricks)
    30.   {
    31.     if (nextRect.Intersects(brick.Bounds) && brick.IsAlive)
    32.     {
    33.       brick.IsAlive = false;
    34.       Collide(_ball, brick.Bounds);
    35.     }
    36.   }
    37.  
    38.   _ball.Position += _ball.Velocity;
    39. }
    * This source code was highlighted with Source Code Highlighter.


    Итак, что получилось



    Конечно физика в игре, мягко говоря, никакая, мячик иногда залипает при столкновении с движущейся ракеткой. Но, повторюсь, смысл данной статьи знакомство со средой Microsoft XNA Game Studio, и, надо сказать, она отлично справляется с рутиной, освобождая время разработчика для фокусировки внимания на логике игры.

    Исходники можно скачать тут

    Дополнительные ресурсы:
    creators.xna.com
    XNAWiki

    PS. Большое спасибо ivv за приглашение.
    PPS. Спасибо за карму, перенес в XNA

    Текст подготовлен в ХабраРедакторе
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 53
    • 0
      отлично! спасибо за подробное изложение
      • +2
        Пожалуйста!

        В этой теме главное вовремя остановиться, а-то можно продолжать и продолжать, геймдев затягивает неимоверно.
        • 0
          >> В этой теме главное вовремя остановиться, а-то можно продолжать и продолжать, геймдев затягивает неимоверно
          А зачем останавливаться, если хорошо получается? ;)
          • 0
            Незачем ;) учитывая непрофильность темы для меня, придется продолжать в виде хобби…
          • +1
            не надо останавливаться, пишите еще :-)
        • 0
          Исходники на всякий случай продублируйте внизу, а то я их именно там искал, потому как с конца читаем :) Это пожелание.
          • 0
            Это точно, добавил ;)
          • 0
            Отлично, спасибо!
            Переносите пост в коллективный блог о XNA на Хабре
            • +1
              levd, я так понимаю, вы новичок, так что еще прокомментирую: при переносе в коллективный блог вы быстрее окажетесь на глагне (ниже порог вывода) это раз и ваш пост увидят в своих RSS ридерах те, у кого в хабраленте есть xna, это два
              • +1
                более того, посты из личного блога на главную не выходят вовсе
                • 0
                  Вах, это для меня новость )
              • 0
                Ждал кармы, перенес ;)
              • 0
                Большое спасибо ;)
                Кстати на этом ресурсе NETLIB есть книги по XNA не русском языке
                • 0
                  Спасибо, посмотрим ;) Особо обрадовал перевод книги от Wrox…
                • 0
                  Я сначала тоже от XNA был в восторге. Да простые 2D демки на нем очень легко пишутся, а вот что-то сложнее уже вызывает геморрой. Все-таки это фреймворк, а не игровой двиг, слишком низкоуровнево выходит.
                  Что мне особенно в XNA не нравится так это подсистема управления контентом, которой так гордятся разработчики. Возможно я не до конца понял как она работает… но, это ж безумие добавлять модели/текстуры/звуки в игру через малюсенькое окошко в Visual Studio. А если у меня есть дизайнер и ему надо тестить модели в игре? Что ему студию поставить чтоб он мог компилить модели в формат XNA?
                  • 0
                    Все верно, но судя по всему MS позиционирует ее для студентов и энтузиастов. ИМХО для студентов самое оно, можно изучать алгоритмы например…
                    • +1
                      иногда сложнее то и не нужно :) главное хорошая идея и/или сюжет. Сейчас становится все больше игр с отличной графикой и полным отсутствием души, идеи и сюжета. Такие игры редко затягивают дольше чем на день. А бывают простые, незамысловатые игры, реализовать которые дело 2-3х дней, но играть в них не надоедает никогда. В геймдеве как и в любой творческой деятельности нужно вкладывать душу в свой проект и только тогда у него есть шанс стать интересным и востребованным
                      • 0
                        Именно по этой причине до сих пор иногда приятно поиграть например в первые два Fallout-a. Хотя и графика по нынешним меркам мягко говоря не та…
                      • 0
                        Компиляция в единый формат обеспечивает кроссплатформенность между ПС и Коробочкой.
                        Да и не обязательно сразу в проект модели включать и компилировать, можно динамически подгружать все модели из папки и компилировать их в процессе работы самой программы. Там есть функции для этого, точно не скажу, с 3Д в Хне мало работал, но на форуме xnadev.ru этот вопрос активно обсуждали. А по поводу игрового движка, гляньте в сторону TXna.
                      • 0
                        XNA — вредно. Очень завязано на майкрософт, а каких-то преимуществ перед другими решениями не даёт.
                        • 0
                          Ну есть интересное преимущество — microsoft indi games, на боксу можно к примеру засунутся.
                          Хотя из бывшего СНГ эт проблемно.
                          Ну и начать легко. Привыкнув вкручивать тонны либ, писать н-цать дней прежде чем полчится результат, попробовав XNA был в экстазе.
                          И опять же кросплатформеная разработка и доки у макйкрософта на уровне.
                          Говорю как человек, попробывавший всякое — я лично и Symbian и Windows Mobile, рядом вот IPhone, был ещё PalmOS, Embeded Linux.

                          В кратце — для начинающих людей XNA это вообще бомба.
                          • –7
                            Кроссплатформенная? ЩИТО? Запустите на линуксе, или макоси. Пока не запустится — не кроссплатформенная. :)

                            Хотя про начинающих согласен. Начать не просто, а очень просто. Ох уж этот майкрософт, умеют вкусные на первый взгляд конфетки делать.

                            • +4
                              PC, XBox и Zune разные платформы. Значит фреймворк кроссплатформенный. Мир не замкнулся на линукс. Извините.
                              • +3
                                Но и не замкнулся на Microsoft, тем не менее.
                                • –1
                                  Пишете обёртку вокруг XNA, и такуюже на Моно Тач — и вуаля — у вас есть айфон :)
                                  Правда это заслуга языка а не фреймвёка.
                                  Но ситуация вполне типичная, если уж надо много кросплатформенности.
                                  • +1
                                    Нет, нету айФона, потому как ХНА по сути С# врапер над ДирекХ.
                                    Или вы предлагаете переписать вс ДХ функции на ОпенГЛ ?)
                                    • +1
                                      Ну если вы делаете 2д игру, например, то вам достаточно сделать интерфейс SpriteBatch. А как его делать — на айфоне — через OpenGL или в ручную блиттер написать — уже ваше решение.
                                      Вот некий буржуйский товаришь сделал SpriteBatch для силверлайт и использует тот же код, чтоб собирать игры для силверлайта.
                                      Опять же это майкрософт.
                                      У меня например с наружу, для игровой логики XNA вообще не видно — графика, звук, ввод/вывод, контейнеры и прочее — всё обёртки. Но XNA позволил это очень быстро и просто написать.
                                      Ниже написали про Mono.XNA но похоже он не очень жив.
                                      На MSDN есть пример как люди за день или два перенесли игру с iPhone (mono touch) на Zune (XNA).

                                      Не стоит хаять XNA — всему своё место, надо просто знать как его использовать.
                                      Чем меня подкупил XNA, что после всяких симбиан и прочих платформ — пишется легко и быстро, всё работает, нормально взаимодействует, отладка на девайсе в два тычка заводится и т.п.
                                      • 0
                                        А я и не хаю ХНА, я сам его использую в нынешнем проекте, и т.к. кроссплатформенность с линукс/мак мне вообще не нужна, ХНА подходит просто идеально!
                        • 0
                          Про особенности на Xbox писать не думали — а то тут перенёс на XNA игрушку не большую.
                          Под виндой всё работает на ура, стал под боксой запускать — опля, как обычно есть «ньюансы» :)
                          А вообще XNA порадовал своей простотой — начать что-то делать легко, сразу воодушевляет, а дальше уже дело терпения родить что-то нормальное :)
                          • 0
                            Хотел бы попробовать, но ввиду отсутствия Xbox (или там эмуль есть какой?)… а ньюансы есть всегда, как в анекдоте ;)
                            • 0
                              Эмулятора там к сожалению нет.
                              Нужна живая железяка, и кто-то в буржляндии для покупки premium эккаунта на creators.xna.com (Рос, Укр. и прочие страны, как я понял не поддерживаются).
                              Я как раз занят этим попробовать.
                              Но вообще с железкой работать удобно — в локалку воткнул, программу с Live Arcade поставил, на PC три тычки и пример из сдк уже запускается на боксе.
                            • +1
                              Да, ньюансы там есть.
                              Но все решается (если память не изменяет)
                              #if XBOX360
                              #endif
                              (-:
                            • 0
                              Если не трудно выложи саму игру, а то качать фреймворк и компилить чет не охота, ленивый я )
                              • 0
                                Ну игра-то не играбельна ;) но если надо, вечером из дома выложу куда нибудь…
                              • 0
                                чета сорцы не качет ((
                                можна зеркало?
                                • 0
                                  Переложил на народ, ссылки в статье подправлены
                                • 0
                                  первое что я делал когда начинал изучать тот или иной скриптовый язык это писал на нем арканоид :) аркаоид в экселе, аркаоид в ворде, а JS, в общем на чем только можно было на том и «рисовал», т.к. реализация игровой логики там сводится к ряду совсем несложных проверок…
                                  • +1
                                    как же вы зае… доели с этой фразой

                                    «Это моя первая статья на хабре, убедительно прошу ногами не пинать»
                                    • 0
                                      Ну зачем так категорично :)

                                      Данная фраза — следствие подсознательного страха перед новым сообществом ;) Все новичками были…
                                      • +1
                                        Ценности статьи эта фраза не снижает.
                                      • 0
                                        Не холивара ради, а пользы для — что имеется в виду под мультиплатформенностью? И на какие платформы можно портировать? Я без всякой задней мысли спрашиваю — мне правда интересно, что имеет в виду Майкрософт в данном случае.
                                        • 0
                                          Windows, XBOX360, Zune.
                                          • 0
                                            Возможно, это не предел — Mono.XNA. Но пока что-то у них все, вроде, заглохло.
                                        • 0
                                          У меня в этом семестре курсач по ООП, XNA в самый раз подходит для него :).
                                          • +3
                                            Пора создавать блог: Game development
                                            Кстати полезно, потом даже в веб проектах мыслить будите получше (стратегически)
                                            • +1
                                              Отличная вещь для того чтобы попробовать и написать парочку казуалок. Плохо одно что разрабатывая игры на XNA нет понимания что на самом деле происходит на низком уровне. Опять же мне интересно возможно ли с использованием XNA написать что-то реально стоящие? Скажем уровне современных игр чисто теоретически. Я догадываюсь, что скорей всего возможно, но меня больше интересует другой вопрос насколько игра будет ресурсоемкая по сравнению скажем с использование собственного движка или использования другого движка написанного без использования Фреймворков? Ну а так же содержит ли XNA инструментов для написания скажем MMORPG. Просто много раз хотел обратить внимание на этот Фреймворк, но времени исключительно для баловства жалко. А вообще пишите дальше очень интересно, может своими статьями вы пополните ряды разработчиков на XNA.
                                              • 0
                                                Смотря что понимать под современными играми. К примеру что-то на подобии игр от Astraware — вполне, даже деньги заработать можно :)
                                                ИМХО, для серьезного 3Д проекта, где над каждым байтом памяти трясутся, никто XNA не выберет, хотя кто знает…
                                                • 0
                                                  Вот я про тоже для небольших проектов вариант идеальный. Но для чего-то более серьезного нужно искать что-нибудь другое.
                                                  • 0
                                                    Советую ознакомиться со следующими играми:
                                                    Dust: An Elysian Tail
                                                    XNA Racing Game
                                                    Конечно не на пике технологий, но и достаточно неплохо.
                                                    • 0
                                                      Посмотрел видео. отличная реализация. Вот теперь я реально задумался об использовании XNA. Спасибо вам большое.
                                              • 0
                                                Если кто-то хочет кроссплатформенности, то советую посмотреть в сторону Axiom. Это порт на C# движка под названием Ogre3d.
                                                Страничка движка на Codeplex: www.codeplex.com/Axiom
                                                И на Sourceforge: axiomengine.sourceforge.net/wiki/index.php/Main_Page
                                                Автор заявляет, что двиг может работать под Mono, а следовательно и под Linux.
                                                Я сейчас лично ковыряю Mogre, это тоже самое только это не порт, а Managed обертка над Ogre3d, что дает выигрыш в скорости и наличие самой последней версии движка. Axiom на данный момент добрался только до версии 0.8, в то время как Ogre сейчас 1.4.6.

                                                Впечатления пока приятные, по крайней мере не заставляют заниматься рутиной, типа настройки камер или рисованием вручную моделей.
                                                • 0
                                                  Огромное спасибо Вам за статью! Мне как ни странно нравится концепция XNA (фреймворк для быстрого создания рабочего прототипа), причем в ней реализуются даже очень классные вещи — стартер Racing Game, например.
                                                  Я со сслыкой на Вашу статью дал её своим студентам как дополнительную лабораторную. Вроде бы им понравилось.
                                                  • 0
                                                    Огромное пожалуйста ;)

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.