[플레이어] 라는 객체를 생성할 때 필요한 정보
1. 객체의 위치, 회전, 크기 (상태)
2. 텍스쳐, 메시(플레이어를 그리기위한 리소스)
3. 콜라이더 (충돌을 위함)
4. 네비게이션. (이동을 위함)
텍스쳐를 텍스쳐에 보관하는것은 그릴때마다 텍스쳐를 가져와야하므로 불합리 할수있음
[몬스터] 라는 객체도 플레이와 같은 정보가 필요할것
공통되는 데이터를 가지는 부모 클래스 [게임오브젝트]를 선언하자
하지만 [건물]클래스같은 1,2번 변수는 필요하지만 3,4번 변수는 필요없는 클래스가있다면 쓸데없는 변수를 가지는 클래스가됨
-> 부모에겐 최소한의 꼭 필요한 데이터를 가져야함
-컴포넌트 패턴을 이용하자!
component부모클래스 상속받아 여러 기능을 클래스로 구현하고
객체에다가 component배열을 선언해 필요한 기능(component클래스)를 배열에 넣어주자
- 엔진에 컴포넌트 클래스 구현
03.컴포넌트 필터를 만든다.
컴포넌트 클래스 구현(CBase를 상속) 엔진 외부로 보낼것이기때문에 ENGINE_DLL 키워드 추가, 추상 클래스이기 때문에 abstract 추가
기능등을 장치가 필요할수있음 ->기본 생성자의 인자로 장치를 받아서 멤버변수에 보관해주자.
순수가상함수 Free(),NativeConstruct_Prototype(),NativeConstruct(void pArg),CComponent Clone(void * pArg= nullptr) = 0
복사 생성자
CComponent(const CComponent &rhs)
생성자와 복사생성자에서는 받은 장치를 멤버변수에 넣어주고 Add_Ref를 호출해 레퍼런스를 늘려주자.
02 . 각 기능컴포넌트를 구현
렌더러,트랜스폼,VI버퍼,텍스쳐,메시,네비게이션,콜라이더 필터추가
- 렌더러 클래스를 구현
렌더러 클래스 : 현재 화면안에 그려져여할 객체들을 모아서 그리는 순서에 따라 분리보관한다.
게임내에서 많이 사용되는 기초적인 순서가 있음
ex) RENDER_NOALPHA - 알파블렌딩을 사용하지않음 ALPHA는 사용
그리는 클래스이기때문에 장치를 가지고있으면 좋음
추가삭제를 많이함 -> 리스트로 객체를 보관하자
list<class CGameObject*> m_RenderObjects[RENDER_END];
객체 모두를 순회하며 그릴지안그릴지를 판별하지말고 객체의 Tick을할때 자기자신이 그려질지를 판별하자.
나는 화면에 그려져야하기 떄문에 나를 렌더러에 추가한다를 뜻하는 함수를 구현하자.
HRESULT Add-_RenderGroup(어떤 렌더그룹인지,객체) 선언
구현 -
렌더레에 객체들을 추가하는건 Late_Tick에서 해줄것임 -> 객체가 렌더러에 계속 쌓일수있다. -> 그리고나서 객체를 렌더러에서 지워주자
렌더러는 모든씬에서 필요함 -> 모든씬에서 필요한 애들은 메인앱에서 바로 생성을 하자
04 . 컴포넌트 매니저 구현
컴포넌트 필터에 컴포넌트 매니저 클래스 구현
컴포넌트 매니저 -> 원형 컴포넌트들을 모아서 관리하는 역할
컴포넌트 매니저는 게임인스턴스에서 관리할것 ENGINE_DLL필요 없음
싱글톤으로 구현
map에 컴포넌트를 보관하자 그리고 맵을 포인터로 가지고 있자
Reserve_Container를 통해 공간을 예약
레벨을 인자로 가지고있자 m_iNumLevel
Add_Prototype(어느 레벨에 넣을것인지,어떤 태그로 넣어줄것인지, 컴포넌트 객체)
Add_Prototpye에서 중복된 태그를 가지는 객체가 있는지 확인할 Find_Component 함수 구현
Clone_Component() // 태그값으로 객체를 찾아서 복제하서 반환하라
각 함수를 구현하자 (함수들은 오브젝트의 매니저와 비슷하다)
다음 게임인스터엔스에 컴포넌트 매니저를 사용할수 있게 해주자
m_pComponent_Manager추가 해주고 초기화와 삭제
삭제는 객체와 장치사이에서 해주자(객체가 컴포넌트의 복제본을 가지고있음 이를 삭제한후 원본인 컴포넌트매니저를 삭제)
필요한 함수들을 외부로 빼주자(애드 프로토타입과 클론_컴포넌트)
05 . 메인앱 클래스에 Add_Prototype_Component()추가
게임인스턴스를 받아오고 프로토타입을 추가해주자 Add_Object를 호출해 넣어주자
MainApp Native에서 게임오브젝트 호출전 컴포넌트 먼저 호출
- 백그라운드 클래스
백그라운드 클래스에 Renderer* 추가 ( 전방선언을 할때 namespace(Engine)를 만들어서 그곳에서 전방선언을 해줘야함
Add_Components()함수 추가
구현 -
테스트용으로
Late_tick에서 렌더러에 백그라운드 개체를 추가해보자(late_tick에서 계속 넣어주더라도 렌더러컴포넌트에서 한번 그려주고 지워줌)
아직그려지지는 않음 - 렌더러의 렌더게임오브젝트를 호출해주지않아서
그럼 어디서 호출해주는게 좋을까? - MainApp에서 호출을 해주자(원본을 MainApp에서 보관해주는게 좋아서(이때 MainApp에서 보관할것이니깐)
MainApp의 렌더 게임오브젝트에서 렌더를 호출해주자