서버 포트폴리오 포트폴리오

1. 개요

클라이언트가 서버에 접속을 하면 객체를 생성, 표시하고 클라이언트의 명령을

서버가 받아 처리해서 움직이는 프로그램을 작성하였습니다.

서버는 IOCP, 클라이언트는 EventSelect 방식으로 구현했습니다.

주로 참고한 서적은 Network Programming For Windows 2판, 

온라인 게임 서버 프로그래밍 ( 한동훈 저 ) 입니다.



2. 프로그램 화면




-- 화면설명 --

동영상을 올리고 보니 화질이 조금 나빠져서 구분이 좀 안되는데

화면에서 왼쪽위가 서버고 나머지 3개는 클라이언트를 띄워 놓은 것입니다.

아이디, 비밀번호 확인작업은 미뤄놓은 상태이고 아이디를 치고 로그인을 하면

간단하게 원과 이름이 뜨게 했습니다.

객체의 이동은 방향키로 하게 해서 방향키를 누르면 어떤 키를 눌렀는지 서버로 전송하고

서버에서는 해당하는 방향으로 속도를 더해줍니다. 방향키를 해제했을때는 마찬가지로

서버로 전송해서 해당하는 방향의 속도를 다시 원래대로 해줍니다.

그리고 서버에서는 객체의 속도에 따른 이동을 프레임별로 계산해서 그 위치가 변했을 경우

변한 위치를 해당 클라이언트 및 다른 접속해있는 클라이언트에게 보내주어서

각 클라이언트의 객체 위치를 갱신합니다.

그리고 클라이언트가 접속하거나 종료했을 경우에는 서버에 접속한 클라이언트들에게

정보를 보내주어 자신의 화면에서 해당 객체를 사라지게 합니다.




3. 서버 클래스 다이어그램




클래스 맴버와 메소드까지 표현하면 너무 복잡해지기에 기본적인 서버의 구조만 표현하였습니다.

간단히 클래스에 대해 설명을 하겠습니다.

CGame - 서버의 생성, 소멸 및 진행을 관리합니다.

CUser - 유저에 대한 정보를 가지는 클래스이나 현재상태에서는 특별한 게 없기때문에 위 화면에서

  객체의 역할을 하고 있고 자신의 위치를 갱신하는 역할을 합니다.

CUserManager - CUser 클래스의 생성, 소멸 및 생성된 CUser 클래스을 저장하는 등 이름 그대로

      CUser 클래스의 관리자역할입니다.


CNetServer - 게임서버 내에서도 네트웍에 관련된 부분을 전담한다는 의미로 NetServer라는 이름을

 붙였습니다. 네트웍관련부분의 생성, 소멸, 진행을 관리합니다.

CSrvIOCP - CIocp클래스를 상속받아 IOCP의 생성과 소멸 및 I/O Completion Queue 의 메세지를

      처리하는 역할을 합니다.

CNetObj - 각각의 클라이언트와의 데이터 송수신을 담당하는 클래스로 네트웍상에서 위의 CUser

      역할을 한다고 볼 수도 있겠습니다. 위의 그림에는 표시가 안되있지만 CUser클래스와 

      CNetObj 클래스는 상호연관되어있습니다. 

CNetObjManager - CNetObj 의 생성과 소멸 및 연결상태를 관리하는 클래스입니다. 일정시간마다

 클라이언트에게 패킷을 보내 접속상태를 확인하는 등의 역할을 합니다.


CWorldClock - 게임시간의 계산을 담당합니다.


그 외 라이브러리 소스의 클래스들이 있는데 이 것은 주로 서적을 참고로 했습니다.


4. 향후계획

- DB쪽으로 아는 바가 없어 DB쪽으로 공부를 하면서 로그인 서버를 구현해보려고 합니다. 전에 Sqlite
   를 이용해서 해본적은 있지만 그 라이브러리로는 DB를 제대로 사용하기 힘들다고 느껴서입니다.

- 조금 더 게임스러운 요소를 넣어 볼까합니다. 일단 생각은 간단한 슈팅게임정도로 생각하고 있습니다.


5. 첨부

- 코딩스타일 확인을 위한 서버쪽 소스 코드파일과 라이브러리 소스 코드파일을 첨부합니다.



갤러그동영상 포트폴리오

1년전에 연습용으로 만들어 봤던 갤러그 동영상입니다.

같이 공부하던 친구와 만들었었고

저는 플레이어와 적의 플레이 로직을 구현했고

갤러그의 기본적인 요소는 다 구현했었습니다.





numeric_limits<TYPE> , 변수 범위 구하기. 프로그래밍메모장

어떤 타입의 범위를 구하기 위해사용합니다.

사용하기위해서 limits 를 포함해야합니다.

예를 들면 이런식입니다.

#include <limits>

const double  MaxDouble = (std::numeric_limits<double>::max)();
const double  MinDouble = (std::numeric_limits<double>::min)();

이렇게 하면 MaxDouble에는 double 형의 데이터가  가질수 있는 최대값이,

그리고 MinDouble에는 double형이 가질수 있는 최소값이 들어가게 됩니다.




조엘 온 소프트웨어




개발자보다는 주로 관리자와 소프트웨어회사의 이런저런 이야기를 담고 있어서

초보존에서 아직 허수아비나 때리면서 랩업하고 있는 저에게는

아직은 거리가 먼 나라의 이야기일거라고 생각했는데요.

실제로 그래요. 아직 제가 공감하기엔 좀 힘든 이야기들이 많다랄까요.

그럼에도 불구하고 잡고나서 중간중간 딴짓하는 시간이외에는 계속 붙들고 읽어 버렸는데요.

그 이유는 하나네요. 제목 그대로 유쾌해서 말이죠. 소프트웨어 업계의 이런 저런 많은 이야기들을

지루하지 않게 풀어나가는 작가의 센스와 번역자의 노력에 정말 박수를 쳐주고 싶습니다.

영어만 된다면 직접 블로그에 가서 읽어보고 싶지만 그러지는 못하니

다른책도 읽어보면서 대신 만족해야겠네요.

정말 재밌는 책입니다.!

Portal - 'Still Alive' 창고



정말 인상적인 게임 ost

1 2 3 4 5 6 7 8 9 10 다음



테라시아 프로그래밍 RSS