Страницы

Поиск по вопросам

Показаны сообщения с ярлыком xna. Показать все сообщения
Показаны сообщения с ярлыком xna. Показать все сообщения

пятница, 24 января 2020 г.

Ищу 3D движок на XNA, для создания игры на Windows Phone 7

#xna #windows_phone_7 #разработка_игр #c_sharp


Какие движки существуют на данный момент для создания игр на Windows Phone 7, плюсы,
минусы, подводные камни. На sourceforge есть много разных проектов, но все они весьма
сырые, и в основном, ориентированны на 2D игры. Из коммерческих я нашел только один
достойный проект: SunBurn. Из опенсорсных — ни одного.    


Ответы

Ответ 1



Balder 3D тоже не плохой, пожалуй лучший из опенсорс.

четверг, 23 января 2020 г.

C# XNA как подключить базу данных?

#c_sharp #база_данных #xna


Нужно подключить базу данных, в приоритете Microsoft Access, но можно и другие варианты
Как это можно осуществить? В WindowsForm был готовый компонент отвечающий за подключения
базы данных, а как это реализовать здесь?

System.Data- не знает

Предлагали через Вид->Другие окна->Источники данных->База данных Но в выборе источников
базы данных нет(Visual Studio 2015) 
    


Ответы

Ответ 1



Насколько мне известно, подключение к базам данных в XNA, к сожалению, сильно ограничено (вроде как в целях безопасности). Потому, на просторах (в том числе и на спецресурсах по XNA) рекомендуют использовать специальные классы для хранения данных Microsoft.Xna.Framework.Storage (по сути - работа с файлами) или использовать SQLite. Т.е. ответ на ваш вопрос - видимо, штатным образом, к сожалению, никак.

Ответ 2



Очень рекомендую технологию подключения к БД - Entity Framework. Ты создаешь модель базы данных с нуля (Code First) или на основе существующей (Database First), и используя ее как контекст данный, работаешь с базой данных. P.S. Устанавливается плагин через nuget, содержится в библиотеке System.Data.Entity

вторник, 31 декабря 2019 г.

Запрет на многократный вызов события при действиях с мышью

#c_sharp #события #логика #xna


Всем доброго времени суток!

Пишу собственный GUI-интерфейс для игрушки. 

Класс Button.

Имеется следующий набор событий-делегатов:

public event EventHandler MouseUpHandler;
public event EventHandler MouseDownHandler;
public event EventHandler MouseOutHandler;
public event EventHandler MouseInHandler;


Каждому из событию соответствует свой метод:

private void OnMouseIn() {...}
private void OnMouseOut() {...}
private void OnMouseUp() {...}
private void OnMouseDown() {...}


В них выполняется примерно такой код:

private void OnMouseDown()
{
    EventHandler tempHandler = MouseDownHandler; // получаем делегат события
    if (tempHandler != null) // проверяем, не пустой ли делегат
    {
        tempHandler(this, EventArgs.Empty); // вызываем событие
    }
    _state = ButtonState.Click; // используется для определения правильных координат
на спрайте текстуры кнопки во время ее рисования
}


Соответствующие методы присутствуют для других событий-делегатов.
В этом же классе присутствует метод 
Update(), который просчитывает логику кода:

public void Update()
{
     /* Формируем данные о положении мыши и о зоне пересечения (на основе позиции
и размеров кнопки) */
     MouseState mouseState = Mouse.GetState();
     Point mousePosition = new Point(mouseState.X, mouseState.Y); 

     Rectangle buttonRectangle = new Rectangle
     (
        (int) this.Position.X, (int) this.Position.Y,
        (int) this.Size.X, (int) this.Size.Y
     );

     if (buttonRectangle.Contains(mousePosition)) // проверяем на наличие пересечения
курсора мыши и кнопки
     {
         if (mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
//ЛКМ - нажатие кнопки мыши
         {
             OnMouseDown();
         }
         if (_mousePrevState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed 
         && mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Released)
// ЛКМ - отпускание кнопки мыши
         {
             OnMouseUp();
         }
     } else // выход курсора за границы кнопки
     {
         OnMouseOut();
     }
    _mousePrevState = mouseState; // сохраняем предыдущее состояние (MouseUp может
быть только после MouseDown)
}


В другом месте создается экземпляр кнопки:

Button button = new Button(...);


Соответственно задаются свойства, текстуры и т.д. Все это функционирует. 
Далее, в том же "другом месте", делегату присваивается метод:

button.MouseInHandler += Название_метода;


