Я создал прототип современного двигателя MUD. MUD - простая форма моделирования и обеспечивает хороший метод, позволяющий проверить концепцию, над которой я работаю. Это привело меня к нескольким местам в моем коде, где вещи, немного неясны, и дизайн ставится под сомнение (вероятно, из-за его недостатка). Сначала я использую модель (возможно, мне нужно это изменить), и я разработал архитектуру игровых объектов сверху вниз. Возможно, я ошибаюсь.Entity Framework Наследование и логика
Что я сделал, это создать объект MUDObject. Этот объект фактически является базой для всех моих других логических конструкций, таких как символы, их элементы, расы и т. Д. Я также создал набор из трех мета-классов, которые также используются для логических целей, а также атрибуты, события и флаги , Они довольно просты, и все они унаследованы от MUDObject.
Класс MUDObject предназначен для обеспечения поведения данных по умолчанию для всех объектов, включая удаление мертвых объектов. Автоматическая очистка полов. и т. д. Это также предназначено для облегчения этой логики, если это необходимо. Например, проверьте комнату, чтобы проверить, закончился ли эффект и удалив эффект (удалите флаг).
public partial class MUDObject
{
public virtual void Update()
{
if (this.LifeTime.Value.CompareTo(DateTime.Now) > 0)
{
using (var context = new ReduxDataContext())
{
context.MUDObjects.DeleteObject(this);
}
}
}
public virtual void Pause()
{
}
public virtual void Resume()
{
}
public virtual void Stop()
{
}
}
Я также получил класс World, он является производным от MUDObject и содержит зоны и комнаты (которые, в свою очередь, содержат игры объектов) и обрабатывает таймер для операции для запуска обновления. (Вероятно, будет перемещен, поставить здесь, как будто он работает бы ограничить его только объектами в мире в то время.)
public partial class World
{
private Timer ticker;
public void Start()
{
this.ticker = new Timer(3000.0);
this.ticker.Elapsed += ticker_Elapsed;
this.ticker.Start();
}
private void ticker_Elapsed(object sender, ElapsedEventArgs e)
{
this.Update();
}
public override void Update()
{
this.CurrentTime += 3;
// update contents
base.Update();
}
public override void Pause()
{
this.ticker.Enabled = false;
// update contents
base.Pause();
}
public override void Resume()
{
this.ticker.Enabled = true;
// update contents
this.Resume();
}
public override void Stop()
{
this.ticker.Stop();
// update contents
base.Stop();
}
}
Мне любопытно две вещи.
Есть ли способ перекодировать контекст, так что он имеет отдельные ObjectSets для каждого типа, производного от MUDObject?
- т.е. context.MUDObjects.Flags или context.Flags
- Если не так, как я могу запросить у ребенка типа конкретно?
ли Обновлять/Пауза/Возобновление/Стоп архитектуры Я использую работу должным образом при размещении в EF лиц непосредственно? чем для данных только для целей?
- Будет ли проблема блокировки?
- Выполняет ли частичный класс автоматически фиксировать изменения, когда они сделаны?
- Могу ли я лучше использовать плоский репозиторий и делать это прямо в игровом движке?
Ответственность миров «управлять мета мир» это включает в себя время, силы тяжести, расстояние, а также глобальный состав мира (местоположение районов). Мне нравится концепция единой ответственности. Я вижу, что вы подразумеваете под функцией Update. Я собираюсь интегрировать это непосредственно в логику сервера для сеанса (SuperSocket). Я буду искать пример использования абстрактного класса в качестве основы с моделью. Мне, возможно, придется редактировать текстовые шаблоны, которые могут быть трудными (хотя, возможно, и не для чего-то подобного). Спасибо за вход. –