1

それで、頭の上で壊れたリンクと説明を少し調べました。

たとえば、所有者がアイテムを持ち、アイテムも所有者によって保持されます。

私のサーバーは、循環参照の格納に問題はありません。しかし、クライアントが最初にサインインしたときに、プレーヤーオブジェクトをクライアントに送信します。これを行う方法に頭を悩ませています。アイテムは、プレーヤーが頭に手を袋に入れるなど、インベントリスロットでプレーヤーが保持できます...アイテムは、x、yの場所で地面にある可能性もあります。ポインターとして機能します。JSON 文字列オブジェクトを渡すのではなく。

円形のオブジェクトを渡すことができるのは素晴らしいことか、ID を使用してアイテムの場所を参照できる単純な関数です。

これが私の最善の解決策です

//create an object
//   run this function
function createRefrence(ref){
    container = io.sockets.containersById.push(ref)
    io.sockets.containersById[container-1]={ref:ref}
    return (container-1)
}

//戻り値をオブジェクトのプロパティとして保存

4

1 に答える 1

2

簡単に言えば、しないでください。循環参照では、実際には何も得られません。この種のデータを非循環的な方法で表現するには、3 つの基本的な方法があります。ポインタとしてIDを持っていると言うとき、あなたは正しい方向に向かっています。

私がこれを行う方法は、他のすべてがユーザーのキャラクターをリストするデータ形式を持ち、アイテムを参照するだけで、実際にはキャラクターのデータ構造内にそれらを配置しない1つの巨大なオブジェクトを作成しようとするのではなく、. .

各オブジェクトには、2 つを接続する何らかの種類の ID があります。これを XML で行うと (より良い構文が必要なため)、次のようになります...

<character>
   <possession ref='1' status='worn' />
   <possession ref='2' status='inventory' />
</character>

<world>
   <item ref='3' xpos='3' ypos='4' />
</world>

<object id='1' name='clothing' hp='12' />
<object id='2' name='gadget' hp='0' />
<object id='3' name='cash' hp='0' />

それを解析すると、参照がオブジェクトをキャラクターまたは世界に接続していることがわかります。したがって、実際のオブジェクトを構築する際に、それぞれに相互参照を与えます。

あるいは、このようなことをすることもできます...

<character>
   <object id='1' name='clothing' hp='12' />
   <object id='2' name='gadget' hp='0' />
</character>

<world>
   <object id='3' name='cash' hp='0' />
</world>

繰り返しになりますが、キャラクターが所有するオブジェクトは明示的ですが、他の方法のリンクは暗黙的であり、パーサーはそれを再構築する必要があることに注意してください。

または、接続が他のオブジェクトから完全に削除され、外部化される SQL のリンク テーブルに似たようなことを行うこともできます。この形式の良いところは、何も暗示されていないことです。双方向リンクは非常に明確に記述されており、それらを再構築するパーサーは非常に単純です。

<character id='1'>
   ...
</character>

<object id='1' ... />

<link character='1' object='1' />

もちろん、同じセマンティクスを選択した形式で表すことができるため、JSON または好みの形式でこれを行うことができます。

また、これが役立つこともあるかもしれません.デシリアライズします。いずれにせよ、残念ながら解析コードを書くことになります!

于 2012-08-19T16:28:50.207 に答える