CollisionManager 클래스

jh Seo·2023년 7월 22일
0

CollisionManager.h

#ifndef _CollisionManager_H
#define _CollisionManager_H
#include "ICollidable.h"
#include "Snake.h"
#include<map>

using namespace std;
class CollisionManager{
private:
    CollisionManager();
    ~CollisionManager();
    map<pair<int,int>,ICollidable*> collidableObjects;
    
public:
    static CollisionManager& GetInstance(){
        static CollisionManager cManager;
        return cManager;
    }

    void SetNewCollider(pair<int,int> pos, ICollidable* obj);
    void DisableCollider(pair<int,int> delObj);
    void CheckIfCollide(Snake* player);
    bool CheckIfCollide(pair<int,int> pos);
};

#endif

충돌처리 매니저는 싱글턴 패턴을 통해 구현을 해봤다.
여러 객체에서 등록이 편하도록 구현을 해봤다.
싱글턴 패턴을 찾아보니 구현을 다양하게 할 수 있었는데 ,
늦은 초기화를 통한 이 방식이 메모리관점에서 효율적이라고 해서 구현해봤다.
[싱글턴 패턴 정리]

충돌체들을 관리하는 map을 가지고 있다.
map의 키로는 충돌체들의 좌표를 pair형으로 가지고 있으며,
value값으로는 업캐스팅을 통해 충돌체의 ICollidable정보들을 가지고 있다.

CollisionManager.cpp

#include"../Include/CollisionManager.h"
using namespace std;

CollisionManager::CollisionManager(){

}

CollisionManager::~CollisionManager(){
    //내용비우고
    collidableObjects.clear();
    //메모리 지움
    map<pair<int,int>,ICollidable *>().swap(collidableObjects);
}


void CollisionManager::SetNewCollider(pair<int,int> pos,ICollidable* obj){
    collidableObjects[pos]=obj;
}

void CollisionManager::DisableCollider(pair<int,int> pos){
    collidableObjects.erase(pos);
}

void CollisionManager::CheckIfCollide(Snake* player){
    //충돌 안했다면 return
    if(collidableObjects.find(player->GetHead()) == collidableObjects.end()){
        return;
    }
    //충돌 했다면 함수호출
    collidableObjects[player->GetHead()]->whenCollided(player);
}
bool CollisionManager::CheckIfCollide(pair<int,int> pos){
    //pos위치에 collidable object가 없다면
    if(collidableObjects.find(pos) == collidableObjects.end()){
        return false;
    }
    //pos위치에 collidable object가 있다면
    else return true;
}
  • 생성자는 딱히 하는게 없다.
    소멸자에서는 map을 delete해주고,
    빈 map을 생성후 swap해준다.

  • SetNewCollider함수는 등록을 원하는 충돌체의 좌표와 충돌체를
    ICollidable로 업캐스팅한 객체를 인자로 받는다.
    그 후 map에 등록해준다.

  • DisableCollider은 해당좌표의 충돌체를 지워준다.

  • CheckIfCollide는 오버로딩을 통해 두 가지의 형태가 존재한다.

    1. 인자로 Snake객체를 받아, Snake객체의 머리좌표에 다른 충돌체가 있는지 확인한다.
      충돌체가 있다면 해당 좌표 충돌체의 whenCollided함수를 호출한다.

    2. 인자로 좌표를 받고, 해당 좌표에 충돌체가 있는지 판단해 bool형을 리턴한다.

생각

IDraw를 먼저 다른 객체들에 전달하도록 구현해 놓은다음
충돌처리를 싱글턴으로 빼내서 충돌체 객체들이 접근하는식으로 짰다.

다 짜고나서 든 생각은 IDraw도 IDraw인터페이스를 상속받는 객체들을
관리하는 클래스를 따로 빼고 Display함수를 구현한 다음,
snakeGame에서 Display함수하나만 호출하면 전체 구조가 더 간결해질것 같다.

profile
코딩 창고!

0개의 댓글