2012-01-28 6 views
3

私はHtml5キャンバスのCoffeeScriptゲームエンジンで作業しています。私は非常にきちんとしたCoffeeScript implementationをチェックした後にミックスインを利用するという "クール"なアイデアを思いついた。私は、ミックスインベースのコンポーネントのセットを開発することによって、ゲームオブジェクトが通常提供するオブジェクトのさまざまな階層を減らすことが非常にクールなアイデアかもしれないと考えました。そして、実際のゲームを開発するときは、基本的に1つのコンポーネントから始めて、それを他のコンポーネントの束と混合することで、オンザフライで独自のゲームオブジェクトを構築することができます。これにより、階層が減少し、頻繁な変更が可能になります。CoffeeScriptゲームエンジンでミックスインを使用する場合

次に、いくつかのコンポーネントで同じシグネチャを持つメソッドを定義するなど、起こりうる衝突について考えました。今、私は以前ほど興奮していません。

どうすればよいですか?これは良い方法ですか?私はまだそれが好きです。特にJSの基盤となるプロトタイプのメカニズムがあり、その場で簡単に物を組み合わせることができます。

答えて

10

あなたは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を作った。メソッドとして振る舞いを単に呼び出すだけで便利なことがあるからです。しかし、ほとんどの場合、コンポーネントはデカップリングに役立つメソッドを呼び出すリスナーを宣言し、スコープ付きの名前を使用しなければならないという厄介さを軽減します。

+0

驚くべき、徹底的な答えに感謝します! – preslavrachev

+0

NP :)質問に答えた場合は、チェックボックスをオンにしてください。 –

+1

はい、私はあなたの答えが本当に徹底していたので、あなたにクレジットを与えます、そして、私はそれを感謝します。しかし、当分の間、私はCraftyのようなgetComponent( "")モデルに固執すると思います。この素晴らしいフレームワークを私に提案してくれてありがとう。 – preslavrachev

関連する問題