pyxen.GridBody
GridBody는 GridMap과 상호작용하는 그리드 기반 충돌 컴포넌트입니다.
충돌 개념은 충돌을 참조하세요.
생성자
GridBody(
*,
pos=None,
size=None,
move=None,
tag=None,
mask=None
)
모든 매개변수는 키워드 전용입니다.
매개변수
| 매개변수 | 타입 | 설명 |
|---|---|---|
pos | (x, y) | 초기 위치 (픽셀) |
size | (w, h) | 바디 크기 (픽셀) |
move | (x, y) | 이동 벡터 |
tag | int | 바디 태그 |
mask | (int, …) | 충돌할 타일 태그 튜플 |
예시
e = world.spawn(
name="hero",
sprite=sprite,
layer=LAYER_HERO,
body=GridBody(
pos=(64, 64),
size=(16, 16),
move=(0, 0),
tag=TAG_PLAYER,
mask=(TAG_WALL, TAG_MONSTER)
)
)
GridBody 첨부
spawn() 시:
player = world.spawn(
body=GridBody(pos=(32, 32), size=(16, 16))
)
또는 나중에:
entity = world.spawn()
entity.body = GridBody(size=(16, 16))
속성
move
튜플 또는 Vector2로 프레임당 이동 벡터를 설정합니다. move는 부동소수점을 허용하므로, 서브픽셀 속도로 이동할 수 있습니다:
body.move = (1, 0) # 1 pixel/frame
body.move = (0.5, 0) # half a pixel/frame — moves 1px every other frame
move는 프레임 간에 유지됩니다 (프레임당 속도입니다); 멈추려면 (0, 0)으로 설정하세요. 위치는 픽셀 단위로 정확하게 유지됩니다: 소수점 이동은 누적되어 한 번에 한 픽셀씩 적용되므로, 충돌과 렌더링이 선명하고 결정론적으로 유지됩니다.
move를 읽으면 Vector2를 반환합니다:
m = body.move
print(m.x, m.y)
pos
바디의 왼쪽 위 모서리이며, 정수 픽셀 단위입니다. GridBody(pos=...)가 받는 값과 같습니다. 엔티티의 x와 y는 바디의 중심으로, pos에 size의 절반을 더한 위치입니다.
pos를 설정하면 바디가 사이에 있는 것을 지나 충돌 없이 곧바로 그 자리로 옮겨집니다. move는 그대로 유지되고, 엔티티의 x와 y도 같은 프레임에 따라옵니다. pos를 읽으면 Vector2가 반환됩니다.
body.pos = (32, 64) # 왼쪽 위 모서리를 (32, 64)에
size = body.size
body.pos = (spot.x - size.x / 2, spot.y - size.y / 2) # 중심을 spot에
size
바디의 너비와 높이이며, 정수 픽셀 단위입니다. GridBody(size=...)로 정한 값입니다. 읽기 전용이며 Vector2입니다.
예정된 속성
| 속성 | 설명 |
|---|---|
tag | 바디 태그 |
mask | 충돌 마스크 |
태그 시스템
tag
각 바디에는 하나의 태그가 있습니다:
body.tag = TAG_PLAYER
mask
마스크는 이 바디가 충돌할 태그를 정의합니다:
body.mask = (TAG_WALL, TAG_MONSTER)
GridBody + GridMap 상호작용
GridBody는 GridMap의 타일 및 다른 GridBody와 태그 필터링을 기반으로 충돌합니다.
충돌이 처리되려면 GridBody가 GridMap 엔티티의 자식이어야 합니다.
이동 예시
body = player.body
if input.keyboard.left.down:
body.move = (-1, 0)
if input.keyboard.right.down:
body.move = (1, 0)
최소 설정
level = world.spawn(
map=GridMap(
rows=10,
columns=10,
size=(16, 16)
)
)
player = world.spawn(
parent=level,
body=GridBody(
pos=(16, 16),
size=(16, 16),
tag=1,
mask=(2,)
)
)
일반적인 패턴: 플레이어 vs 벽
TAG_PLAYER = 1
TAG_WALL = 2
player = world.spawn(
body=GridBody(
pos=(32, 32),
size=(16, 16),
tag=TAG_PLAYER,
mask=(TAG_WALL,)
)
)
타일이 다음과 같이 설정되면:
map.set(row=0, column=5, tag=TAG_WALL)
플레이어가 해당 타일과 충돌합니다.