あなたはentity component systemについて話しています。 JSに書かれたカップルがあります。最も普及しているのはCraftyですが、それは大きくても価値があります。私は最近、CoffeeScriptで書きました(ちょうどfunsiesのため、おそらくそれをリリースすることはありません)。
の衝突についての注意事項:
だから、最初、問題はあなたが考えているよりも悪いことがあります2つの方法が同じ名前を持っている場合、衝突が起こります。 JSは関数シグネチャを区別しません。また、それほど悪くはないかもしれません。なぜなら、それぞれの動作(意味の方法)が属しているコンポーネントにちなんで命名された名前空間のコンベンションを作成するのはなぜですか?burnable_burn
?
しかし、ミックスインはこれを構築する唯一の方法ではありません。つまり、ビヘイビア(つまり、コンポーネントでできること)はメソッドである必要はありません。私が尋ねる動機づけの質問は、どのように行動を引き起こすかということです。たとえば、次のようにすることができます。
if entity.hasComponent "burnable" #hasComponent provided by your framework
entity.burn()
しかし、それは私には正しいとは言えません。ゲーム内で起こっていることとあなたが持っているコンポーネントとの間に奇妙なつながりができます。エンティティが関連するコンポーネントを実装しているかどうかを確認することは厄介です。あなたのコンポーネントを持ってそれを行う必要があるものは何でも
entity.send("applySeriousHeat") #triggers whatever behaviors are there
そして:代わりに、私は行動がリスナーのイベントようにしたいと思います。したがって、コンポーネントをエンティティに追加すると、リスナーがイベントに登録されます。多分それは(ちょうどスケッチ)のようになります。
register: (entity) -> #called when you add a component to an entity
entity.listen "applySeriousHeat", -> #thing I do when this event is sent to me
#do burnination here
は、そのポイントを持ち帰るために、あなたがそれを行う場合は、あなたの行動は名前を持っていないので、あなたは、衝突を気にしないでください。実際には、 "衝突"が必要です。同じイベントに対して複数のコンポーネントが応答できるようにする必要があります。それは同時に燃えて溶けていくのでしょうか?
実際には、両方のセットアップを一緒に使用しました。私はコンポーネントの関数にentity.addComponent
mixを作った。メソッドとして振る舞いを単に呼び出すだけで便利なことがあるからです。しかし、ほとんどの場合、コンポーネントはデカップリングに役立つメソッドを呼び出すリスナーを宣言し、スコープ付きの名前を使用しなければならないという厄介さを軽減します。
驚くべき、徹底的な答えに感謝します! – preslavrachev
NP :)質問に答えた場合は、チェックボックスをオンにしてください。 –
はい、私はあなたの答えが本当に徹底していたので、あなたにクレジットを与えます、そして、私はそれを感謝します。しかし、当分の間、私はCraftyのようなgetComponent( "")モデルに固執すると思います。この素晴らしいフレームワークを私に提案してくれてありがとう。 – preslavrachev