Real-time Tactics Game
개 요 프 로 그 램 구 조 객 체 설 계 그 래 픽 처 리 인 공 지 능 게 임 성 네 트 워 크 설계 *순 서 개 요 프 로 그 램 구 조 객 체 설 계 그 래 픽 처 리 인 공 지 능 게 임 성 네 트 워 크 설계 네 트 워 크 구 조 체 전송 데이터
*개 요 *구동 & 개발 환경 전형적인 실시간 전략 시뮬레이션 게임의 변형판? 같은 조건에서의 컨트롤 대결 AI와의 플레이 및 유저간의 네트워크 대전 지원 동적인 게임 프로그램의 개발 *구동 & 개발 환경 Windows XP, DirectX 7.0 이상 Tool: Visual C++ 6.0 MFC , DirectX SDK 9.0
*역 할 분 담 다른사람 클라이언트 프로그래밍 문지민 서버 프로그래밍
*프로그램 구조 ( architecture )
*객체 설계 ( Object Design ) class Game Ship* Player[] Init() Activate() UpdateFrame() Finish() class Ship Shell* Shell[] double x double y CRect area double angle double speed int durability int crew Move() Reload() Fire() class Shell double x double y double angle int power Move() 객체화된 App 및 CWnd와 조화 (객체에 대한 핸들생성을 통해 접근)
PrimarySurface BackSurface *그래픽 처리 -실제로 모니터를 통해서 보이는 화면 -비디오 메모리에 ※Flipping lpPrimarySurface->Flip(NULL, DDFLIP_WAIT); - 고속 화면 교환을 통해 프레임 표현 PrimarySurface -실제로 모니터를 통해서 보이는 화면 BackSurface -비디오 메모리에 미리 그리는 화면
*인공지능 ( Artificial Intelligence ) 목표물 설정 – 다른 함선과의 거리를 연산 (두 점 사이의 거리) 가장 가까운 상대를 타겟(Ship*)으로 설정. 접근 – Timer에 10초 간격으로 설정하여 접근과 거리 유지를 반복함. 공격 – 자함선의 진행방향과 타겟의 각도를 연산하여 직각이 되면 발포.
*게임성 ※전략과 전술 - 전략(strategy) 요소: 정보, 계획, 조직, 수행 ( 일반적인 RTS ) - 전술(Tactics) 요소: 기동, 운용 ( 소규모 집중된 컨트롤 )
*네트워크 설계 ( Network Design ) ※클라이언트 – 서버 모델 #define C2S_REQ_LOBBY_DATA 1001 #define C2S_REQ_ROOM_DATA 1004 #define C2S_SND_CHAT_MSG 1005 #define C2S_GAME_MSG 1009 #define C2S_FIRE_MSG 1010 #define C2S_REQ_QUIT_ROOM 1006 #define C2S_REQ_START 1020 : #define S2C_SND_CONNECT_OK 2001 #define S2C_REP_LOBBY_ROOM 2002 #define S2C_REP_LOBBY_USER 2003 #define S2C_REP_START 202 #define S2C_GAME_MSG 3009 #define S2C_FIRE_MSG 3010 : Server Client Client
실제 데이터에서 “|”를 식별자(separator)로 사용 *네트워크 설계 ( Network Design ) ※패킷 실제 데이터에서 “|”를 식별자(separator)로 사용 ※리시브 순서 버퍼에서 4바이트 만큼만 code를 먼저 읽는다 2. 다시 4바이트만큼 읽어 옴 (실제 데이터의 길이) 3. 데이터 길이 바이트만큼 데이터를 나머지 모두 읽는다 code(4Byte) 실제데이터길이(4Byte) 데이터……
*네트워크 구조체 typedef struct _UserData //유저리스트 구조 { SOCKET clntSocks; char nickName[NICKNAME_SIZE+1]; //아이디 int roomNum; //현재 어느 방에 있는지 판별 int state; // 현재 상태 (0 없음, 1 로비, 2 방) }User; typedef struct _RoomData // 게임 방의 구조 int roomNum; //번호 char roomName[ROOMNAME_SIZE+1]; //방제 SOCKET userIndex[MAXUSER_IN_ROOM]; //현재 방안에 클라이언트(방안에 들어간 소켓을 저장하는 배열) int userCount; //인원수 int state; //방 상황 0이면 close, 1이면 open }Room;
*전송 데이터 구조 X좌표 | Y좌표 | 각도 | 포문1 | 포문2 | 포문3 | 포문4 | 포문5 | 포탄1X | 포탄1Y | 포탄2X | 포탄2Y | 포탄3X | 포탄3Y | 포탄4X| 포탄4Y | 포탄5X | 포탄5Y | …. buf.Format("%f|%f|%f|%d|%d|%d|%d|%d", …. for(int j = 0; j < 5; j++) { if(Player[0]->shellOn[j] == Moving) buf2.Format("|%f",Player[0]->shell[j]->x); buf += buf2; buf2.Format("|%f",Player[0]->shell[j]->y); } else buf += "|#|#"; clientDlg.m_pClientSock->sendPacket(C2S_GAME_MSG, buf);
End.