스프라이트

client/sprites/<이름>.json. 몸이 어떻게 생겼는지입니다.

{
  "image": "client/art/hero.png",
  "frameWidth": 24, "frameHeight": 32,
  "columns": 4, "margin": 1, "spacing": 2,
  "frameCount": 8,
  "offsetY": 2,
  "animations": {
    "idle": { "frames": [1, 1, 1, 2], "fps": 3 },
    "run":  { "frames": [5, 6, 7, 8], "fps": 10 },
    "jump": { "frames": [3], "loop": false },
    "fall": { "frames": [4], "loop": false }
  }
}

client/ 아래에 있습니다. 서버는 이 파일을 열지 않습니다 — 어떻게 생겼는지는 어디에 설 수 있는지와 아무 상관이 없고, 그림이 있어야 점프를 판정할 수 있는 게임 서버는 그래픽 카드 없이는 못 도는 게임 서버입니다.

image 시트 경로
frameWidth frameHeight 한 프레임의 크기
columns margin spacing frameCount 시트를 어떻게 자르는지. 타일셋과 같습니다
offsetX offsetY 몸의 위치가 프레임 안 어디인지

어느 애니메이션이 도는지는 말하지 않습니다

이름이 솔버의 상태 이름입니다: idle run jump fall climb dash wallSlide swim. 서버가 이미 몸이 무엇을 하는 중인지 보내고 있으므로, run 이라는 애니메이션을 그려 두면 몸이 달릴 때 그것이 돕니다. 언제 바꾸라고 쓸 곳이 없습니다.

시트에 없는 이름은 idle 로 떨어집니다. 그래서 애니메이션 하나짜리 스프라이트도 정상입니다 — 서 있기만 하는 캐릭터는 나머지를 그리는 동안 배포할 수 있는 캐릭터입니다.

loop: false 는 마지막 프레임에서 멈춥니다. 점프가 반복되면 캐릭터가 공중에서 팔을 퍼덕입니다.

몸에 붙이기

서버에서, 이름으로:

Map.spawn({
    sprite = "hero",
    halfWidth = 7, halfHeight = 15,
}, x, y)

와이어에는 숫자만 갑니다 — 맵이 자기가 쓰는 스프라이트 이름 목록을 들고 있고, 몸은 그 목록의 몇 번째인지를 1바이트로 실어 보냅니다. 그 1바이트는 몸이 처음 나타날 때 한 번 가고, 그 뒤로는 가지 않습니다.

방향

속도로 정합니다. 왼쪽으로 가면 뒤집히고, 멈추면 보던 쪽을 유지합니다. 멈출 때마다 오른쪽을 보게 하면 점프 꼭대기마다 모든 캐릭터가 한 방향으로 돌아섭니다.

여백

타일셋과 같은 이유로 margin / spacing 을 두고 프레임 가장자리를 한 픽셀 바깥으로 복사해 두세요. 없으면 프레임이 화면 픽셀에 정확히 얹히지 않는 순간 옆 프레임을 함께 읽습니다.