Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

rabbit97 님의 블로그

18일 일지 본문

프로젝트 Final

18일 일지

rabbit97 2024. 11. 18. 21:03

# 오늘부터 개발 시작

 

추가한 내용

 

내가 맡아야 할 핸들러 로직 중 일부

 

캐릭터 위치 이동 핸들러

import { getGameSession } from '../../sessions/game.session.js';
import { createResponse } from '../../utils/packet/response/createResponse.js';
import { PACKET_TYPE } from '../../constants/header.js';
import { createNotificationPacket } from '../../utils/packet/notification/game.notification.js';

const packetType = PACKET_TYPE;

const handlePositionUpdate = async ({ socket, payload }) => {
  // 검증 과정
  try {
    const gameSession = getGameSession(socket);
    if (!gameSession) {
      throw new Error('해당 유저의 게임 세션이 존재하지 않습니다.');
    }

    const user = gameSession.users.find((user) => user.socket === socket);
    if (!user) {
      throw new Error('유저가 존재하지 않습니다.');
    }

    const opponent = gameSession.users.find((user) => user.socket !== socket);
    if (!opponent) {
      throw new Error('상대 유저가 존재하지 않습니다.');
    }

    // 캐릭터 위치 업데이트 수행
    const success = gameSession.updateCharacterPosition(user.id, payload.x, payload.y);

    if (success) {
      // 위치 업데이트 성공 응답 생성
      // 오늘의 회의 내용 - 시퀀스 내용 추가해야함
      const positionResponse = createResponse({
        success: true,
        type: packetType.POSITION_UPDATE_RESPONSE,
        data: { x: payload.x, y: payload.y },
      });
      socket.write(positionResponse);

      // 상대 플레이어에게 위치 업데이트 알림 전송
      const positionNotification = createNotificationPacket({
        characterPositions: [{ userId: user.id, x: payload.x, y: payload.y }],
        type: packetType.POSITION_UPDATE_NOTIFICATION,
        success: true,
      });
      opponent.socket.write(positionNotification);
    } else {
      throw new Error('캐릭터 위치 업데이트에 실패하였습니다.');
    }
  } catch (error) {
    console.error('위치 업데이트 중 에러 발생:', error);

    const errorResponse = createResponse({
      success: false,
      type: packetType.POSITION_UPDATE_RESPONSE,
      data: { message: error.message || 'Error updating position', failCode: 1 },
    });
    socket.write(errorResponse);
  }
};

export default handlePositionUpdate;

 

클라이언트에서

POSITION_UPDATE_REQUEST

 

여기 패킷으로 페이로드 데이터를 받아와

 

위치 정보를 다시 클라이언트로 보내주고 이걸 다른 유저들에게도 알림을 하는 로직

 

여기서 유저의 정보가 필요한데

 

팀원들 코드로 대체될 가능성이 많으나 핸들러 구현때문에 임시로 작성한 로직이 있다

 

 

 

 

 

src/classes/models/user.class.js

 

유저 정보들을 여기서 선언하고

 

 

 

 

 

src/classes/models/game.class.js

 

게임 세션에서 쓸 로직들을 여기서 정의를 해야하는데 일단 핸들러에서 사용할 함수빼고는 아직 아무것도 채우지 않은 클래스

 

 

 

 

 

src/sessions/game.session.js

 

그리고 임시로 작성한 게임세션에서 유저 정보 데이터를 가져와

 

이 핸들러에서 받은 페이로드에서 위치 값을 검증한다

 

 

 

 

 

src/handlers/syncCharacter/position.handler.js

 

그리고 리스폰스로 다시 보내주기

 

여기서 문제는 회의 내용으로 로직을 수정해야함을 배웠다

 

 

 

 

 

src/utils/response/createResponse.js

/** 클라이언트에 응답을 해주기 위한 패킷을 생성해주는 스크립트 */
import config from '../../../config/config.js';
import { getProtoMessages } from '../../../init/loadProtos.js';
import PACKET_MAPS from '../../../protobufs/packetMaps.js';

export const createResponse = (packetType, sequence, payloadData = {}) => {
  // 1. 패킷 타입
  const typeBuffer = Buffer.alloc(config.packet.payloadOneofCaseLength);
  typeBuffer.writeUInt16BE(packetType);
  // 2. 버전
  const versionLengthBuffer = Buffer.alloc(config.packet.versionLength);
  versionLengthBuffer.writeUInt8(config.client.version.length); // 문자열 길이 기록
  // 3. 버전 스트링 길이
  const versionString = config.client.version;
  const versionBuffer = Buffer.from(versionString, 'utf-8');
  // 4. 패킷순서
  const sequenceBuffer = Buffer.alloc(config.packet.sequenceLength);
  sequenceBuffer.writeUInt32BE(sequence); // 예시로 시퀀스 번호 0으로 기록

  const protoMessages = getProtoMessages();
  const gamePacket = protoMessages.packet.GamePacket;
  const responsePayload = {};
  responsePayload[PACKET_MAPS[packetType]] = payloadData;
  const payloadBuffer = gamePacket.encode(responsePayload).finish();

  // 6. 페이로드 길이
  const payloadLengthBuffer = Buffer.alloc(config.packet.payloadLength);
  payloadLengthBuffer.writeUInt32BE(payloadBuffer.length);

  return Buffer.concat([
    typeBuffer,
    versionLengthBuffer,
    versionBuffer,
    sequenceBuffer,
    payloadLengthBuffer,
    payloadBuffer,
  ]);
};

 

여기가 크리에이트 리스폰스 로직인데

 

인자로 3가지를 받는데 그 중 시퀀스를 포함하지 않아서 로직을 수정해야한다.

'프로젝트 Final' 카테고리의 다른 글

20일 일지  (0) 2024.11.20
19일 일지  (0) 2024.11.19
15일 일지  (0) 2024.11.16
14일 일지  (0) 2024.11.14
13일 일지  (2) 2024.11.13