첫 게임
폴더
프로젝트는 폴더 하나입니다. 세 개의 뿌리가 있고, 뿌리가 곧 누가 읽을 수 있는지입니다.
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 로 두면 두 사람이 같은 세계에서 만납니다.