Я не уверен, что у вас есть правильный конец флешки с динамическим ключевым словом.Само по себе это не позволяет интерпретировать новый код во время выполнения.Все это позволяет обойти статическую проверку типов, откладывая разрешение операций до времени выполнения.
Если вы хотите «написать сценарий» своей игре, вы, вероятно, захотите взглянуть на интеграцию Lua, IronPython,или один из других языков DLR: -
В противном случае, обычно нужно иметь что-то вроде: -
interface IBehavior
{
// Binds whatever events this behaviour needs, and optionally adds
// itself to a collection of behaviours on the entity.
void Register(Entity entity);
}
// Just an example
public abstract class TurnEndingDoSomethingBehavior
{
public void Register(Entity entity)
{
entity.TurnEnding += (s, e) => DoSomething();
}
private abstract void DoSomething();
}
Вопрос в том, хотите ли вы иметь возможность добавлять совершенно новые поведения после компиляции-время?Если это так, вам нужно будет раскрыть некоторые или все ваши игровые состояния на языке сценариев.
Или этого достаточно, чтобы иметь возможность составлять существующие поведения во время выполнения?
После вашего редактирования
Я все еще не уверен, если честно, о ваших требованиях к динамическому ключевому слову и DLR.Средство запуска вашей игры может загрузить библиотеку классов, полную поведений, так же легко, как и набор сценариев!(Это то, что делает пусковая установка Minecraft, если память работает)
Если вам абсолютно необходимо использовать DLR, то посмотрите ссылки, которые я разместил.Вам придется выставлять столько игрового состояния, сколько необходимо для одного из языков DLR.События представляются как свойства функции первого порядка.Вам даже не нужно ключевое слово «dynamic» для базовых вещей.
Быстрый пример в IronPython: -
def DoSomethingWhenDamageTaken(*args):
#do whatever...
player.DamageTaken += DoSomethingWhenDamageTaken
Класс игрока: -
public class Player
{
public event EventHandler DamageTaken;
// ...
}
Вы устанавливаете его следующим образом: -
ScriptEngine engine = Python.CreateEngine();
ScriptRuntime runtime = engine.Runtime;
ScriptScope scope = runtime.CreateScope();
// In an actual application you might even be
// parsing the script from user input.
ScriptSource source = engine.CreateScriptSourceFromFile(...);
Player p = new Player();
scope.SetVariable("player", p);
source.Execute(scope);
Некоторые ссылки, с которых можно начать: -