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를 변수에 담아 사용할 부분에 제공해줍니다.

'TIL' 카테고리의 다른 글

2024년 10월 14일 TIL (15일 수정 내용 포함)  (0) 2024.10.16
2024년 10월 11일 TIL  (0) 2024.10.12
2024년 10월 7일 TIL  (0) 2024.10.08
Jump And Run TIL  (0) 2024.10.07
2024년 10월 4일 TIL  (0) 2024.10.05