본문 바로가기

[Node.js 팀 과제]

타워 디펜스 게임

 

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하도록 만들 수 있었습니다.