Entity System Frameworkのタイルマップ?


12

私はEntity System Frameworks、特にArtemisについて読んでいます。私に合っているかどうかを判断しようとしています。私はタイルベースの2Dピクセルアートゲームに厳密に取り組んでいますが、これほどリソース集約型になるとは思いません。過去に多くの継承を伴う標準OOPを常に使用していました。

Entity System Frameworkの現在の理解(まだ完全に把握しているかどうかはわかりません):

  • エンティティはIDに他なりません
  • コンポーネントは、エンティティコンポーネントプールに追加されるダムデータにすぎません
  • システムは、システムコンポーネントシグネチャに一致するすべてのエンティティを処理するために、世界に接続される更新機能です

私の理解が正しければ、このフレームワークにタイルマップとAIビヘイビアツリーを追加する概念化にかなり苦労しています。今後AIについてお聞きします。

このフレームワークにタイルマップを組み込む必要がありますか?または、タイルマップエディターで簡単に生成できるように、個別に保持する必要がありますか?

タイルマップをこのフレームワークに組み込む必要がある場合、各タイルは異なるエンティティですか?タイルマップはシステムですか?それとも、タイルマップ自体は、それから構築された継承を持つ単一のエンティティですか?

タイルマップが独立している場合、外部タイルマップに対してエンティティを衝突検出する最良の方法は何でしょうか?

私がリストした複数のオプションが正しいかもしれないことを理解していますが、誰かが過去にこれをやったことがあるなら、彼らは私の混乱にいくらかの光を当てることができるかもしれません。たぶん私が考えていない別の選択肢がありますか?

ありがとうございました。


完全にランダムなノート、X / Y座標はIDとしても機能します。エンティティシステムに実装することをお勧めしているわけではありませんが、エンティティシステムで行うのと同じ方法で、タイルにエフェクトを追加できます。
ウィリアムマリアガー

ちょっと、Byte56の提案を受け継いでいます。コンポーネントは、実際には無意味なデータ所有者である必要はありません。実際にそのデータを操作できると便利な場合があります。例えばベクトル。
jcora

私もこの提案が本当に好きです。タイルマップヘルパーをデータから分離したり、タイルマップを複数のコンポーネント/エンティティに分割したりすることなく、タイルマップをエンティティフレームワークに追加できます。
スペンサーマー

タイルマップは単なる別のコンポーネントであり、コリジョンシステムとレンダラーシステムは、タイルマップとタイルマップのレンダリングとの衝突を処理します
Kikaimaru

回答:


8

エンティティコンポーネントフレームワーク(Artemisに似ています)を実装してからしばらく経ちましたが、白紙の状態から始めた場合、別のことをしたとは思いません。

私の世界はエンティティフレームワークから完全に分離されています。世界を何らかのエンティティまたはエンティティのコレクションに変換することは、私には意味がありませんでした。私の世界はキューブを使用した3Dですが、タイルにも同じことが当てはまります。エンティティは世界の他のすべてを構成しますが、地形は分離されています。ただし、キューブが削除されると、「マテリアル」エンティティが生成されます。

衝突の検出はそれほど難しくありません。あなたの世界にはisSolidAt(x,y)、衝突システムが利用する型メソッドがありそうです。正直なところ、私はこれを別の答えですでに今日一度言ったことがありますが、あなたにとって最も意味のあることをしてください。タイルマップを個別にしたり、エンティティにしたりすることで、規則を破ることはありません。あなたが頭を包むことができるものは何でも最高です。私にとって、それは世界を分離し、他のすべてをエンティティにすることでした。


1
地図エンティティであるしましょう。他のエンティティは、マップのisSolidAtメソッドにどのようにアクセスしますか?
ヘラルドマーセット

マップをエンティティとして保存することは、おそらくこのような状況では素晴らしいアイデアではありません。この状況では、直接通信する必要があると思います。マップエンティティを担当するシステムは、マップエンティティにアクセスし、要求されたときにそのエンティティから情報を取得できます。
マイケルハウス

4

タイルマップをエンティティに個別のコンポーネントとして(すべてのタイルを内側に)追加し、タイルマップ用の個別のレンダラーもあるため、3Dまたは2Dでレンダリングできます。すべてのタイルをエンティティとして作成することは可能ですが、費用がかかります。

そんな感じ:


Entity e("map");
e.addComponent(new Tilemap("1.xml"));
e.addComponent(new TilemapRenderer2d(graphics));

tile map is something like that
class Tilemap
{
  array of tiles;
  getTileAtPosition(); 
  isWalkable ; etc;
}

class ITilemapRenderer
{}

class TilemapRenderer2d
{
draw() 
{ 
  foreach (tile in owner()->component()->tiles()) 
  {
    if (tile == ground) ground_sprite->draw() ....
  }
}

描画をロジックから分離する利点は、MVCパターンの基本的な考え方です


1
タイルマップ全体が単一のコンポーネントに含まれていますか?何らかのゲーム環境エンティティ/マスターエンティティに添付されていますか?レンダラーをタイルマップコンポーネントから分離することにより、かなり大きなメリットが得られることがわかります。
スペンサーマー

回答を更新していただきありがとうございます!コードスニペットが大好きです。
スペンサーマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.