상대 게임 탈주시 상태동기화 인터벌이 날뛰는 문제
user 클래스 안에서 intervalManager가 상태동기화를 일정 주기로 관리해주고 있음.
현재 onEnd 이벤트에서 누군가 한명이 꺼지면 게임세션을 날려버림.
그래서 남은 사람 intervalManager가 혼자 갈길을 잃은 것.
수정 전 onEnd 이벤트 한 명만 나가도 게임세션이 삭제됨.
export const onEnd = (socket) => async () => {
await removeUser(socket); // 매칭 돌려 유저 세션에 등록된 경우 유저 세션에서 제거
if (socket.id && ) {
removeGameSession(socket.id);
} else {
}
console.log('클라이언트 연결이 종료되었습니다.');
};
나간 사람만 게임세션에서 제거해줌.
변경한 코드
try {
const gameSession = getGameSession(socket.id);
// 게임 세션에 참가한 경우
if (socket.id) {
const user = gameSession.getUser(socket.uuid);
const intervalManager = user.getIntervalManager();
intervalManager.clearAll(); // 상태동기화를 해제
gameSession.removeUser(socket); // 게임세션에서 유저 제거
// 게임 세션에 남은 사람이 없다면 게임 세션을 제거
if (!gameSession.users) {
removeGameSession(socket.id);
}
} else {
} // 게임 세션에 참가 안한채로 종료한 경우
} catch (error) {
throw new Error(`클라이언트 종료 중 알 수 없는 에러 ${error}`);
}
게임 세션에 나혼자 남아있다면 승리 이벤트를 보내줘야함.
이전 코드 towerAttackHandler, monsterSpawnHandler 의 포함되어 있는 검증
if (!opponentUser) {
throw new Error('상대 유저를 찾지 못했습니다.');
}
상대가 없으면 gameOverNotification을 통해서 승리를 아림.
변경한 코드
if (!opponentUser) {
console.log(`(상대가 탈주함) 살아남은 ${socket.uuid}의 승리`);
socket.write(createGameOverPacket(true));
return;
}
----------------------------------------
export const createGameOverPacket = (isWin) => {
const protoMessage = getProtoMessages();
const response = protoMessage.common.GamePacket;
const message = { gameOverNotification: { isWin: isWin } };
const packet = response.encode(message).finish();
return serializer(packet, config.packetType.gameOverNotification, 1);
};
'TIL' 카테고리의 다른 글
Tower Defense Online Project 트러블 슈팅 - 5 (1) | 2024.11.12 |
---|---|
Tower Defense Online Project 트러블 슈팅 - 4 (0) | 2024.11.12 |
Tower Defense Online Project 트러블 슈팅 - 2 (0) | 2024.11.12 |
Tower Defense Online Project 트러블 슈팅 - 1 (0) | 2024.11.12 |
데이터 중심 동기화 (Data-oriented Synchronization)에 대하여 (Node.js 중심) (0) | 2024.11.09 |