С этим, думаю, все должно быть понятно. 
Логика вкратце - создается объект, ему в специальный делегат присваивается метод,
после чего в методе 
Update() проверяется, было ли пересечение кнопки и курсора, был ли клик и т.д. и
на основе этого уже вызывается нужное нам событие. 

Проблема, которая имеется сейчас: метод вызывается не единожды, а множество раз подряд.

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

Я попробовал решить проблему с помощью дополнительных полей:

private bool _isMouseUp;
private bool _isMouseDown;
private bool _isMouseIn;
private bool _isMouseOut;


С изменением структуры логики методов-событий:

private void OnMouseIn()
{
    if (!_isMouseIn) // если событие не вызывалось 
    {
         EventHandler tempHandler = MouseInHandler;
         if (tempHandler != null)
         {
              tempHandler(this, EventArgs.Empty);
         }
         _isMouseIn = true; // определяем событие, как вызванное и не даем ему совершиться
повторно
         _isMouseOut = false; // после In события можно допустить выполнение Out события
    }
    _state = ButtonState.Hover;
}
// примерно такой же код ниже, разве что теперь Out и In поменялись местами
private void OnMouseOut()
{
    if (!_isMouseOut)
    {
         EventHandler tempHandler = MouseOutHandler;
         if (tempHandler != null)
         {
              tempHandler(this, EventArgs.Empty);
         }
         _isMouseOut = true;
         _isMouseIn = false;
    }
    _state = ButtonState.Normal;
}


Для MouseDown и MouseUp соответствующие изменения. 

И все это работает, до тех пор, пока пользователь ведет себя нормально. Однако если
пробовать различные ситуации, например, зажать ЛКМ, после чего навести на кнопку и
отпустить, или зажать ЛКМ над кнопкой и отпустить ее в другом месте - все это приводит
к тому, что в какой-либо момент то или иное событие, которое должно было быть вызвано
- не вызывается, либо наоборот, вызывается то событие, которые вызываться не должно. 

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


Ответы

Ответ 1



Обычно для UI-элементов вводят понятие Capture. Когда происходит событие MouseDown, текущий элемент под мышью фиксируется. Эта фиксация и называется capture. После этого все события о перемещении мыши доставляются только этому элементу. При этом событие отпускания мыши тянет за собой автогенерацию клика только если при этом мышь была внутри элемента с capture. После отпускания мыши capture обнуляется. Таким образом исчезают неожиданные комбинации событий. Вы можете проверить работу capture на окне какого-нибудь приложения: нажмите на крестик закрытия окна в правом верхнем углу, и, не отпуская кнопку мыши, уведите её из кнопки. Теперь отпустите мышь, крестик не сработает. Кстати, у вас в коде логическая ошибка: для MouseDown нужно проверять предыдущее состояние точно так же, как вы делаете для MouseUp: MouseDown происходит только если предыдущее состоянии мыши было ненажатым.

среда, 18 декабря 2019 г.

Небесная механика в XNA

#c_sharp #xna


Собрался делать космическую игру в 2D на XNA. C# изучаю недавно, параллельно с созданием
совершенствую навыки программирования.
Для космической игры нужно? чтобы игра знала законы небесной механики - чтобы можно
было сделать планету, выходить на орбиту, лететь к другим планетам и т.д. Хотелось
бы знать, как именно сформулировать в XNA эти законы.    


Ответы

Ответ 1



Небесная механика ничем не отличается от обычной механики. У объектов есть мгновенные параметры - координаты, скорость, ускорение. На ускорение влияет набор сил, действующих на объект. В случае "земной механики" мы пренебрегаем силами притяжения от других планет ввиду малости массы земных объектов и большой величины расстояния (формула F = G m1 m2 / R^2) и учитываем только эту силу для планеты Земля. В случае небесной механики это условие "выворачивается" - например, когда космический корабль пролетает рядом с Юпитером, нужно учитывать силу притяжения от Юпитера, но уже можно пренебрегать силой притяжения Земли. Взаимодействие планет и их движение по орбитам опять же определяется тем же самым соотношением из закона всемирного тяготения: Для упрощения подсчетов можно установить для каждой планеты ее фиксированную эллипсоидную орбиту и сформулировать функцию (x, y, z) = F(t), определяющую положение планеты в произвольный момент времени с хорошим приближением к реальности. Осталось только обдумать движение космических объектов в вакууме вдали от всех планет: Здесь все тривиально - объект без двигателей будет продолжать свое движение с заданным вектором скорости до достижения точки, в которой на него начинает существенно влиять какая-либо планета или спутник. Под существенностью подразумевается невозможность пренебречь соответствующей величиной. Если понимать физические принципы, то реализовать это должно быть несложно как на XNA, CryEngine, Unreal Engine, так и на любом современном движке промышленного масштаба. P.S. Стоит отметить, что все вышенаписанное верно только в предположении скоростей, много меньших скорости света в вакууме. Если по каким-либо причинам вы собираетесь качественно моделировать ситуации, где скорости сравнимы со скоростью света, то имеет смысл обратиться к теории СТО / ОТО.

