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 — 데미지 존

태그는 게임플레이 또는 충돌 시스템에 의해 해석됩니다.