pyxen.GridMap
GridMapは行と列に配置されたセルで構成される空間コンテナです。
タイルレイアウト、セルサイズ、オプションのタイルアトラス、およびGridBodyの衝突空間を定義します。
衝突のコンセプトについては衝突判定を参照してください。
コンストラクタ
GridMap(
*,
rows=None,
columns=None,
size=None,
image=None,
tilemap=None
)
すべてのパラメータはキーワード専用です。
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
rows | int | グリッドの行数 |
columns | int | グリッドの列数 |
size | (width, height) | ピクセル単位のセルサイズ |
image | str | タイルアトラス画像名 |
tilemap | str | セルを事前読み込みする .tilemap アセット名 |
例
level_map = GridMap(
rows=10,
columns=16,
size=(16, 16),
image="tileset"
)
GridMapのアタッチ
生成時:
level = world.spawn(
map=GridMap(
rows=10,
columns=16,
size=(16, 16),
image="tileset"
)
)
または後から:
entity = world.spawn()
entity.map = GridMap(rows=8, columns=8, size=(16, 16))
プロパティ
map.active
| プロパティ | 型 | デフォルト |
|---|---|---|
active | bool | True |
このマップの衝突シミュレーションを実行するかどうかを制御します。Falseの場合、このマップにアタッチされたGridBodyのボディ移動、衝突、コールバックは処理されません。
# 衝突を一時停止(例:ポーズメニュー)
level.map.active = False
# 衝突を再開
level.map.active = True
map.rows, map.columns
| プロパティ | 型 |
|---|---|
rows | int |
columns | int |
マップのサイズ(セル単位):作成時に指定したもの、または .tilemap を描いたときのサイズです。読み取り専用。セルのサイズを掛けるとマップのピクセルサイズになり、カメラの範囲や、ボディをマップの中に留めるのに使えます。
# マップのピクセルサイズ
w = level.map.columns * 16
h = level.map.rows * 16
タイルの変更
map.set()でタイルを設定します。
map.set(
row=0,
column=1,
tile=(tile_column, tile_row),
tag=optional_tag
)
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
row | int | グリッドの行インデックス |
column | int | グリッドの列インデックス |
tile | (x, y) | アトラス内のタイル座標 |
tag | int | オプションの衝突タグ |
例:タイルの設定
level.map.set(
row=2,
column=5,
tile=(3, 1)
)
例:衝突タグの追加
level.map.set(
row=4,
column=2,
tile=(0, 0),
tag=1 # 壁
)
タイルの読み取り
map.get(row, column) はセルの中身をペア (tile, tag) で返します。map.set() で置いたもの、または .tilemap に描かれたものです。
tile, tag = level.map.get(row, column)
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
row | int | グリッドの行インデックス |
column | int | グリッドの列インデックス |
戻り値
| 値 | 型 | 説明 |
|---|---|---|
tile | (x, y) または -1 | アトラス内のタイル座標。タイルのないセル(空、またはタグだけ)は -1 |
tag | int | セルのタグ。ない場合は 0 |
マップの外では、get はエラーではなく (-1, 0) を返します。端の一つ先のセルも確かめられます。
例:セルを読む
tile, tag = level.map.get(4, 2)
if tag == 1:
print("a wall")
if tile == -1:
print("ここには何も描かれていない")
シングス
.tilemap はセルに シングス(things)の名前を置けます:宝箱、扉、ヒーローのスタート地点など。map.things() はそれらを (name, row, column) のリストとして、行、次に列の順で返します。シングスのないマップや、rows/columns を明示して作ったマップでは空のリストです。
village = world.spawn(map=GridMap(tilemap="village"))
for name, row, column in village.map.things():
if name == "chest":
place_chest(row, column) # ゲーム側の関数
シングスの名前はスプライトの名前、またはカインド(kind)の名前です。カインドはスプライトの一つのフレームにつけた名前なので、一つのスプライトから二つのカインド(slime と guard)を描けます。一つのセルにシングスは一つです。シングスを動かしたり描いたりするものはなく、それぞれの名前を何にするかはコードが決めます。呼ぶたびに新しいリストが返るので、自由に並べ替えたり空にしたりできます。
ファイルでは、どちらも省略可能なキーで、空のときは書かれません:
"kinds": [ {"frame": 1, "name": "guard", "sprite": "slime"} ],
"things": [ {"column": 16, "name": "chest", "row": 1} ]
グリッド座標
- 行は垂直方向に増加
- 列は水平方向に増加
範囲外のインデックスは安全に無視されます。
GridMap + GridBody
GridBodyはGridMapと連携して衝突、移動の解決、トリガー検出を行います。
GridBodyはGridMapエンティティの子でなければなりません。
level = world.spawn(
map=GridMap(
rows=8,
columns=8,
size=(16, 16),
image="tiles"
)
)
player = world.spawn(
body=GridBody(),
parent=level
)
最小サンプル:基本レベル
level = world.spawn(
map=GridMap(
rows=8,
columns=8,
size=(16, 16),
image="tiles"
)
)
# 床を作成
for r in range(8):
for c in range(8):
level.map.set(row=r, column=c, tile=(0, 0))
# 壁を作成
for c in range(8):
level.map.set(row=0, column=c, tile=(1, 0), tag=1)
level.map.set(row=7, column=c, tile=(1, 0), tag=1)
タグ
tagはタイルごとのオプションのメタデータです。
典型的な使用例:
0— 空1— 壁2— 水3— ダメージゾーン
タグはゲームプレイや衝突システムで解釈されます。