참고
virtual
https://dragondeok.tistory.com/39
virtual
https://blog.naver.com/jh20s/222353837214
가상생성자
https://growingdev.blog/entry/C-%EC%83%9D%EC%84%B1%EC%9E%90%EC%97%90%EC%84%9C-virtual-%ED%98%B8%EC%B6%9C
public:
virtual HRESULT init(void);
virtual void release(void);
virtual void update(void);
virtual void render(HDC hdc);
// WinMain의 WinProc 대체
LRESULT MainProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
GameNode() {}
virtual ~GameNode() { }
가상함수들로 이루어짐
그래서 가장 기본이 되는
init
release
update
render
의 기능을 넣어두었다.
그러면 GameNode를 모든 클래스가 상속을 받는다면,
ㄴ모든 클래스에서 GameNode에 접근이 가능한건가? 그럼안될텐데
ㄴ모든 클래스의 객체를 생성할 때마다, GameNode의 생성도 같이 될텐데.. 이렇게 해도 사용하는게 맞나?
ㄴ그러면 결국 함수이름으로 사용하는건 왜지
원래대로라면 그런데..
생성자를 GameNode() { } 로 만들어 두었기 때문에 아무 동작도 하지 않고 사용할 수 있고,
실제 GameNode의 사용은 MainGame에서 진행.
MainGame에서는 GameNode를 상속받아 사용하는데,
여기서 GameNode의 init, release, update, render를 부른다.
일단 MainProc은

위와 같다.
Timer, Mouse, Paint, Destroy, DEF
이 5가지만 일단 처리하는 것인데,,
해당 상황에 대한 동작을 정의를 해두었고,
이건 건들면 안되는 것이다.
코어의 동작이기 때문.
이 중에서도 중요한건 Timer의 update일 것이다.
InvalidateRect 를 하여 프레임마다 장면을 갱신한다.
해당 기능으로 실제로 뭔가 돌아가는게 보여지는 형식이 되고,
실제 render는 MainGame에서 진행하게 되는데,
해당 움직임을 update를 통해서 갱신하게 되는 것이다.
사실 MG의 GameNode가 만들어지고, MainProcedure인 것이다.
ㄴ 헷갈린다. 상속을 받았다면, 부모, 자식 2개 객체가 생성이 되는 것인가?
ㄴ 그렇다면 자식을 소유하는 부모의 함수를 호출하는 것?
음.. 그러니까
MainGame은 유일하게 GameNode의 virtual 함수를 실행하는 놈이고,
실행함으로서 MainGame이 Timer, 백버퍼 등을 생성하게 되는거고
(여태 아예 독립적인 GameNode가 생성하는 걸로 헷갈렸다. 지금도 맞는지 확실하지 않음)
_mg의 MainProc을 실행하게 되므로,
MainGame의 GameNode기능 중, MainProc을 사용하는 것이고,
실제 MainProc의 update, render 를 사용하게 된다는 것이다.
즉 GameNode를 상속받은 객체 안에
ㄴ해당 객체는 유일하게 GameNode의 virtual 구현부를 실행하여, 초기화 및 작업을 수행하고,
실제 MainProc을 동작시킨다. -> 그런데 어떻게 캡슐화?
GameNode를 상속받은 객체를 넣고,
GameNode의 기능을 이름만 빌려 본인대로 정의한다.
그러면 추가하는 클래스마다 GameNode객체가 생길텐데..
굳이 이렇게 설정하는 이유는?
그냥 GameNode가 아닌 비슷한 다른 상위 클래스(아니면 그냥 아예 인터페이스)를
두고 사용하는게 맞지 않나.?
왜 GameNode를 굳이 상속받지 메서드 이름과 형식만 맞추려고?
비용이 크다
클래스를 MainGame에서 넣거나 빼는 것으로 관리할 수 있겠다.
GameNod를 상속받아 init, release, update, render를 구현함
여기에 사용할 클래스나 이미지를 넣는다.