kyuseo의 게임 프로그래밍

패킷 코드 노가다를 줄여주는 네트워크 패킷 메이커 (Network Packet Maker) 본문

만든 게임 및 프로그램

패킷 코드 노가다를 줄여주는 네트워크 패킷 메이커 (Network Packet Maker)

kyuseo 2008. 5. 29. 10:46

개요..

 

온라인 게임을 개발하면 수많은 패킷을 작성하게 되고 그 패킷에 연관된 수많은 함수, 변수, 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 =