코승호딩의 메모장

[Object 클래스] 본문

게임 소프트웨어

[Object 클래스]

코승호딩 2023. 10. 4. 21:13

오브젝트란 월드(씬) 상에 배치될 수 있는(화면에 그려질 수 있는) 모든 것을 의미한다. 오브젝트는 부피, 무게와 같은 물리적 특성을 지니며 예를 들어 건물, 장애물, 유닛, 총알 등이 있다. 이 모든 것들이 Object라는 클래스 안에 만들어질 것이다. 

 

이번 글에서는 오브젝트를 생성하고 위치, 크기와 같은 특성을 부여하면 자동으로 화면에 그려지도록 구현하는 것이 목표이다. 이번 프로젝트 구현의 목표는 다음과 같다.

 

  • GSEGame 클래스에서 ObjectMgr 보유 
  • ObjectMgr 클래스에서 Object 관리
  • Object Maximum 개수 제한(디버깅 및 유지관리 시 장점)
  • 랜덤 포지션으로 많은 Object 생성 후 화면에 그리기

우선 앞서 작성하였던 GSEGame 클래스 안에 Object를 생성을 할 것인데 Object를 그냥 멤버 변수로 선언하게 되면 Game 클래스 안에서 모두 관리를 해야 하기 때문에 Game 클래스 자체가 지저분해진다. 따라서 중간에 ObjectMgr 클래스를 두고 ObjectMgr는 다양한 Object를 추가하거나 삭제하거나 그리는 기능을 하도록 한다.

 

class GSEObject {
public:
	GSEObject();
	~GSEObject();

	void SetSize(float x, float y, float z) { mSizeX = x; mSizeY = y; mSizeZ = z; }

private:
	float mSizeX = 0.f, mSizeY = 0.f, mSizeZ = 0.f;
};

우선 오브젝트 클래스를 생성한다. 아직 변수로는 크기 값들만 가지고 있다. 

 

#define MAX_NUM_OBJECT 1000

class GSEObjectMgr {
public:
	GSEObjectMgr();
	~GSEObjectMgr();

	int AddObject(float x, float y, float z);
	bool DeleteObject(int id);

private:
	std::array<class GSEObject*, MAX_NUM_OBJECT> mObjects;
};

그리고 오브젝트들을 관리하는 오브젝트 매니저 클래스를 생성한다. 앞서 말했듯이 유지 관리를 위한 최대 오브젝트 개수를 매크로 정의한다. AddObject에서는 오브젝트의 크기 값을 받아 MAX_NUM_OBJECT개의 오브젝트 중 존재하지 않은 오브젝트의 색인을 찾아 해당 배열에 동적 할당을 한 뒤 해당 색인을 반환한다. 그리고 DeleteObject에서는 색인 값을 받아 그냥 delete로 삭제 후 nullptr로 밀어버린다. 배열이 꽉 찼거나 삭제할 색인이 값이 유효하지 않은 경우 로그를 찍어 확인할 수 있도록 한다.

 

class GSEGame {
public:
	//...
    
private:
	//...
	std::unique_ptr<class GSEObjectMgr>	mObjectMgr;
};
GSEGame::GSEGame(int windowSizeX, int windowSizeY)
{
	//...
    
	mObjectMgr = std::make_unique<GSEObjectMgr>();

	int id = mObjectMgr->AddObject(0, 0, 0);
    
	mObjectMgr->DeleteObject(id);
}

마지막으로 Game 클래스에서 오브젝트 매니저를 멤버 변수로 정의하고 생성자에서 오브젝트 매니저를 생성한다. 확인을 위해 크기가 (0, 0, 0)인 오브젝트 하나를 추가하여 디버깅으로 해당 오브젝트가 잘 생성되었는지 확인하고 다시 삭제한다.

 

// 랜덤 포지션 추가


프로젝트를 수정 완료하였다면 잊지 않고 git bash에서 add, commit, push를 진행한다.

 

'게임 소프트웨어' 카테고리의 다른 글

[GitLab 연동]  (0) 2023.09.25
[Game 클래스]  (0) 2023.09.13
[소프트웨어 공학]  (0) 2023.09.13
[Git을 통한 형상 관리]  (0) 2023.09.10