Ответ 2



(Вопрос, конечно, старый, но вдруг кому-то пригодится мой ответ) Небесная механика в общем случае - очень сложная вещь (особенно при попытке обобщения на случай n взаимодействующих объектов). Для того, чтобы считать точно, обычно используют разложение силовой функции для конкретной задачи в виде ряда, берут несколько первых слагаемых этого ряда (скорости определяют, подставляя силовую функцию в лагранжиан системы - все сложно). Если интересно, как это делается, можно посмотреть в классическом учебнике Дубошина. Но на самом деле, так вы игру еще не скоро напишете, потому что умрете на разложении силовой функции. Тем более, что точно в общем виде задачу трех тел, сформулированную еще во времена Пуанкаре, не научились решать до сих пор. Я бы на вашем месте рассматривала объекты как частицы с точечной массой, ну и, например, попробовала реализовать просто ради интереса алгоритм Барнса-Хата. В остальных случаях проще всего начать с школьной кинематики и усложнять уже в процессе.

суббота, 30 ноября 2019 г.

XNA есть ли будущее? Какие альтернативы?

#xna #c_sharp #directx


Увы не обнаружил XNA для VS Desktop 2012 Express.
Нашел массу хаков, но они не внушают доверия.
Кто нибудь в курсе MS забил на XNA? Или все таки этот фреймворк будет развиваться?
Возможно это только слухи, но есть информация что MS не будет делать XNA для Desktop
и оставит ее только для мобильников и XBOX.
Если нет, какие есть альтернативы? Насколько я понимаю есть какие то средства для
использования DirectX в C#? Подскажите какие?    


Ответы

Ответ 1



В vs12 xna есть, но пока что только для windows phone. Скорее всего, позже сделают и для desktop'ов. Также советую присмотреться к SharpDX

Ответ 2



XNA добавляет гигантский оверхед по сравнению с нативным DirectX. Если нужно писать на C#, то правильным выбором будет SharpDX.

Ответ 3



Недавняя статья на хабре пролила свет на вопрос: Введение в разработку игр для Windows 8 с использованием XNA и MonoGame. Если точнее: есть открытая разработка - MonoGame (аналог XNA). Программирование на MonoGame позволяет почти не менять код для XNA. Так что ее можно считать полной альтернативой. В ответах так же был озвучен SharpDX, однако есть и другие: EaselJS ImpactJS Construct2 Delta Engine Unigine Ogre Engine Cocos2D Bepu Physics Jitter Physics Box2DX

суббота, 6 июля 2019 г.

Готовые наборы тайлсетов для игр

Доброго времени суток, Хэшкод.
В свободное от работы время начал потихоньку изучать xna. Подготовил двумерный изометрический тайловый движок, даже нашел подходящий редактор под него, однако осталась одна проблема - нашел очень мало нормальных тайлсетов. Художник и дизайнер из меня, прямо скажу, аховый, так что вариант "нарисовать самому" я оставляю на самый крайний случай. При попытке найти что-то в сети в основном получаю какой-то лохматый "ужос"... В общем - не нашел.
Собственно у меня вопросы:
Есть ли сайты, на которых есть нормальные тайлсеты? Есть ли нормальные редакторы для создания тайсетов? (можно конечно и в Paint-е(Gimp-е/Photoshop-е) что-то наваять, но с моими навыками "рисования"... в общем, хотелось бы что-то более специализированное)
Пример тайлсета, если кто не знает, что это такое:
[upd] Да, вопрос получился конечно не по программированию, но извиняюсь. Больше мне спрашивать негде.


Ответ

