towerHandler와 towerModel - tower생성시 서버에 tower의 좌표를 저장하고, 검증하도록 구현
// 클라이언트 타워 vs 서버 타워 비교 함수
function compareTowers(currentTowers, gameTowers) {
//길이가 다르면 차이가 있음
if (currentTowers.length !== gameTowers.length) {
return true;
}
// currentTower와 gameTower의 각 요소를 순회하며 비교
for (let i = 0; i < currentTowers.length; i++) {
const currentTower = currentTowers[i];
const gameTowerPosition = gameTowers[i];
//좌표를 비교
if (
currentTower.tower.X !== gameTowerPosition.x ||
currentTower.tower.Y !== gameTowerPosition.y
) {
return true; //차이가 있음
}
}
return false; //차이가 없음
}
goldHandler와 goldModel - gold의 변동사항이 있을 시, 서버에 저장하고 검증하도록 구현
//골드의 변화를 업데이트한다
export const goldChangeHandler = (userId, payload) => {
let userGold = getGold(userId);
if (userGold === undefined) {
return {
status: 'fail',
message: 'Not found User Gold',
};
}
const plusGold = payload.gold;
userGold += plusGold;
setGold(userId, userGold);
return {
status: 'success',
message: `Gold Update: ${payload.gold}`,
handlerId: 5,
gold: userGold,
};
};
몬스터 스폰 주기 재설정 - 몬스터의 스폰 주기를 level에 따라서 변경되도록 구현
황금 고블린 스폰 - 일반 몬스터와 별개의 스폰 주기를 가지도록 구현
//몬스터의 스폰주기 설정
function startSpawning() {
// 기존 interval이 있다면 중지
if (intervalId !== null) {
clearInterval(intervalId);
}
// 새로운 interval 시작
intervalId = setInterval(spawnMonster, monsterSpawnInterval);
}
//황금 고블린 스폰주기 설정
function startGoldGoblinSpawning() {
// 기존 interval이 있다면 중지
if (goldGoblinintervalId !== null) {
clearInterval(goldGoblinintervalId);
}
// 새로운 interval 시작
goldGoblinintervalId = setInterval(spawnGoldGoblin, monsterSpawnInterval * 3);
}
타워 업그레이드 이미지 변경 - 타워 업그레이드 시 이미지가 바뀌도록 구현
문제 및 해결
- 몬스터 스폰 주기를 변경할 때, setInterval의 인자를 바꿔도 주기가 재설정 되지 않는 문제가 있었습니다. 이것을 clearInterval을 활용하여 새롭게 주기를 설정하도록 하였습니다.
- towerHandler 및 goldHandler의 경우 model의 형태가 여러 유저의 정보를 가지고 있어야 하는 점에 적합하지 않았습니다. 배열로 선언된 model을 객체로 바꿔서 효율적으로 만들고, 모든 유저의 정보를 clear하지 않고, 현재 유저의 정보만 clear하도록 만들 수 있었습니다.