Как интегрировать игровую логику в игровые движки - PullRequest
0 голосов
/ 24 февраля 2012

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

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

Спасибо.

1 Ответ

0 голосов
/ 24 февраля 2012

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

Редактировать: некоторые подробности.

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

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

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

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

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;
    }
...