Вы когда нибудь пробовали собрать toolbar для оконного приложения с помощью сайта который представляет бесплатные иконки от разных людей? Ваш toolbar получится не ахти, так как все иконки будут нарисованы разными людьми в разном стиле и цветовой гамме. Даже если вы будете долго копаться на нескольких таких сайтах в поисках единого стиля, то наврятли получится что-то стоящее, т.к. совершенно не факт что вы найдете даже готовый набор полностью удовлетворяющий вашим нуждам. Тоже самое и с тайлсетом. Их все должен рисовать один человек в одном стиле по одному документу, на gamedev.ru и фриланс сайтах есть десятки людей которые с радостью возьмутся выполнить такой заказ по вполне адекватной цене(реальная рыночная цена тому что вы приводите в качестве примера не больше 100-300 рублей за полоску), да и качество будет вполне ничего, если вы конечно потрудитесь отобрать достойного кандидата. В качестве редактора можно использовать Photoshop и 3DSMax ну или Blender и GIMP если вы красноглазик. Специальный редактор для тайлсетов это плохая идея потому что непонятно чем собственно тайлсет отличается от обычной картинки. Самому рисовать их ни в коем случае нельзя, так как если у вас нет хотя бы пары лет опыта работы с графическими редакторами и хотя бы зачатков умений художника, то в лучшем случае у вас получится результат которым можно только пугать других людей. С другой стороны с попытки с 50ой может и получится что-нибудь хорошее, но тогда вы просто потеряете время. Правда есть и альтернативный вариант: http://lunar.lostgarden.com/labels/free%20game%20graphics.html http://hasgraphics.com/ http://cgtextures.com/ http://blogoscoped.com/archive/2006-08-08-n51.html http://www.freewebs.com/teh_pro/sprites.htm http://www.spriters-resource.com/ http://www.flyingyogi.com/fun/spritelib.html http://www.gamedev.net/topic/272386-sprites-sprites-and-more-sprites/ P.S. Собирать игры в качестве хобби это плохая идея, так как это требует очень много свободного времени и усилий. Нужно либо делать это нормально либо вообще не делать.

среда, 13 марта 2019 г.

C# XNA как подключить базу данных?

Нужно подключить базу данных, в приоритете Microsoft Access, но можно и другие варианты Как это можно осуществить? В WindowsForm был готовый компонент отвечающий за подключения базы данных, а как это реализовать здесь?
System.Data- не знает
Предлагали через Вид->Другие окна->Источники данных->База данных Но в выборе источников базы данных нет(Visual Studio 2015)


Ответ

Насколько мне известно, подключение к базам данных в XNA, к сожалению, сильно ограничено (вроде как в целях безопасности). Потому, на просторах (в том числе и на спецресурсах по XNA) рекомендуют использовать специальные классы для хранения данных Microsoft.Xna.Framework.Storage (по сути - работа с файлами) или использовать SQLite.
Т.е. ответ на ваш вопрос - видимо, штатным образом, к сожалению, никак.

понедельник, 24 декабря 2018 г.

Запрет на многократный вызов события при действиях с мышью

