У меня есть немного игры, записанной в C#. Это использует базу данных в качестве бэкенда. Это - торговая карточная игра, и я хотел реализовать функцию карт как сценарий.
То, что я имею в виду, - то, что у меня по существу есть интерфейс, ICard
, который реализует класс карты (public class Card056: ICard
) и который содержит функцию, которая вызвана игрой.
Теперь, для создания вещи maintainable/moddable я хотел бы иметь класс для каждой карты как исходный код в базе данных и по существу скомпилировать его на первом использовании. Таким образом, когда я должен добавить/изменить карту, я просто добавлю его к базе данных и скажу моему приложению обновляться, не нуждаясь ни в каком развертывании блока (тем более, что мы говорили бы приблизительно 1 блок на карту, что означает сотни блоков).
Это возможно? Зарегистрируйте класс от исходного файла и затем инстанцируйте его и т.д.
ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);
Язык является C#, но дополнительная премия, если возможно записать сценарий на каком-либо языке.NET.
решением для Сценария Oleg Shilo C# (в Проекте Кода) действительно является большое введение в обеспечение способностей к сценарию в Вашем приложении.
другой подход А должен был бы рассмотреть язык, который конкретно создается для сценариев, такой как IronRuby, IronPython, или Lua.
IronPython и IronRuby оба доступны сегодня.
Для руководства по встраиванию IronPython читает , Как встроить поддержку сценария IronPython в Ваше существующее приложение на 10 легких шагах .
, Lua является языком сценариев, наиболее часто используемым в играх. Существует компилятор Lua для.NET, доступной от CodePlex - http://www.codeplex.com/Nua
, Что кодовая база является большим чтением, если Вы хотите узнать о создании компилятора в.NET.
А различный угол в целом должен попробовать PowerShell. Существуют многочисленные примеры встраивания PowerShell в приложение - вот полный проект по теме: Туннель Powershell
Если Вы не хотите использовать ДОЛЛАР, Вы можете Шиканье использования (который имеет интерпретатор) , или Вы могли рассмотреть Script.NET (S#) проект на CodePlex. С решением для Шиканья можно выбрать между скомпилированными сценариями или использованием интерпретатора, и Шиканье делает хороший язык сценариев, имеет гибкий синтаксис и расширяемый язык через его открытую архитектуру компилятора. Script.NET выглядит хорошим слишком, тем не менее, и Вы могли легко расширить тот язык, а также проект с открытым исходным кодом и используете очень дружественный Генератор Компилятора ( Irony.net ).
Вы могли бы быть в состоянии использовать IronRuby для этого.
Иначе я предложил бы, чтобы у Вас был каталог, куда Вы помещаете предварительно скомпилированные блоки. Тогда Вы могли иметь ссылку в DB к блоку и классу, и использовать отражение для загрузки правильных сборок во времени выполнения.
, Если Вы действительно хотите скомпилировать во времени выполнения, Вы могли бы использовать CodeDOM, тогда Вы могли использовать отражение для загрузки динамического блока. статья документации Microsoft, которая могла бы помочь .
Я предложил бы использовать LuaInterface, поскольку он полностью реализовал Lua, где кажется, что Nua не завершен, и вероятный не реализует некоторую очень полезную функциональность (сопрограммы, и т.д.).
, Если бы Вы хотите использовать некоторые внешние предварительно упакованные модули Lua, я предложил бы использовать что-то вроде 1.5.x в противоположность 2.x ряд, который создает полностью управляемый код и не может представить необходимый API C.
Вы могли использовать любой из языков ДОЛЛАРА, которые позволяют действительно легко хост Ваша собственная платформа сценариев. Однако Вы не должны использовать язык сценариев для этого. Вы могли использовать C# и скомпилировать его с поставщиком кода C#. Пока Вы загружаете его в его собственном AppDomain, можно загрузить и разгрузить его к содержанию основы.
Главное приложение, которое продает мое подразделение, делает что-то очень похожее для обеспечения клиентского удовлетворения требованиям заказчика (что означает, что я не могу отправить источник). У нас есть приложение C#, которое загружает динамические сценарии VB.NET (хотя любой язык.NET мог легко поддерживаться - VB был выбран, потому что команда удовлетворения требованиям заказчика произошла из среды ASP).
Используя CodeDom.NET мы компилируем сценарии от базы данных, с помощью VB CodeDomProvider
(раздражающе, это принимает значение по умолчанию к.NET 2, если Вы хотите поддерживать 3,5 функции, необходимо передать словарь с "CompilerVersion" = "v3.5" его конструктору). Используйте CodeDomProvider.CompileAssemblyFromSource
метод для компиляции его (можно передать настройки, чтобы вынудить его скомпилировать в памяти только.
Это привело бы к сотням блоков в памяти, но Вы могли соединить код всех динамических классов в единственный блок и перекомпилировать всех когда любое изменение. Это имеет преимущество, которое Вы могли добавить флаг для компиляции на диске с PDB для того, когда Вы тестируете, позволяя Вам отладить через динамический код.
Да, я думал об этом, но я скоро выяснил, что другой Предметно-ориентированный язык (DSL) будет немного слишком много.
По существу, они должны взаимодействовать с моим gamestate возможно непредсказуемыми способами. Например, карта могла иметь правило, "Когда это чешет, вводят игру, все Ваши немертвые фавориты получают +3 нападения на летающих врагов, кроме тех случаев, когда враг благословлен". Поскольку торговые карточные игры являются базирующимся поворотом, менеджер GameState запустит события OnStageX и позволит картам изменить другие карты или GameState любым способом потребности карты.
, Если я пытаюсь создать DSL, я должен реализовать довольно большой набор функций и возможно постоянно обновлять его, который смещает работы по техническому обслуживанию к другой части, на самом деле не удаляя его.
Вот почему я хотел остаться с "реальным" языком.NET, чтобы по существу быть в состоянии просто запустить событие и позволить карте управлять gamestate любым способом (в рамках безопасности доступа к коду).