군웅무도회(2D 2차 포트폴리오 WIN API)

2015. 6. 28. 20:53ElementalKiss/포트폴리오

728x90
728x90
영상


*서버 동기화 부분은 5:08부터 보시면 됩니다.


프로젝트 교훈

1. 클라이언트와 서버의 연동에 많은 어려움이 있었습니다. 사전에 교환할 데이터를 정의했음에도 불구하고 많은 시간이 걸렸습니다.

2. IOCP 서버 구축과 클라이언트-서버간 동기화를 경험할 기회였습니다. 직접 IOCP 프레임워크를 제작하여 프로젝트를 진행했습니다. 주고받을 패킷을 설계하고 클라이언트의 렌더링과 패킷 전송 시간을 고려해야 했습니다. 데드 레커닝 기법을 이용하여 실시간 동기화 게임을 구현할 수 있었습니다.

3. 설계의 중요성을 느꼈습니다. 세부적인 설계가 부족하여 다양한 요소에서 일정이 지체되기도 했습니다.

4. 팀장으로 프로젝트를 관리할 기회였습니다. 개발에 착수하기 전에 개발 규칙을 작성하여 사용할 프로그램, 코딩 규칙 등을 명확하게 지정했습니다. 마일스톤을 바탕으로 팀원들의 개발 일지를 꼼꼼히 살펴 일정관리를 했습니다.


설계

서버 마인드맵


서버 클래스 다이어그램


서버 시퀀스 다이어그램



서버 구성


패킷 교환 설계


프로젝트 관리

개발규칙



마일스톤

클라이언트 마일스톤


서버 마일스톤


개발일지




구현

1. enum을 이용하여 교환할 패킷을 정의했습니다. m_baseMsg를 통해 기본 메시지를 정의하고 패킷의 길이와 패킷의 종류를 정의했습니다. IOCP 서버는 이 메시지를 길이와 타입으로 패킷을 송수신하도록 구현했습니다.

2. 패킷 구조체는 길이와 타입을 가지며 공용체로 정의하여 Packet 주고 받는 구조체 형태를 일반화하였습니다.

3. 그룹 단위의 게임이기 때문에 그룹을 관리할 PlayerGroup 객체와 이 그룹들을 관리할 GroupMgr 객체를 구현했습니다. GroupMgr은 싱글톤 패턴을 이용하여 Server 객체에서 활용했습니다.

4. Connector를 제작하여 클라이언트와 서버를 연결할 객체를 구현했습니다. 내부적으로 스레드 형태로 받은 패킷은 STL Queue를 이용하여 클라이언트에서 처리할 수 있도록 구현했습니다.


클라이언트

메인화면, 세팅화면, 캐릭터 선택화면


게임1(맹장경마전), 게임2(마상창술전)


게임3(병단참살전), 게임4(우육포식전)


게임5(적병투척전), 게임6(목유격파전)


결과씬, 최종결과씬

서버

게임 레디/게임 시작 동기화(게임 레디 패킷, 게임 시작 패킷)


실시간 게임 동기화(게임 패킷을 서로 주고받음)


'게임 결과 패킷' 받아 3개 모두 받을 시 결과씬을 보여준다.


턴제 게임은 모든 클라이언트로부터 '다음 턴' 패킷을 받으면 턴을 넘긴다.




728x90
반응형

'ElementalKiss > 포트폴리오' 카테고리의 다른 글

Tapping Counter(iOS 개인)  (0) 2015.06.30
콘솔 종합 (콘솔)  (0) 2015.06.27