pyxen.world.all()

コンポーネントでエンティティをクエリします。

world.all(*components, without=None)

クエリに一致するすべてのエンティティのイテレータを返します。

これはPyxenのECSシステムの中核です。


基本的な使い方

for e in world.all("enemy"):
    e.health.value -= 1

"enemy"コンポーネントを持つすべてのエンティティを反復処理します。

コンポーネントは**名前(文字列)**で識別されます。


複数コンポーネント

複数のコンポーネントを要求できます:

for e in world.all("position", "velocity"):
    e.position.x += e.velocity.x

両方のコンポーネントを持つエンティティのみが返されます。

これは以下と同じです:

ANDクエリ

コンポーネントの除外(without

withoutキーワードを使用して、特定のコンポーネントを持つエンティティを除外できます。

for e in world.all("enemy", without=("dead",)):
    attack(e)

これは以下を意味します:

  • "enemy"を持つ必要がある
  • "dead"を持ってはいけない

完全な構文

world.all(
    "required_component_1",
    "required_component_2",
    ...,
    without=("excluded_component_1", "excluded_component_2")
)
  • 必須コンポーネントは位置引数
  • withoutはタプルでなければならない

例:Game of Life

for cell in world.all("cell"):
    if cell.alive and cell.next_alive:
        cell.color = (0.25, 0.15, 0.85, 1.0)

例:生存セルのみ

for cell in world.all("cell", without=("dead",)):
    update(cell)

クエリでのマーカーコンポーネント

マーカーコンポーネント(ブーリアンのみのコンポーネント)もまったく同じように動作します。

e.enemy = True

その後:

for e in world.all("enemy"):
    ...

マーカーはクエリで非常に効率的です。


クエリでの組み込みコンポーネント

組み込みコンポーネントでエンティティをクエリできます:

for e in world.all("sprite"):
    e.color = (1, 0, 0, 1)

以下の組み込みコンポーネント名がサポートされています:

名前一致するエンティティ
"sprite"スプライト(画像が割り当てられた)を持つ
"body"グリッドボディ(衝突ボディ)を持つ
"camera"カメラを持つ
"sound"効果音を持つ
"music"ミュージックストリームを持つ
"map"グリッドマップ(タイルマップ)を持つ

組み込みとカスタムのコンポーネントを同じクエリで混在できます:

for e in world.all("sprite", "enemy"):
    e.color = (1, 0, 0, 1)

除外も動作します:

for e in world.all("sprite", without=("body",)):
    ...

クエリの動作

内部的に:

  1. クエリは必須のコンポーネントスキーマを収集
  2. 除外するコンポーネントスキーマを収集
  3. 一致するエンティティを反復処理
  4. Entityハンドルをyield

コンポーネント名が存在しない場合:

  • 警告がログに記録される
  • クエリは続行される

重要な注意事項

コンポーネント名は文字列でなければならない

world.all("health")

正しい。

world.all(health)

不正。


withoutはタプルでなければならない

world.all("enemy", without=("dead",))

正しい。

world.all("enemy", without="dead")

不正。


戻り値

world.all()はイテレータを返します。

以下が可能:

list(world.all("enemy"))

または:

for e in world.all("enemy"):
    ...

安全に関する注意事項

必須のコンポーネントが存在しない場合:

  • 警告がログに記録される
  • クエリは続行される

渡すコンポーネントが多すぎる場合、エンジンの内部上限が適用されます。