개요
PoolingManager에서 생성한 MemorBlock을 게임 오브젝트로서 관리하기 위해 CObejctManager를 만들었습니다.
자세한 설명은 아래 코드와 함께하겠습니다.
(역시 가독성을 위해 적당히 편집하였습니다.)
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | /*------------------------ObjectManager-------------------------- * * singleton class * CMover를 상속받는 모든 클래스를 Execute및 Remove하는 함수이다. * RemoveAllBullet()함수는 Mover->Delete()함수를 호출한다. * Delete()에서 removeFromParent()와 operator delete를 호출하여 소멸자를 호출하기 위함 * *---------------------------- ----------------------------------*/ /* PoolingManager에서 CreateBulletList할 때 생성된 메모리를 관리하기 위해 이곳에 넣는다. */ void AddBullet(void* bullet){ m_BulletList.emplace_back(static_cast<CBullet*>(bullet)); } /* Bullet을 create할 때 이 리스트에 넣는다. */ void Auto_ReturnToMemoryBlock(CBullet* bullet){ m_ReturnToMemoryBlockList.emplace_back(bullet); } /* 게임 종료 시점에 호출된다. */ void RemoveAllObject(){ for (auto bullet : m_BulletList) { if (bullet->HasPointer()) bullet->Delete(); } } /* Alive 상태의 오브젝트를 Execute한다. */ void Execute(float delta){ // 지워진 오브젝트는 returnToMemoryBlock을 호출한다. ReturnToMemoryBlockEveryFrame(); // 오브젝트의 Execute를 호 for (auto bullet : m_BulletList) { if (bullet->IsAlive()) { bullet->Execute(delta); } } } //callback /* LeftButton RightButton 누르면 호출된다. */ void RotationObject(int dir){ for (auto bullet : m_BulletList) { if (bullet->IsAlive()) { bullet->Rotation(dir); } } } /* ReturnToMemoryBlockEveryFrame() * 지운 오브젝트들의 ReturnToMemoryBlock을 즉시 호출하면 * 같은 프레임에서 생성한 오브젝트들이 앞에서 Free로 만든 메모리를 참조할 수 있으므로 * 한프레임 늦게 메모리 블럭으로 되돌리기 위해서. */ void ReturnToMemoryBlockEveryFrame() { for (auto bullet : m_ReturnToMemoryBlockList) { if (!bullet->IsAlive()) { CPoolingManager::Instance()->Bullet_ReturnToFreeMemory(bullet); } } } /* 생성된 메모리를 Object로 캐스팅하여 담을 리스트 */ std::vector<CBullet*> m_BulletList; /* Alive가 false인 오브젝트들을 MemoryBlock으로 변경*/ std::vector<CBullet*> m_ReturnToMemoryBlockList; | cs |
CObjectManager 클래스의 주요 함수 및 동작원리 설명
1. AddBullet을 호출하여 메모리 블럭을 Bullet으로써 관리하도록 합니다.
2. Bullet의 Create()함수에서 Auto_ReturnToMemoryBlock()을 호출하여 m_ReturnToMemoryBlockList에 등록합니다.
3. m_ReturnToMemoryBlockList에 등록된 오브젝트 중 Alive가 false인 것은 다음 프레임에서 메모리블럭으로 되돌아갑니다.
사용 예
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | /* 사용 예 Auto_ReturnToMemoryBlock()에 포인터 등록 */ /* operator new */ void* CNormalBullet::operator new(size_t size, const std::nothrow_t) { // PoolingManager에서 메모리를 할당 받는다. return CPoolingManager::Instance()->BulletNew(); } CNormalBullet* CNormalBullet::create( std::string textureName, //bullet 이미지 float boundingRadius, //bullet 충돌 범위 float angle, //bullet 초기 각도 float speed) //bullet 초기 속도 { // operator new 호출 후 CNormalBullet 생성자로 초기화 CNormalBullet* pRet = (CNormalBullet*)new(std::nothrow)CNormalBullet( textureName, boundingRadius, angle, speed); // nothrow로 인해 초기화 되지 않으면 nullptr반환됨 if (pRet && pRet->init()) { // ObjectManager의 Auto_ReturnToMemoryBlock()에 등록 pRet->Auto_ReturnToMemoryBlock(); return pRet; } else { delete pRet; pRet = NULL; return NULL; } } | cs |
1. pRet->Auto_ReturnToMemoryBlock()에서는 ObjectManager의 Auto_ReturnToMemoryBlock()를 this를 인자로 전달하며 호출합니다.
2. ObjectManager의 Auto_ReturnToMemoryBlock()은 m_ReturnToMemoryBlockList 에 전달 받은 포인터를 등록합니다.
사용 예
1 2 3 4 5 | /* 사용 예 RemoveAllObject 호출 */ CGameScene::~CGameScene() { CObjectManager::Instance()->RemoveAllObject(); } | cs |
1. Scene변경 및 종료 시 RemoveAllObject()를 호출합니다.
'All > Project' 카테고리의 다른 글
AI_ FSM / State (0) | 2016.04.12 |
---|---|
Shooter / Bullet (0) | 2016.04.12 |
PoolingManager (0) | 2016.04.12 |
게임 전체 클래스 UML 및 간단설명 (0) | 2016.04.12 |
게임 개요 (0) | 2016.04.11 |