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",)):
...
クエリの動作
内部的に:
- クエリは必須のコンポーネントスキーマを収集
- 除外するコンポーネントスキーマを収集
- 一致するエンティティを反復処理
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"):
...
安全に関する注意事項
必須のコンポーネントが存在しない場合:
- 警告がログに記録される
- クエリは続行される
渡すコンポーネントが多すぎる場合、エンジンの内部上限が適用されます。