TIL

2024년 10월 10일 TIL

kagan-draca 2024. 10. 11. 00:41

오늘은 게임이 시작하면 호출되는 Handler 부분과

Repositories에 따른 Services를 구현했다.

 

향후 Prisma를 이용한 Mysql DB를 Redis 코드로 수정해야하고,

프로젝트 진행에 따른 코드 수정이 지속적으로 이뤄질 것 같다.

 

전체 코드로(아래 세부 설명이 존재합니다)

export const gameStart = async (userId, payload) => {
  // 게임이 시작할 경우 호출되는 Handler

  // console.log('------------------------------------');
  // console.log('token : ', token);
  // const userId = AuthUtils.verify(token);
  // console.log('userId : ', userId);
  // console.log('------------------------------------');
  clearStage(userId);
  clearGold(userId);
  clearScore(userId);
  clearMonsters(userId);

  setStage(userId, 1);
  setScore(userId, 0);
  setGold(userId, 2000);
  //스테이지 모두 정보 조회

  const init = await gameStartService.initSendData();

  // prisma의 동작 과정이 터미널에 출력 되기 때문에 로그를 함께 출력했습니다.
  console.log(`@@ gameStartHandler =>>> `, init.stages);
  console.log(`@@ gameStartHandler =>>> `, init.roundMonsters);
  console.log(`@@ gameStartHandler =>>> `, init.monsters);
  console.log(`@@ gameStartHandler =>>> `, init.towers);
  // 나중에 initInfo 추가하기
  init.initData = { score: getScore(userId), gold: getGold(userId) };

  if (!init.stages.length) console.log('@@ gameStartHandler - 서버에 스테이지 정보가 없습니다.');
  else if (!init.roundMonsters.length)
    console.log('@@ gameStartHandler - 서버에 라운드 별 몬스터 정보가 없습니다.');
  else if (!init.monsters.length)
    console.log('@@ gameStartHandler - 서버에 몬스터 정보가 없습니다.');
  else if (!init.towers.length) console.log('@@ gameStartHandler - 서버에 타워 정보가 없습니다.');

  return { status: 'success', handlerId: 2, init };
};

 

형식으로 유저가 게임에 진입했을 경우

  clearStage(userId);
  clearGold(userId);
  clearScore(userId);
  clearMonsters(userId);

기존 게임 플레이에 따른 Stage, Gold, Score, Monster 정보를 초기화 시키고

  setStage(userId, 1);
  setScore(userId, 0);
  setGold(userId, 2000);

Stage, Gold, Score를  게임 시작 상태에 따른 값으로 제공한다.

 

그 후,

const init = await gameStartService.initSendData();

 

게임 진입에 따른 Client에게 제공해야할 DB 모든 정보를 받아온다.

 

현재, GameStartService  Class를 살펴 보면

 

export class GameStartService {
  stagesRepository = new StagesRepository();
  monstersRepository = new MonstersRepository();
  createMonsterRepository = new CreateMonsterRepository();
  towersRepository = new TowersRepository();

  async initSendData() {
    let stages = await this.stagesRepository.viewEntireStages();
    let monsters = await this.monstersRepository.viewEntireMonsters();
    let createMonsters = await this.createMonsterRepository.viewEntireCreateMonsterPerStage();
    let towers = await this.towersRepository.viewEntireTowers();

    console.log('-------------------------------------------------------');
    console.log('테스트 스테이지 : ', stages);
    console.log('테스트 몬스터 : ', monsters);
    console.log('테스트 생성 몬스터 : ', createMonsters);
    console.log('테스트 타워 : ', towers);
    console.log('-------------------------------------------------------');

    return {
      stages: stages,
      monsters: monsters,
      roundMonsters: createMonsters,
      towers: towers,
    };
  }
}

 

  viewEntireMonsters = async () => {
    return await prisma.monsters.findMany();
  };

(Stage, Monster, CreateMonsters, towers도 동일하게 동작 중 입니다.)

 

아래 모든 게임 시작 시 제공해야할 정보를 찾아와

 

return 해주고 있다.

 

  if (!init.stages.length) console.log('@@ gameStartHandler - 서버에 스테이지 정보가 없습니다.');
  else if (!init.roundMonsters.length)
    console.log('@@ gameStartHandler - 서버에 라운드 별 몬스터 정보가 없습니다.');
  else if (!init.monsters.length)
    console.log('@@ gameStartHandler - 서버에 몬스터 정보가 없습니다.');
  else if (!init.towers.length) console.log('@@ gameStartHandler - 서버에 타워 정보가 없습니다.');

 

만약 찾아온 데이터가 존재하지 않으면,

서버의 log로 해당 데이터가 존재하지 않는다고 서버에 알려줍니다.

 

Client는 soket.on에서 'response'로 

  socket.on('response', (data) => {
    console.log('@@ response: =>>>  ', data);
    if (data && data.handlerId) {
      switch (data.handlerId) {
        case 2:
          userInfo = data.init.initData;
          stages = data.init.stages;
          monsters = data.init.monsters;
          towers = data.init.towers;
          roundMonsters = data.init.roundMonsters;
          setUserInfo(userInfo.score, userInfo.gold);
          setStages(stages);
          setMonsters(monsters);
          setTowers(towers);
          setRountMonsters(roundMonsters);
          break;

        case 4:
          displayLevelUpText(data.payload.targetStage);
          break;

        case 5:
          console.log('Gold : ', data.currentGold);
          setGold(data.currentGold);
        default:
          console.log('!! 일치하는 핸들러가 없습니다.');
          break;
      }
    }
  });

 

서버로 부터 응답을 받고, data의 handlerid에 따른

Data를 변수에 담아 사용할 부분에 제공해줍니다.