오늘은 오브젝트 매니저를 구현
1.오브젝트매니저 Free 구현
오브젝트 매니저에 할당된 객체들을 Free를통해 해제해줘야함
멤버변수로 m_iNumLevel에 Reserve에서 인자를 받아서 메버 변수에 넣어줌
Free에서 반복문을통해 m_iNumLevel만큼 반복문을 통해 해제를 진행해줌
Auto& Pair -> Pair.second에 있는 레이어들을 해제후
Clear();
모두 지워준후 m_pLayers도 Safe_Delete_Array를 통해 지워줘야함
Free()를 구현
Free() -> 들고있는 오브젝트 리스트를 정리
이니셜라이즈_엔진 함수는 씬에 해당하는 정수를 인자로 받음
그래픽디바이스 레벨매니저와 같이 오브젝트 매니저도 포인터변수로 멤버변수로 보관하고있어야함
이니셜라이저와 AddRef,ReleaseRef해주자
객체들을 장치를 보관하고있음 -> 그래픽 디바이스보다는 먼저해줘야함
레벨매니저는 객체와 아무상관이없음 -> 지우는 순서 상관 X
다시 이니셜라이즈 엔진으로 돌아와서
멤버변수 오브젝트매니저의 Reserve_Container를 받은 iNumLevel로 함수를 호출해줌
오브젝매니저.cpp 에 레이어 헤더 추가, 레이어에 게임오브젝트 헤더 추가
씬생성(SetUp_Level)을 하기전에 오브젝트 매니저의 초기화를 수행해줘야함
pGameInstance에 Initialize_Engine함수 호출
왜 씬만드는것보다 매니저의 초기화를 먼저 해줘야할까?
씬을 만들떄 각씬의 사용할 객체들을 추가해줘야함->객체가 추가될려면 오브젝트매니저가 적절한 사이즈로 Reserve가 되어있어야함
장치보다 오브젝트매니저를 먼저 해줘도 되는 이유 : 객체가 장치를 쓰기하지만 오브젝트매니저를 초기화하는건공간만 잡아주는것이고 객체 생성은 씬을 만들때 하기때문
Client CreateWindowW 함수전에 창을 원하는 크기로 변수 생성해줌
플레이어 클래스를통해 플레이어 객체를 생성한후 이를 그리는것이 아닌 플레이어를 복제해서 클론을 만들것임.
만들어진 클론으로 움직이고 출력하고 하는데 사용하겠다.
클래스를 통해만든 플레이어 : 원형
플레이어의 클론 : 복제품
이를 디자인패턴중 프로토타입 패턴이라고함
프로토타입이란 디자인패턴을 사용하는이유 : 객체의 생성을 빠르게하기위해서
몬스터를 스폰해야할때 : 몬스터를 Create하는것 vs Create한 몬스터를 클론하는것
왜 더 빠를까? :
원형 몬스터의 초기스탯은 상수로 할일은없음 대부분 서버에서 관리함
상수가 아닌 서버로부터 받아온 정보들을 담을것 -> 서버와 통신이 이뤄져야함 -> 느림
로딩시에 서버로부터 모든 정보를 받아와서 사용할 원형객체들을 모두 만들어주자
복사생성자는 기존의 받아온 정보를 사용하기때문에 통신안해줘도됨
-통신 상태에따라는 속도저하도 없음
이때 복사생성자를 재정의해서 복사시 장치의 레퍼런스카운트가 증가하게해줘야함
Create()함수와 Clone함수를 만들것
Clone()함수는 원형 객체의 즉 자기자신의 주소를 인자로 받아서 new함수를 호출할것임
NativeConstruct함수도 복제본을 초기화하는 함수와 원본을 초기화하는 함수(기존 NativeCOnstruct)로 분리할것
오브젝트매니저는 수정이 들어가야함 - 원형객체를 보관할 컨테이너도 만들어줘야함
이 컨테이너는 한객체당여러개 만들어줄필요가없음 리스트로 해줄필요없다.
이 컨테이너를 레벨별로 구별하는것도 좋지만 굳이 안해줘도됨
오브젝트매니저에 원형객체를 추가하기위한 인터페이스가 필요
Add_Prototype(const _tchar pPrototypetag, CGameObject pPrototype)
저장할 태그와 엔진프로젝트에서 할당할수없기떄문에 할당된 객체를 받음
Add_GameObject(int iLevel, const _tChar* pPrototypeTag,const 저장할 태그)
복제한 객체의 태그와 어떤 어떤 레벨의 어떤 태그로 저장할것인지를 인자로 받자
만들어진 함수를 게임인스턴스 클래스에도 똑같이 옮겨주자(우린 클라이언트에서 게임인스턴스를 통해 함수를 호출할것이기 때문)
오브젝트매니저의 Add_Prototype함수
우린 컨테이너를 레벨별로 관리(로고,로딩,게임플레이)
이때 모든레벨에서 사용되는 객체(마우스 같은 계속해서 사용되는 객체)는 LEVEL_STATIC에 추가
MainApp에 Add_Prototype_GameObject함수 추가 // 객체의 원형을 생성한다.
모든 씬에서 사용되는 객체라면 게임시작시 할당해주자
Add_Prototype_GameObject구현
게임인스턴스를 가져옴
게임인스턴스를 통해 Add_Prototype함수 호출
게임인스턴스 릴리즈
Native에서 장치 생성후와 씬 생성 사이에서 위에 만든 함수 호출
오브젝트 매니저로 이동해서 Add_Prototype함수 구현
m_pPrtotype에서 emplace를 통해서 추가해주자
이때 같은 태그를 가지는 페어가있는지 검사해줘야함
Find_Prototype() 함수 추가
인자로 넘겨줄 함수객체를 만들어줘야함
함수객체 : 객체를 마치 함수처럼 사용할수있께 디자인된 클래스
CTagFinder 클래스 추가
operator()를 통해 find_if에 넘겨줄 함수를 구현
() 인자를 고정해놓으면 특정 컨테이너에 밖에못씀
함수를 템플릿화해서 해결하자!
lstrcmp는 두 문자열이 같으면 0을 반환
find_if가 end이터레이터를 반환하면 맵에 없다 -> 널포인터 반환
아니라면 맵안에 이미 같은 태그를 가지는 페어가 있다 -> 해당 밸류를 반환해준다.
Create함수와 Clone 함수 선언 ( 두개 모두 객체를 생성하기 위한 함수)
8.게임 오브젝트 클래스
NativeConstruct_Prototype() Clone()함수 선언