2. 패킷 구조 및 정의
3. 소스코드 프로젝트 (클라이언트/윈도우)
4. 소스코드 및 Makefile (서버/리눅스 SentOS)
온라인게임 프로토타입이다.
로그인을 하여, 채널 선택, 방 만들기/나가기/정보수정/게임 시작, 채팅 등이 구현되어 있다.
동영상에서 게임에서 나온 후 대기실에서 동기화가 안된 모습이 보이는데, 처리가 안된 부분이다.
[ 개발이야기 ]
더보기
두번째 팀프로젝트이다. 맵에디터를 같이 작업했던 팀원과 맵에디터 프로젝트가 마무리되고 바로 시작했다.
팀원은 프로그래밍을 리눅스에서 네트워크쪽으로 공부를 했었기에, 윈도우에서만 공부한 나와는 서로 도움이 될 수
있는 부분들이 많았다.
팀원보단 내가 네트워크쪽 지식이 많이 약했기 때문에, 공부하는 차원에서 팀원에게 자문을 얻어 클라이언트 제작이외에
패킷구조와 IOManager 클래스 개발 등 서버쪽에도 상당부분 관여했다.
덕분에 TCP/IP 통신과 멀티스레드 동기화 리눅스에서의 프로그래밍 등 많은 지식을 얻었다.
리눅스서버와 윈도우 클라이언트 통신, Mysql, DirectX, FMod, MFC, C++, STL, Win32API, 알고리즘, 쓰레드 동기화 등등
지금까지 공부한 것들이 전부다 녹아들어가있다. 그리고 코딩스타일이나 객체들의 관계에 있어서도 아직까진 왜이렇게 짰을까
라는 생각이 안들만큼 신경썼다.
언제나 프로젝트를 새로 시작할때는 내가 할 수 있는것과 해보지 못했던 것, 그리고 적당히 버거운 정도를 고려해서 선택한다.
가장 중요한 것은 결과물이기에.. 같이 프로그래밍을 공부하는 사람들간에는 결과물만이 다는 아니지만, 남들에게 보여주고
설명해줄때는 결과물만큼 좋은게 없기 때문이다.
하지만 말과는 다르게 동영상에 그다지 남에게 보여줄만한 것이 없다. 이번 프로젝트 역시 보이는것보단 보이지 않는 곳에서
정말 많이 헤멨었다. 타 운영체제간에 통신은 처음이었기에 기반을 만드는데 고생을 많이 했는데,
윈도우에서는 UNICODE 기반이지만, 리눅스는 UTF-8기반이다.
그리고 클라를 개발하는 컴퓨터는 AMD CPU였고 서버 컴퓨터는 Intel CPU였다. 어디선가 리틀엔디언과 빅엔디언에 대해 들은것이
있어 혹시모를 문제를 미연에 방지하고자 패킷들은 바이트단위로 메모리복사를 했고, 문자열들은 인코딩 후에 복사를 했다.
그리고 또 혹시나 개발과정에서 패킷이 틀어질 것을 염려해 IOManager라는 패키지클래스를 만들어 클라와 서버 프로그램에서 같이 썼다.
#ifdef #else #endif 의 연속.. 런타임 라이브러리를 지양하고 표준함수를 쓰려고 노력했다.
또, 개발의 편의성을 위해 패킷 보내는 함수를 가변인자 함수로 만들어 인자만 순서에 맞게 던져주면 되도록 디자인하였고,
받아온 패킷은 분석하여 구조체로 만들고 윈도우의 WinProc과 비슷하게 동작하도록 디자인했다.
멀티스레딩 환경에서 패킷 데이터가 손실되지 않도록 스레드에 안전한 샌드큐와 리시브큐를 만들어서 사용했다.
샌드큐는 링크드리스트형태의 큐인데 큐 구조체에 head와 tail 포인터 없이 메모리포인터 하나만 있는것이 특징이다.
아! 그리고 동영상에 보이는 맵은 졸작으로 제출한 맵에디터로 만든 맵이다!
내가 만든 툴을 사용해서 프로그래밍하는 것은 또다른 기쁨인 것 같다.
[ 개발환경 ]
서버
- CentOS 2.6
- VI Editor
- C++
- Mysql
클라이언트
- Windows 7
- Visual C++ 2008
- C++
- DirectX 9.0c
- FMod