Всем доброго времени суток!
Пишу собственный GUI-интерфейс для игрушки.
Класс Button
Имеется следующий набор событий-делегатов:
public event EventHandler MouseUpHandler; public event EventHandler MouseDownHandler; public event EventHandler MouseOutHandler; public event EventHandler MouseInHandler;
Каждому из событию соответствует свой метод:
private void OnMouseIn() {...} private void OnMouseOut() {...} private void OnMouseUp() {...} private void OnMouseDown() {...}
В них выполняется примерно такой код:
private void OnMouseDown() { EventHandler tempHandler = MouseDownHandler; // получаем делегат события if (tempHandler != null) // проверяем, не пустой ли делегат { tempHandler(this, EventArgs.Empty); // вызываем событие } _state = ButtonState.Click; // используется для определения правильных координат на спрайте текстуры кнопки во время ее рисования }
Соответствующие методы присутствуют для других событий-делегатов. В этом же классе присутствует метод Update(), который просчитывает логику кода:
public void Update() { /* Формируем данные о положении мыши и о зоне пересечения (на основе позиции и размеров кнопки) */ MouseState mouseState = Mouse.GetState(); Point mousePosition = new Point(mouseState.X, mouseState.Y);
Rectangle buttonRectangle = new Rectangle ( (int) this.Position.X, (int) this.Position.Y, (int) this.Size.X, (int) this.Size.Y );
if (buttonRectangle.Contains(mousePosition)) // проверяем на наличие пересечения курсора мыши и кнопки { if (mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed) //ЛКМ - нажатие кнопки мыши { OnMouseDown(); } if (_mousePrevState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed && mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Released) // ЛКМ - отпускание кнопки мыши { OnMouseUp(); } } else // выход курсора за границы кнопки { OnMouseOut(); } _mousePrevState = mouseState; // сохраняем предыдущее состояние (MouseUp может быть только после MouseDown) }
В другом месте создается экземпляр кнопки:
Button button = new Button(...);
Соответственно задаются свойства, текстуры и т.д. Все это функционирует. Далее, в том же "другом месте", делегату присваивается метод:
button.MouseInHandler += Название_метода;
С этим, думаю, все должно быть понятно. Логика вкратце - создается объект, ему в специальный делегат присваивается метод, после чего в методе Update() проверяется, было ли пересечение кнопки и курсора, был ли клик и т.д. и на основе этого уже вызывается нужное нам событие.
Проблема, которая имеется сейчас: метод вызывается не единожды, а множество раз подряд.
Все это приводит к тому, что, например, вывод в консоль любого текста происходит множество раз, но требуется не более одного.
Я попробовал решить проблему с помощью дополнительных полей:
private bool _isMouseUp; private bool _isMouseDown; private bool _isMouseIn; private bool _isMouseOut;
С изменением структуры логики методов-событий:
private void OnMouseIn() { if (!_isMouseIn) // если событие не вызывалось { EventHandler tempHandler = MouseInHandler; if (tempHandler != null) { tempHandler(this, EventArgs.Empty); } _isMouseIn = true; // определяем событие, как вызванное и не даем ему совершиться повторно _isMouseOut = false; // после In события можно допустить выполнение Out события } _state = ButtonState.Hover; } // примерно такой же код ниже, разве что теперь Out и In поменялись местами private void OnMouseOut() { if (!_isMouseOut) { EventHandler tempHandler = MouseOutHandler; if (tempHandler != null) { tempHandler(this, EventArgs.Empty); } _isMouseOut = true; _isMouseIn = false; } _state = ButtonState.Normal; }
Для MouseDown и MouseUp соответствующие изменения.
И все это работает, до тех пор, пока пользователь ведет себя нормально. Однако если пробовать различные ситуации, например, зажать ЛКМ, после чего навести на кнопку и отпустить, или зажать ЛКМ над кнопкой и отпустить ее в другом месте - все это приводит к тому, что в какой-либо момент то или иное событие, которое должно было быть вызвано - не вызывается, либо наоборот, вызывается то событие, которые вызываться не должно.
Я попробовал как можно более подробно описать свою проблему, но если будут какие-нибудь вопросы - задавайте, уточню, если нужно.


Ответ

Обычно для UI-элементов вводят понятие Capture.
Когда происходит событие MouseDown, текущий элемент под мышью фиксируется. Эта фиксация и называется capture. После этого все события о перемещении мыши доставляются только этому элементу. При этом событие отпускания мыши тянет за собой автогенерацию клика только если при этом мышь была внутри элемента с capture. После отпускания мыши capture обнуляется.
Таким образом исчезают неожиданные комбинации событий. Вы можете проверить работу capture на окне какого-нибудь приложения: нажмите на крестик закрытия окна в правом верхнем углу, и, не отпуская кнопку мыши, уведите её из кнопки. Теперь отпустите мышь, крестик не сработает.

Кстати, у вас в коде логическая ошибка: для MouseDown нужно проверять предыдущее состояние точно так же, как вы делаете для MouseUp: MouseDown происходит только если предыдущее состоянии мыши было ненажатым.

пятница, 5 октября 2018 г.

XNA есть ли будущее? Какие альтернативы?

Увы не обнаружил XNA для VS Desktop 2012 Express. Нашел массу хаков, но они не внушают доверия. Кто нибудь в курсе MS забил на XNA? Или все таки этот фреймворк будет развиваться? Возможно это только слухи, но есть информация что MS не будет делать XNA для Desktop и оставит ее только для мобильников и XBOX. Если нет, какие есть альтернативы? Насколько я понимаю есть какие то средства для использования DirectX в C#? Подскажите какие?


Ответ

Недавняя статья на хабре пролила свет на вопрос: Введение в разработку игр для Windows 8 с использованием XNA и MonoGame Если точнее: есть открытая разработка - MonoGame (аналог XNA). Программирование на MonoGame позволяет почти не менять код для XNA. Так что ее можно считать полной альтернативой. В ответах так же был озвучен SharpDX, однако есть и другие: EaselJS ImpactJS Construct2 Delta Engine Unigine Ogre Engine Cocos2D Bepu Physics Jitter Physics Box2DX