私は最新の MUD エンジンのプロトタイプを作成しています。MUD はシミュレーションの単純な形式であり、私が取り組んでいる概念をテストするための優れた方法を提供します。これにより、コード内のいくつかの場所が少し不明確になり、設計に問題が生じています (おそらく欠陥があるため)。私は最初にモデルを使用しており (これを変更する必要があるかもしれません)、ゲーム オブジェクトのトップダウン アーキテクチャを設計しました。私はこれを完全に間違っているかもしれません。
私が行ったことは、MUDObject エンティティを作成することです。このエンティティは、事実上、キャラクター、そのアイテム、人種など、他のすべての論理構造のベースです。また、属性、イベント、およびフラグと同様に、論理的な目的で使用される 3 つのメタ クラスのセットも作成しました。 . それらはかなり単純で、すべて 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();
}
}
私は2つのことに興味があります。
MUDObject から派生した型ごとに個別の ObjectSet を持つようにコンテキストを再コーディングする方法はありますか?
- すなわち context.MUDObjects.Flags または context.Flags
- そうでない場合、具体的に子タイプを照会するにはどうすればよいですか?
私が使用している Update/Pause/Resume/Stop アーキテクチャは、EF エンティティに直接配置した場合に正しく機能しますか? データのみを目的としているよりも与えられた?
- ロックは問題になりますか?
- 部分クラスは、変更が行われたときに自動的にコミットしますか?
- フラット リポジトリを使用して、ゲーム エンジンで直接これを行う方がよいでしょうか?