본문 바로가기
게임 공부/게임 개발 일지

[Gomoku] Ready 패킷을 상대 호스트에 어떤 형태로 보낼 것인가?

by woohyeon 2020. 11. 1.
반응형

P1과 P2가 모두 ready를 하면 P1(서버)이 game start 버튼을 통해 게임을 시작할 수 있다. 이를 위해 bReadyP1, bReadyP2 라는 타입의 변수를 두고 모두 true일 경우 게임을 시작할 수 있도록 했다. 두 값의 default는 false이고 Ready 버튼을 누를 때마다 NOT 연산을 통해 현재 값을 반전시킨다.

이를 상대 플레이어에게도 알리려면 Ready 버튼을 누를 때마다 상대 호스트에게도 내 ready 값을 바꾸라는 패킷을 보내야 한다. 

우선 대략적인 틀은 다음과 같다.

WndProc(...) 
{
   ...
   // 버튼 클릭 시
   {
       // 자신의 레디 상태 변경
       bReadyP1 = !bReadyP1;
       
       // 자신의 레디 상태를 변경하라는 신호 전송
       SendChangeReadyPacket(...);
   }
   ...
}

 

상대가 패킷을 받으면 패킷을 분석해서 Ready status를 바꾸라는 것을 알아내야 한다. 

현재 생각하고 있는 방법은 객체 직렬화를 응용하여 신호를 전달하고 받는 SignalManager 클래스를 하나 만드는 것이다. 신호는 class 내에 enum 타입으로 정의한다. 그리고 enum 타입을 send 함수를 통해 전송한다. send 함수는 char* 타입을 인자로 받으므로 int 타입을 직렬화 하듯이 한다. 방법은 다음과 같다.

// 16bit의 unsigned int 타입을 신호 타입으로 재정의
using sig_type = UINT16; 

// enum 타입을 주소를 가지는 lvalue로 만듦
sig_type intSignal = static_cast<sig_type>(eSignal::SIG_READY);

// 데이터를 저장할 buffer
char buf[sizeof(sig_type)];

// buf가 가리키는 주소에
// &intSignal부터 sizeof(intSignal) 바이트만큼 복사
memcpy(buf, &intSignal, sizeof(intSignal));

위와 같이 char*의 buf에 저장하면 send 함수를 통해 전송할 수 있다.

recv 루틴은 위 과정을 역으로 진행하면 된다. 수신한 buf에서 sizeof(sig_type)의 크기만큼을 sig_type 변수에 바이트 단위로 복사하고 그것을 enum 타입으로 변환하면 된다. 

 

 




댓글