ts
**// (호스트만 적용) 사용자가 “게임 선택” 버튼을 누르면 호출**
onSelectButtonClick() {
if (!this.selectedScene) return;
const roomId = GameState.createdRoomId;
// GameState.isHost는 true여야 함
if (GameState.isHost && roomId && window.socket) {
window.socket.emit("game-event", {
type: "move-scene",
payload: { sceneName: this.selectedScene },
roomId,
});
}
}
this.selectedScene
에 앞서 selectScene()
호출로 저장된 씬 이름이 있어야 함.GameState.isHost === true
여야 이벤트를 실제로 emit(전송).roomId
와 함께 { type: "move-scene", payload: { sceneName }, roomId }
형태로 서버에 보냄. (선택한 게임 씬, 현재 방 ID 전송)ts
// onLoad() 내부에 등록된 게임 이벤트 리스너
this._gameEventHandler = (message: any) => {
switch (message.type) {
case "move-scene":
const sceneName = message.payload?.sceneName;
if (sceneName) {
**// 서버에서 “move-scene”을 브로드캐스트(정상적으로 emit수신 후)하면 씬 전환**
cc.director.loadScene(sceneName);
}
break;
case "host-left":
// 호스트가 나가면 MainScene으로 복귀
GameState.resetMultiplay();
cc.director.loadScene("MainScene");
break;
default:
break;
}
};
window.socket.on("game-event", this._gameEventHandler);
내용
game-event
메시지 중 type === "move-scene"
이면payload.sceneName
을 꺼내 cc.director.loadScene(sceneName)
호출MultiMoleGameScene
, 또는 MultiGameResult
)이 로드됨정리 : window.socket.emit(클라이언트가 전송) → socket.on(서버가 수신 후 방 전체(호스트,게스트)로 브로드캐스트) → widow.socket.on (클라이언트가 브로드캐스트를 수신해서 씬 전환 등을 수행)
js
io.on("connection", (socket) => {
**// 클라이언트가 방 입장을 요청했을 때**
socket.on("join-room", (roomId) => {
socket.join(roomId);
});
// .. game-event, leave-room 등 이벤트 내용…
});
socket.emit("join-room", roomId)
를 보내면socket.join(roomId)
으로 해당 소켓을 해당 방(Room)에 속하도록 함js
socket.on("game-event", async (data) => {
const { type, payload, roomId } = data;
if (!roomId) return;
switch (type) {
case "move-scene":
**// payload.sceneName이 반드시 있어야 함(선택한 게임 씬)**
if (!payload?.sceneName) return;
**// 1.2초 딜레이(게스트,호스트 수신 타이밍 고려) 후 방 전체에 동일 이벤트 브로드캐스트**
setTimeout(() => {
io.to(roomId).emit("game-event", {
type: "move-scene",
**payload: { sceneName: payload.sceneName }(클라이언트 emit 필수 정보)**
});
}, 1200);
break;
// … game-event 타입(점수 저장, spawn-mole 등)
}
});
{ type: "move-scene", payload: { sceneName }, roomId }
를 수신payload.sceneName
이 유효하면 1.2초 지연한 뒤io.to(roomId).emit("game-event", { type: "move-scene", payload: { sceneName } })
형태로 방에 속한 모든 소켓(호스트·게스트)에게 브로드캐스트