2024-11-06 CH-5 팀 과제 (랜덤 타워 디펜스) 패킷 파싱룰 및 회원가입

MOON·2024년 11월 11일
0

내일배움캠프 과제

목록 보기
30/36

오늘은 제가 맡은 몬스터 생성 및 몬스터 죽음 요청을 처리하는 로직을 작성해 보았습니다.

spawnMonsterHandler

몬스터 생성 요청이 들어올때 실행할 handler함수입니다.

import Monster from '../../classes/models/monster.class.js';
import { PacketType } from '../../constants/header.js';
import { getUserBySocket } from '../../sessions/user.session.js';
import { createResponse } from '../../utils/response/createRespose.js';

export const spawnMonsterHandler = async ({ packetType, data, socket }) => {
  try {
    const user = getUserBySocket(socket); // 게임세션에 참여한 user찾기
    if (!user) {
      throw new Error('해당 유저가 존재하지 않습니다.');
    }

    const gameSession = user.getGameSession(); // 게임 세션 조회
    if (!gameSession) {
      throw new Error('해당 게임 세션이 존재하지 않습니다.');
    }

    // 세션 저장
    const monster = user.createMonster();

    const responseData = {
      monsterId: monster.id,
      monsterNumber: monster.monsterNumber,
    };

    const spawnMonsterResponse = createResponse(
      PacketType.SPAWN_MONSTER_RESPONSE,
      responseData,
      socket,
    );

    socket.write(spawnMonsterResponse);

    // 내가 생성한 몬스터 정보 다른 상대(클라)에게 알려주기
    gameSession.getAllSpawnEnemyMonster(user.id, monster);
  } catch (e) {
    console.error(e);
    // handlerError(socket, e);
  }
};

monsterDeathNotifyHandler

몬스터 죽음 요청이 들어올때 실행할 handler함수입니다.

import { getUserBySocket } from '../../sessions/user.session.js';

export const monsterDeathNotifyHandler = async ({ packetType, data, socket }) => {
  try {
    const { monsterId } = data;

    const user = getUserBySocket(socket); // 게임세션에 참여한 user찾기
    if (!user) {
      throw new Error('해당 유저가 존재하지 않습니다.');
    }

    const gameSession = user.getGameSession(); // 게임 세션 조회
    if (!gameSession) {
      throw new Error('해당 게임 세션이 존재하지 않습니다.');
    }

    const monster = user.getMonster(monsterId); // 저장된 몬스터 조회

    if (!monster) {
      console.log(monster);
      console.log(user.monster);
      throw new Error('몬스터 정보가 존재하지 않습니다.');
    }
    // 해당 몬스터 세션에 저장된 정보 삭제
    user.removeMonster(monsterId);

    user.score += 100;
    user.gold += 100;

    // 이제 다른 유저에게 나의 몬스터상황 알려주기
    gameSession.notifyEnemyMonsterDeath(user.id, monsterId);

    //user.getAllState();
    gameSession.getAllState(user.id);
  } catch (e) {
    console.error(e);
  }
};

notification

일단 현재 game클래스(게임세션)안에 작성하였습니다.

// game.class.js
// 현재 생성한 몬스터 정보를 다른유저에게 알리는 함수
  getAllSpawnEnemyMonster(userId, monster) {
    const monsterData = {
      monsterId: monster.id,
      monsterNumber: monster.monsterNumber,
    };

    this.users
      .filter((user) => user.id !== userId)
      .forEach((otherUser) => {
        const notification = makeNotification(
          PacketType.SPAWN_ENEMY_MONSTER_NOTIFICATION,
          monsterData,
          otherUser.socket,
        );
        otherUser.socket.write(notification); // 다른 유저에게 새 몬스터 정보 알림
      });
  }
  
  // 이거는 자기 몬스터 상황을 다른 유저들에게 알리는 함수
  notifyEnemyMonsterDeath(userId, monsterId) {
    this.users
      .filter((user) => user.id !== userId)
      .forEach((otherUser) => {
        const notification = makeNotification(
          PacketType.ENEMY_MONSTER_DEATH_NOTIFICATION,
          { monsterId },
          otherUser.socket,
        );
        otherUser.socket.write(notification);
      }); // 여기서 다른 유저들(다른 클라이언트)에게 상황을 전달
  }

오늘의 회고

사실 처음에 이게 notification할때 나한테 상대의 정보를 알려주는 것인지 아님 내 상황을 다른 상대한테 알려주는 것인지 아님 나 또한 notification을 받아야 하는지 순간 순간 많이 헷갈렸던거 같습니다. 여러 시행착오를 하다가 알맞는 코드를 찾은 것 같아 다행인 것 같습니다.

오늘도 화이팅!

profile
안녕하세요

0개의 댓글