헤더파일

탱크 러시 - 네트워크 2D 게임 본문

포트폴리오 정리

탱크 러시 - 네트워크 2D 게임

헤더파일 2019. 8. 2. 01:00

개발환경

 

  • C++

  • OpenGL

  • 윈도우 소켓 프로그래밍

  • 멀티 쓰레드 프로그래밍

게임 소개

 

  • 간단한 2D 스프라이트 기반의 2인 멀티 게임입니다. 

  • 탱크 모양의 캐릭터를 움직여서 상대방 유닛과 총알을 피하고 유닛을 생성하여 상대방을 공격합니다.

  • 상대방의 체력이 0이 되면 승리합니다.

 

인게임 사진


 

게임 구조

 

컴포넌트 패턴


그림을 그리기 위한 기능, 네트워크 통신을 위한 기능을 별도의 클래스로 만들었습니다. 임 오브젝트 클래스는 각 기능의 객체를 가지고 있고 각 기능들과 오브젝트 클래스와의 종속성을 제거하여 수정 및 보완이 용이하도록 만들었습니다.

class Object
{

	Network* mNetwork;
    	Renderer* mRenderer;
             					. . .
                                
                                
}
void Object::Render(GLuint texture,GLuint particle)  
{
	
	if (mType == OBJECT_ARCHER)
	{
		mRenderer->DrawSolidRectGauge(mPosition.x, mPosition.y + (mSize), mPosition.z, mSize . . .);
		mRenderer->DrawTexturedRectSeq(mPosition.x, mPosition.y, mPosition.z, mSize . . . );
        }
						. . .
}

장면 별 관리


상위클래스인 Scene클래스에 Update 함수, Render 함수, Input 처리 함수를 가상 함수로 선언하고 Scene 클래스를 상속받는 시작 장면, 인게임 장면, 게임 종료장면 클래스를 만들었습니다. 현제 진행중인 장면을 가리키는 포인터를 변경하므로써 쉽게 장면별 이동을 할 수 있도록 구성했습니다.

class Scene
{
	virtual bool Initialize() = 0;
	virtual void Render() = 0;
	virtual void Update() = 0;
  		        ...
}


class StartScene : public Scene
{...}
class GameScene :public Scene
{...}
class EndScene : public Scene
{...}
void ChangeSceneEvent(const char* sceneName)
{
	currentScene = gScenes["sceneName"];
}

void RenderScene(void)
{
	currentScene->Update();
	currentScene->Render();
}

OpenGL


OpenGL 기능을 Renderer 클래스로 감싸서 게임오브젝트나 다른 클래스에서 OpenGL기능을 사용할 때 간단한 인자만 넘기면 쉽게 사용할 수 있도록 만들었습니다.

 

class Renderer
{
	bool IsInitialized();
	void DrawSolidRect(float x, float y, float z, 
	void DrawSolidRectXY(float x, float y, float z, float width, float height . . .);
	void DrawSolidRectGauge(float x, float y, float z, float width, float height . . .);
                                        . . .
}

다중 접속 및 매칭


접속된 클라이언트의 소켓을 id를 주어 저장하고 id 별로 두명씩 묶어 매칭을 시켜줍니다. 각 클라이언트의 정보교환을 담당하는 함수를 별도의 쓰레드로 구성하여 다중 클라이언트의 접속과 처리를 하였습니다.

int id = gClientNumber;
gClients[id] = incoming;

CreateThread(NULL, NULL, ProcessClient, (LPVOID)&(id), NULL, NULL);

이벤트 디스패처


클라이언트로부터 받은 요청을 이벤트 별로 분류하여 다르게 처리하였습니다. 함수별로 구현해서 유지보수를 쉽게 하였고 클라이언트 id로 요청을 구분하여 특정 클라이언트에게만 보낼 수 있도록 설계하였습니다.

#define OBJECT_ARCHER 0x01
#define OBJECT_WARRIOR 0x02
#define OBJECT_MAGE 0x03


#define SIGNAL_SPAWN 0x01
#define SIGNAL_MOVE 0x02
#define SIGNAL_EXIT 0x03

#define RED_TEAM 1
#define BLUE_TEAM 2
void DispatchSignal(const int signal,const int id)
{
	switch (signal)
	{
	case SIGNAL_SPAWN:
		ProcessSpawn(signal, id);
		break;
	case SIGNAL_EXIT:
		ProcessExit(signal, id);
		break;
	case SIGNAL_MOVE:
		ProcessKeyboardInput(signal, id);
		break;
	}
}
Comments