맵 문서
shared/maps/<이름>.json. 서버가 판정에 쓰고, 클라이언트가 그림에 쓰고, 에디터가
엽니다 — 하나의 파일을 세 곳이 읽습니다.
{
"width": 64, "height": 24, "tileSize": 16,
"tileset": "world",
"layers": [
{ "name": "main", "tiles": [1, 1, 1, 0, 2, 3] }
],
"movers": [
{ "path": [{"x": 100, "y": 40}, {"x": 300, "y": 40}],
"speed": 60, "halfWidth": 48, "halfHeight": 8 }
],
"points": [ { "name": "spawn", "x": 64, "y": 48 } ],
"areas": [ { "name": "to-dungeon", "x": 96, "y": 32, "width": 32, "height": 48 } ]
}
칸
layers[].tiles 는 타일 id 의 배열입니다. 0 은 빈 칸, 나머지는 타일셋의 몇
번째 타일인지입니다. 행 우선이고 아래 줄이 먼저입니다 — 첫 width 개가 맵의
바닥 줄입니다.
칸 수가 width × height 와 다르면 거부됩니다. 어딘가에서 한 줄이 어긋난
것이고, 모자란 곳을 채우는 일은 그 어긋남을 어디에 둘지 정하는 일입니다.
무엇이 벽인지는 여기 없습니다. 그것은 타일셋이 정합니다. 벽은 어디에 놓여도 벽이고, 그 사실을 칸마다 되풀이하는 맵은 자기 자신과 어긋날 수 있습니다.
레이어
여러 장을 겹칩니다. 판정은 모든 레이어의 합집합이고, 그림은 가장 위에 무언가를 놓은 레이어의 것입니다. 앞에 장식을 깐다고 뒤의 벽이 사라지지 않습니다.
움직이는 발판
path |
지나는 점들. shape: "circle" 이면 점 하나가 중심입니다 |
speed |
초당 몇 픽셀 |
halfWidth halfHeight |
발판의 반지름 |
shape |
path(기본) 또는 circle |
radius |
원일 때의 반지름 |
pingPong |
끝에서 돌아올지. 경로는 기본 참, 원은 기본 거짓 |
oneWay |
아래에서 통과할 수 있는지 |
phase |
처음에 얼마나 앞서 있을지 |
rate |
시계가 도는 속도. 1 정상, 0 정지, -1 역방향 |
발판의 위치는 시간의 함수입니다. 어느 순간에 어디 있는지는 그 순간으로부터 계산되고, 저장되지 않습니다. 그래서 클라이언트가 지난 몇 초를 다시 굴려도 서버와 같은 답에 도착합니다.
이름 붙은 자리와 구역
points 와 areas 는 이름과 좌표일 뿐입니다. 그것이 스폰인지 문인지 엔진은
모르고, 이름을 읽는 게임만 압니다.
local town = map.loadTiles("town")
local spawn = town.point("spawn")
local door = town.area("to-dungeon")