첫 게임

폴더

프로젝트는 폴더 하나입니다. 세 개의 뿌리가 있고, 뿌리가 곧 누가 읽을 수 있는지입니다.

my-game/
  chain2d.project.json
  server/
    main.luau            서버만 읽습니다. 플레이어에게 내려가지 않습니다.
  shared/
    maps/town.json       양쪽이 읽습니다. 서버는 판정을, 클라이언트는 그림을.
    tilesets/world.json
    motion.luau          (선택) 양쪽이 함께 도는 움직임 모듈
  client/
    boot/main.luau       로그인 전 화면. 이 폴더만 익명으로 내려갑니다.
    boot/ui/lobby.json
    main.luau            들어간 뒤의 화면
    art/tiles.png

server/ 아래의 파일은 어떤 플레이어에게도 내려가지 않습니다. client/ 아래는 전부 내려갑니다 — 거기에 비밀을 두지 마세요. client/boot/로그인하지 않은 사람도 받을 수 있는 유일한 곳이고, 그래서 로비가 거기에 있습니다.

가장 짧은 서버

-- server/main.luau
local town = Chain2D.Map.load("main").loadTiles("town")
local spawn = town.point("spawn")

Chain2D.Players.playerAdded(function(player)
    local body = Chain2D.Map.get("main").spawn({
        halfWidth = 8, halfHeight = 14,
    }, spawn.x, spawn.y)
    Chain2D.Map.get("main").setOwner(body, player.id)
end)

세 줄이 하는 일: 맵 문서를 불러 바닥을 만들고, 문서가 이름 붙인 자리를 찾고, 사람이 들어오면 그 자리에 몸을 놓아 그 사람에게 맡깁니다. 좌표를 도는 반복문이 스크립트에 없습니다 — 그것은 파일에 있고, 에디터가 그 파일을 엽니다.

가장 짧은 로비

-- client/boot/main.luau
local screen = Chain2D.UI.load("lobby")
local status = screen.find("status")

screen.find("action"):set({
    text = "시작",
    onPressed = function()
        local ok, why = Chain2D.Auth.signIn(Chain2D.Auth.providers()[1])
        if not ok then status:set({ text = why }) end
    end,
})

화면의 생김새는 client/boot/ui/lobby.json 에 있습니다. 스크립트가 정하는 것은 무엇이 언제 바뀌는지입니다.

돌려보기

Creator 에서 실행을 누르면 로컬 서버가 뜨고 클라이언트가 붙습니다. 클라이언트 수를 2 로 두면 두 사람이 같은 세계에서 만납니다.