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— 데미지 존
태그는 게임플레이 또는 충돌 시스템에 의해 해석됩니다.