pyxen.GridMap

GridMapは行と列に配置されたセルで構成される空間コンテナです。

タイルレイアウト、セルサイズ、オプションのタイルアトラス、およびGridBodyの衝突空間を定義します。

衝突のコンセプトについては衝突判定を参照してください。


コンストラクタ

GridMap(
    *,
    rows=None,
    columns=None,
    size=None,
    image=None,
    tilemap=None
)

すべてのパラメータはキーワード専用です。


パラメータ

パラメータ型説明
rowsintグリッドの行数
columnsintグリッドの列数
size(width, height)ピクセル単位のセルサイズ
imagestrタイルアトラス画像名
tilemapstrセルを事前読み込みする .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

プロパティ型デフォルト
activeboolTrue

このマップの衝突シミュレーションを実行するかどうかを制御します。Falseの場合、このマップにアタッチされたGridBodyのボディ移動、衝突、コールバックは処理されません。

# 衝突を一時停止(例:ポーズメニュー)
level.map.active = False

# 衝突を再開
level.map.active = True

map.rows, map.columns

プロパティ型
rowsint
columnsint

マップのサイズ(セル単位):作成時に指定したもの、または .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
)

パラメータ

パラメータ型説明
rowintグリッドの行インデックス
columnintグリッドの列インデックス
tile(x, y)アトラス内のタイル座標
tagintオプションの衝突タグ

例:タイルの設定

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)

パラメータ

パラメータ型説明
rowintグリッドの行インデックス
columnintグリッドの列インデックス

戻り値

値型説明
tile(x, y) または -1アトラス内のタイル座標。タイルのないセル(空、またはタグだけ)は -1
tagintセルのタグ。ない場合は 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 — ダメージゾーン

タグはゲームプレイや衝突システムで解釈されます。