2012-02-23 3 views
0

Недавно я работаю над примером 2d игрового движка в .NET с C#. Моя основная проблема заключается в том, что я не могу понять, как включить логику игры в игру. В настоящее время у меня есть базовый движок, который представляет собой набор классов, в которых работают подсистемы, такие как Render, Sound, Input и Core. Существует редактор, который помогает пользователю добавлять ресурсы, создавать уровни, писать сценарии и другие материалы.Как интегрировать логику игры в игровые движки

Я придумал использовать Reflection и CSharpCodeProvider из моего редактора для компиляции написанных кодов, таким образом, я могу получить исполняемый файл моего продукта. Этот путь довольно хорошо, но я хотел бы знать, что это действительно решение и архитектура для этого.

Спасибо.

+1

зависит слишком много от типа игр - некоторые из них могут быть включены в основном цикле, но ролевые игры могут понадобиться полными на правила двигателей ... –

+0

Предположат, это на 2-е платформы.Кстати, у меня нет никаких проблем с событиями. Основной цикл может запускать событие 'Step' или каждый кадр, например. Нет проблем с этим вообще. – MahanGM

+0

Определяет ли ваш пользователь логику игры с 'C#'? – Tigran

ответ

0

Действительно зависит от того, как вы разработали свой двигатель. Это не просто части библиотек, которые отвечают за разные вещи, такие как рендеринг, звук, вход и т. Д. У вас должен быть кусок, который объединяет их вместе. Основными двумя подходами являются диаграмма сцены или модель компонента. Это модуль, который объединит все это. Получите ввод, передайте его сущности или компоненту, выполните какой-либо скрипт, выполните некоторые действия sfx, примените некоторое преобразование, отправьте преобразованный объект в конвейер рендеринга. В этом потоке выполнить какой-то скрипт - это то, что вы хотите интегрировать. Есть много способов сделать это. Лучший способ сделать это, если эти сценарии исходят от вашего редактора. Они будут связаны с шаблонами сущностей, экземплярами сущностей, триггерами, элементами пользовательского интерфейса, устройствами ввода. Двигатель не должен знать ничего конкретного об объектах. Их шаблоны должны быть определены в редакторе и снова помещены в мир с помощью редактора.

Редактировать: Дополнительная информация.

Предполагая, что вы полностью хотите пропустить часть приложения, и все, что связано с игрой, написано в вашем редакторе. Затем ваш двигатель должен иметь основной цикл и обновлять и рисовать вашу сцену. Простым началом является «Обновление», а затем «Нарисуйте» свою сцену так быстро, как вы можете, не дожидаясь своего цикла.

Теперь предположим, что у вас есть компонентная модель ... Каждый компонент будет иметь свое обновление, а это обновление - это код, который вы используете. Вы должны создать некоторые интерфейсы, которые ваши компоненты могут получить от движка. Например, ваш шаблон компонента рисования будет иметь модель свойств и в его обновлении вызовет DrawModel на движке и передаст эту модель. Некоторый другой компонент геймпада потребуется от его обновления, чтобы запросить, какие кнопки были нажаты или выпущены. Также потребуется некоторое, чтобы иметь возможность находить другие компоненты в объекте, чтобы он мог изменять положение или скорость физического компонента.

Вы должны начать писать основные компоненты основной сущности, и вы поймете, к чему у вас нет доступа к вашим скриптам. И тогда вы должны разоблачить его на свой скриптовый слой. Но подумайте дважды, прежде чем разоблачать каждую функцию. Чем проще API, тем лучше.

Edit: Как скомпилировать скрипт во время выполнения

IronPython можно оценить код без компиляции, если у вас есть реализация .NET на JavaScript я держал пари, что тоже может это делать. Вот способ C# для компиляции вашего скрипта ... Если ваш редактор находится на C#, я предлагаю вам скомпилировать отдельные сборки в вашем редакторе.

private Assembly Compile(string fileName) 
    { 
     CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 

     CompilerParameters cp = new CompilerParameters(); 
     cp.GenerateExecutable = false; 
     cp.GenerateInMemory = true; 
     cp.TreatWarningsAsErrors = false; 
     CompilerResults cr = provider.CompileAssemblyFromFile(cp, fileName); 

     return cr.CompiledAssembly; 
    } 
+0

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

+0

Проверьте правильность ответа. – Aleks

+0

Спасибо за подробную информацию. Я на самом деле делаю это прямо сейчас в своем движке. Как я уже говорил, нет проблем с временем или местом выполнения сценариев, а не я не знаю, как я должен дать сценарий моему движку и сказать: «Эй, запустите его для меня!». Я пробовал что-то вроде IronPython и JavaScript-оболочки, но они оба должны скомпилировать код каждый раз, когда вы хотите запустить свой скрипт. Таким образом, это похоже на приложение, которое оно не скомпилировано вначале, и оно должно скомпилировать его код во время выполнения. – MahanGM