자식 생성자 소멸자를 private으로 막아 두었는데 이쪽으로 접근 가능한 방법
부모 포인터 Resources으로 리소스 관리하기
현재 흐름이 오브젝트가 가지고있는 컴포넌트들 중에
Collider -> update 진행하고
animator경우 map으로 모든 애니매이션 가지고있는데 그 중에서도 현재 애니매이션 -> update돌릴 것이다.
Player에서 CreateAnimtion 컴포넌트를 만들때 호출하는 함수 기능이다.
해당 함수를 호출 했을 때 실제로 동적할당하여 애니매이션 만들고
이름을 정해주고, Animator가 누구인지 알려주고 인자로 받아온 녀석들의 정보르르
Create함수에 넣어준다.
그리고 map에다가 make_pair로 정보를 넣어주도록 하자.
이런식이 될 것이다.
지금 Animation.cpp의 Create함수에 마지막인자로 frameCount라는 것을 받는데
이것은 각각의 한프레임에 어떻게 동작하는 지를 프레임정보로 기억을 할 것이다.
구조체를 통해서 이 프레임정보를 가지고 있도록 하자.
이렇게 sprite있다고 할 때
4번째 밑으로 걷는 애니매이션 동작한다고 했을 때 각프레임의 데이터를 생각해본다면은
첫번째 프레임은
좌상단 정보, 자를 정보 알면은 잘라서 mainDC에다가 복사 시킬 수 있다.
애니매이션이 순차적으로 진행되어야 하는데
'각 프레임에 얼마큼 머물지에 대한 시간이 필요하다'
AnimFrame이라는 구조체를 만들어서 Create함수 내에서 받은 인자들을 잘 사용하여
구조체의 데이터를 채워넣고 반복문 돌면서 push_back해준다.
자식 생성자 소멸자를 private으로 막아 두었는데 이쪽으로 접근 가능한 방법
현재 Texture 클래스의 생성자와 소멸자부분 private으로 걸려있는데
이 부분을 좀 수정하였다.
Resources를 다 상속을 받는 Texture이기 떄문에
모든 리소스를 관리하는 ResourcesManager 의 map의 두번째 타입을 Resource* 로 변경해준다.
이렇게 해주면 Texture든 뭐든 일단 Resources를 상속받기 때문에 부모 포인터로 다 받을 수 있게된다.
현재 리소스의 최상위 부모인 Resources의 소멸자는 public이다.
texture의 생성자와 소멸자는 private으로 막혀있는데
SafeDeleteMap함수를 보면은
지금 T1, T2를 받아서 중위순회 하면서 리소스 싹 다 지울려고한다.
지우는 부분은 ResourceManager의 소멸자 부분에서 지우는데
SafeDeleteMap 들어오면은 for문 돌면서 delete하는데
iter->second가 있을 경우 delete하는데 이때 부모의 소멸자 부분은 열려 있기 때문에
'접근'이 가능하고, iter의 second부분이 texture인데 이 부분이 지금
Resources를 상속받기 때문에 메모리 주소의 첫번째 offset이 가상함수 테이블이다.
이 가상함수 테이블을 참조하여 delete iter->second를 할경우 Resources를 상속받는 texture의 소멸자에 접근이 가능하게 되는 원리이다.