kyuseo의 게임 프로그래밍
패킷 코드 노가다를 줄여주는 네트워크 패킷 메이커 (Network Packet Maker) 본문
개요.. |
온라인 게임을 개발하면 수많은 패킷을 작성하게 되고 그 패킷에 연관된 수많은 함수, 변수, enum 을 작성하여 적절한 위치에 삽입해야 합니다. (일명 패킷 코드 노가다)
스크립트 엔진을 개발하여 완전 자동으로 처리 좋겠지만 프로젝트 마다 발생되는 작은 예외 상황들로 인하여 모든 것을 만족시키기는 어렵더군요.
그래서 패킷 코드 노가다를 줄여주는 네트워크 패킷 메이커 (Network Packet Maker) 개발하여 사용중인 데 반자동이기는 하지만 복사 & 붙여 넣기 (Copy&Paste) 작업만 하면 패킷작성이 쉽게 되고 스크립트 파일만 변경하면 다양한 프로젝트 적용할 수 있기 때문에 많은 도움을 주어서 현재까지 애용하고 있습니다.
스크린샷 |
자동으로 작성된 코드의 예 |
■ CServer - CClient ■ ■ PMango 엔진 Fungrep Framework 클라이언트 & 서버 매크로 소스 ■
♣ Packet.h enum { PACKET_KEY_ID, };
struct PACKET_KEY : public PPACKET { BYTE key1; BYTE key2; int point; };
♣ Packet.inl static const int PACKET_KEY_SIZE = sizeof( PACKET_KEY ); inline void MakePacketKey( PACKET_KEY* pPacket, BYTE key1, BYTE key2, int point ) { ZeroMemory( pPacket, PACKET_KEY_SIZE ); pPacket->pkid = PACKET_KEY_ID; pPacket->size = PACKET_KEY_SIZE; pPacket->key1 = key1; pPacket->key2 = key2; pPacket->point = point; }
♠ Server.h virtual void OnPacketKey( CServerUser& rUser, PACKET_KEY* pPacket );
♠ ServerOnPacket.cpp case PACKET_KEY_ID: OnPacketKey( rUser, ( PACKET_KEY* ) pPacket ); return TRUE;
void CServer::OnPacketKey( CServerUser& rUser, PACKET_KEY* pPacket ) { }
♠ ServerUser.h BOOL SendKey( BYTE key1, BYTE key2, int point );
♠ ServerUserSendPacket.inl inline BOOL CServerUser::SendKey( BYTE key1, BYTE key2, int point ) { PACKET_KEY Packet; MakePacketKey( &Packet, key1, key2, point ); return m_pServer->SendToUser( uid, &Packet ); }
♣ Client.h BOOL SendKey( BYTE key1, BYTE key2, int point ); virtual void OnPacketKey( PACKET_KEY* pPacket );
♣ ClientSendPacket.inl inline BOOL CClient::SendKey( BYTE key1, BYTE key2, int point ) { PACKET_KEY Packet; MakePacketKey( &Packet, key1, key2, point ); return m_Client.Send( &Packet ); }
♣ ClientOnPacket.cpp case PACKET_KEY_ID: OnPacketKey( ( PACKET_KEY* ) pPacket ); break;
void CClient::OnPacketKey( PACKET_KEY* pPacket ) { }
◈ 매크로 변환 목록 struct = PACKET_KEY struct1 = PACKET struct2 = KEY
struct_a = PacketKey struct_a1 = Packet struct_a2 = Key
arg_type1 = BYTE arg_name1 = key1 arg_type2 = BYTE arg_name2 = key2 arg_type3 = int arg_name3 = point arg_type4 = arg_name4 = arg_type5 = arg_name5 = arg_type6 = arg_name6 = arg_type7 = arg_name7 = arg_type8 = arg_name8 = |