d3dx9 - 21.10.18

김주현·2021년 10월 18일
0

d3dx9 3D

목록 보기
8/30

[플레이어] 라는 객체를 생성할 때 필요한 정보
1. 객체의 위치, 회전, 크기 (상태)
2. 텍스쳐, 메시(플레이어를 그리기위한 리소스)
3. 콜라이더 (충돌을 위함)
4. 네비게이션. (이동을 위함)

텍스쳐를 텍스쳐에 보관하는것은 그릴때마다 텍스쳐를 가져와야하므로 불합리 할수있음

[몬스터] 라는 객체도 플레이와 같은 정보가 필요할것

공통되는 데이터를 가지는 부모 클래스 [게임오브젝트]를 선언하자

하지만 [건물]클래스같은 1,2번 변수는 필요하지만 3,4번 변수는 필요없는 클래스가있다면 쓸데없는 변수를 가지는 클래스가됨
-> 부모에겐 최소한의 꼭 필요한 데이터를 가져야함

-컴포넌트 패턴을 이용하자!
component부모클래스 상속받아 여러 기능을 클래스로 구현하고
객체에다가 component배열을 선언해 필요한 기능(component클래스)를 배열에 넣어주자

  1. 엔진에 컴포넌트 클래스 구현

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버퍼,텍스쳐,메시,네비게이션,콜라이더 필터추가

  1. 렌더러 클래스를 구현

렌더러 클래스 : 현재 화면안에 그려져여할 객체들을 모아서 그리는 순서에 따라 분리보관한다.

게임내에서 많이 사용되는 기초적인 순서가 있음
ex) RENDER_NOALPHA - 알파블렌딩을 사용하지않음 ALPHA는 사용

그리는 클래스이기때문에 장치를 가지고있으면 좋음

추가삭제를 많이함 -> 리스트로 객체를 보관하자
list<class CGameObject*> m_RenderObjects[RENDER_END];

객체 모두를 순회하며 그릴지안그릴지를 판별하지말고 객체의 Tick을할때 자기자신이 그려질지를 판별하자.

나는 화면에 그려져야하기 떄문에 나를 렌더러에 추가한다를 뜻하는 함수를 구현하자.

HRESULT Add-_RenderGroup(어떤 렌더그룹인지,객체) 선언

구현 -

  • 게임오브젝트 헤더 추가
  • 객체가 널포인터거나 렌더그룹이 END를 넘어갈경우 E_FAIL반환
  • 객체를 참조하므로 Add_Ref(객체) 해주자
  • 프로토타입 클래스이므로 복제하는 기능을 하는 Clone 함수를 만들것임 하지만 진짜 복제를한다(리스트를 복제한다) 하는것이 아닌 하나의 리스트에 객체들을 넣어주는 방식으로 구현해야함
  • 클론을 호출하는 함수는 원형객체(렌더러의 원형객체) 즉 클론함수가 호출되면 new를 통해 새로운 객체를 반환하는것이 아닌 return this를 통해 자기자신을 반환해주자. 이때 자기자신을 참조하는 객체가 늘어나는것이므로 AddRef()를 호출해주자
  • Free()에서는 부모의 Free를 호출해주자
  • 실제 할당이되는 클래스이기떄문에 Create함수 만들어줘야함(장치를 인자로 받자)
  • NativeConstruct_Prototype()구현 NativeConstruct는 필요없다 복제안하고 주소만 넘겨줄것이기 때문(복사생성자도 만들지않았다.)
  • 객체들을 그려주는 기능을 하는 Render_GameObject()
    모아놓은 순서대로 그려주자
    반복문을통해 리스트배열의 0부터 RENDER_END까지 해당 리스트배열에 들어있는 리스트의 객체들의 렌더함수들을 호출해주자!

렌더레에 객체들을 추가하는건 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에서 게임오브젝트 호출전 컴포넌트 먼저 호출

  1. 백그라운드 클래스

백그라운드 클래스에 Renderer* 추가 ( 전방선언을 할때 namespace(Engine)를 만들어서 그곳에서 전방선언을 해줘야함

Add_Components()함수 추가

구현 -

  • 게임인스턴스 가져와주자
  • 게임인스턴스에서 Clone_Component(레벨,태그,아규먼트없음) 를통해 렌더러를 가져오자 부모 포인터이기때문에 자식포이터로 캐스팅해주자

테스트용으로
Late_tick에서 렌더러에 백그라운드 개체를 추가해보자(late_tick에서 계속 넣어주더라도 렌더러컴포넌트에서 한번 그려주고 지워줌)

아직그려지지는 않음 - 렌더러의 렌더게임오브젝트를 호출해주지않아서
그럼 어디서 호출해주는게 좋을까? - MainApp에서 호출을 해주자(원본을 MainApp에서 보관해주는게 좋아서(이때 MainApp에서 보관할것이니깐)

MainApp의 렌더 게임오브젝트에서 렌더를 호출해주자

0개의 댓글

관련 채용 정보