2024-10-12 CH-4 팀프로젝트 (랜덤 타워 디펜스) 도전 기능 황금 고블린 출현

MOON·2024년 10월 13일
0

내일배움캠프 과제

목록 보기
21/36

오늘은 어제 팀원들과 병합하고 여러 테스트를 거쳐 깃허브 병합을 완료 후 추가로 해야할 기능과 추가로 하고 싶은 기능을 정했습니다. 그 중 저는 이번 발제의 황금 고블린 출현 구현을 맡았습니다.

황금 고블린은 서버에서 생성?

일단 이거를 서버에서 생성해 봐라? 피드백을 받았던거 같습니다. 음 이걸 어떻게 구현해되는 거지?라는 생각을 해보았습니다.

  1. 서버자체에서 황금 고블린 생성 확률 체크주기를 정하고 황금 고블린 확률계산하여 성공하면 클라이언트에게 socket.emit으로 고블린을 생성하라는 명령을 줄까? 였습니다.

  2. 클라이언트에서 생성 확률 체크주기를 정하고 sendEvent 메세지를 보내서 서버에선 핸들러 이벤트 함수를 작동하여 황금 고블린 생성확률을 계산하여 성공하면 클라에게 return으로 보내주는 형식으로 갈 것 인가? 음

일단 그래서 고민하다 2번으로 진행하였습니다. 그래도 지금까지 클라에서 sendEvent메세지를 보내고 서버에서 작동하는 형식으로 갔으니 이 형식으로 진행해 보기로 했습니다.

먼저 게임 데이터 테이블부터 수정해 주었습니다.

monster.json 몬스터의 정보를 가지고 있는 데이터 테이블입니다. 맨 마지막 id는 무조건 황금 고블린 id로 설정하는 것으로 채택하였습니다.

{
  "name": "monster",
  "version": "1.0.0",
  "data": [
    {
      "id": 1,
      "speed": 10,
      "power": 10,
      "score": 5,
      "hp": 10,
      "reward": 1
    },
    ...
    ...
    {               
      "id": 6,           <= 황금 고블린 정보
      "speed": 50,
      "power": 30,
      "score": 15,
      "hp": 100,
      "reward": 300
    }
  ]
}

waveLevel.json 웨이브 레벨의 정보를 가진 테이블입니다. 여기서 해당 웨이브의 황금 고블린 생성 확률을(goldMonsterProbability) 추가 작성해 주었습니다.

{
  "name": "wave_level",
  "version": "1.0.0",
  "data": [
    { "id": 1, "score": 0, "goldMonsterProbability": 0 },
    { "id": 2, "score": 50, "goldMonsterProbability": 2 },
    { "id": 3, "score": 300, "goldMonsterProbability": 3 },
    { "id": 4, "score": 500, "goldMonsterProbability": 7 },
    { "id": 5, "score": 1000, "goldMonsterProbability": 8 },
    { "id": 6, "score": 2000, "goldMonsterProbability": 10 },
    { "id": 7, "score": 5000, "goldMonsterProbability": 10 }
  ]
}

황금 고블린 생성주기?

자 이제 그럼 클라이언트에서 그래서 또 언제 황금 고블린 생성 확률을 체크할까?

  1. 웨이브 넘어갈때? 그냥 생성할까? 확률체크하지말고 근데 이거는 황금 고블린 느낌 보단 에픽 몬스터 느낌인것 같아서 패스했습니다.

  2. 동기화 처리가 될때마다 황금 고블린 생성 확률을 체크할까?

  3. 기타 등등....

황금 고블린 생성 주기를 고민끝에 팀원분들과 상의를 통해 동기화 할때 마다 고블린 생성 확률을 체크하라는 sendEvent메세지를 보내는 것으로 하였습니다. 2번째 선택 굿~

그래서 추가로 현재 클라이언트 코드 game.js에 몬스터 처치후 동기화 처리시에 같이 서버에서 생성 체크를 하라는 sendEvent(13)을 보내주었습니다.

if (data.type === 'killMonster') {
      userGold = +data.result.userGold;
      score = +data.result.score;
      changeWave();
      sendEvent(13);
    }

이제 클라의 sendEvent를 받고 서버에서 실행할 핸들러 함수입니다.

export const createGoldMonster = async (uuid, payload, socket) => {
  let monsterId = 0;
  const { waveLevel, monsters } = getGameAssets();
  const currentWaveLevel = await getWaveLevel(uuid);

  const random = Math.floor(Math.random() * 100) + 1;
  if (random <= waveLevel.data[currentWaveLevel - 1].goldMonsterProbability) {
    monsterId = monsters.data[monsters.data.length - 1].id;
  } else {
    monsterId = null;
  }

  return {
    type: 'createGoldMonster',
    status: 'success',
    message: 'create Gold Monster',
    result: {
      goldMonsterId: monsterId,
    },
  };
};
  • 먼저 난수를 생성하여 확률을 체크합니다.
  • 확률에 성공하면 게임 데이터에서 제일 맨 마지막 순서의 id를 할당해 주어 클라이언트에게 데이터를 보내줍니다.
  • 확률에 실패시 monsterId에 null을 할당해 주어 보내줍니다.

그럼 다시 클라이언트에선 이 값을 확인하여 monsterId가 제대로 있으면 황금 고블린을 생성하게 해주었습니다.

if (data.type === 'createGoldMonster') {
      if (data.result.goldMonsterId) {
        spawnGoldMonster(data.result.goldMonsterId); // 황금 고블린 생성
      }
    }

오늘의 회고

뭔가 글이 굉장히 장황해 진것 같습니다. 하하 아마 구현하는 것은 그리 어렵지 않았는데 고블린을 어느 시점에 생성할 것인가? 서버에서 생성하라는 의미가 어떤것일까?라는 생각하는 시간이 더 오래 걸렸던 작업이었던거 같습니다. 그래도 팀원분들과 소통하여 잘 작성되었다고 생각이 들어 다행인 것 같습니다.

그럼 오늘도 화이팅입니다.

profile
안녕하세요

0개의 댓글