#pragma once
#include "GImage.h"
class GameNode
{
private:
GImage* _backBuffer; // 백 버퍼 설정해주기
void setBackBuffer(void);
public:
// 가상함수 생성
// HRESULT : 함수가 성공적으로 실행되었는지 체크
// ㄴ 32 비트 signed 정수 (음수가 아닌 값들은 성공을 의미하며 음수값들은 실패를 의미)
virtual HRESULT init(void);
virtual void release(void);
virtual void update(void);
virtual void render(HDC hdc);
// virtual을 씀으로써 자식 클래스에게 오버라이딩, 즉 함수의 재정의를 할 수 있게 해준다.
GImage* getBackBuffer(void) { return _backBuffer; }
// 메인 프로시저
// LRESULT : 콜백의 반환형으로 많이 사용된다.
// ㄴ 메세지 처리를 마친 후 OS에게 신호를 주기 위한 값
// ㄴ 스위치문에서 각 메세지에 대한 처리값을 -1, 0, 1로 운영체제에 어떤 작업을 해야하는지 알려준다.
// 0을 반환하면 모든 메세지가 처리되었다는 것을 의미
virtual LRESULT MainProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
GameNode(){}
// 상속을 받은 애들이 만약 부모 클래스가 소멸되어버리면 상속받은 자식클래스들은 댕글링이 발생하므로 virtual을
// 통해 부모클래스가 소멸되면 자식클래스드들도 다 소멸되게끔 하기 위해 virtual을 써서 소멸시켜버린다.
virtual GameNode(){}
}
#include "Stdafx.h"
#include "GameNode.h"
HRESULT GameNode::init(void)
{
// 타이머 초기화
// SetTimer(): 일정한 주기마다 정해진 함수를 실행 시키는 함수
// ㄴ 핸들, 타이머 번호, 타이머 주기, 주기마다 실행될 함수
SetTimer(_hWnd,1,10,NULL);
// WinMain.cpp 에서 전역변수로 HWND _hWnd를 설정해두었다. ( 즉, 핸들이 _hWnd )
// 키 매니저 초기화
KEYMANAGER->init(); // -> 이 부분에 대해서는 다음에 마저 설정하겠다.
// 랜덤펑션 초기화
RND->init(); // -> 이 부분은 내가 임의로 랜덤값을 출력하게끔 만들어 놓은 프레임워크이다.
// 초기화가 될때 백퍼버가 되게끔 하기 위해서
this->setBackBuffer();
return S_OK; // 함수가 성공적으로 실행되었음을 알려줌
}
void GameNode::setBackBuffer(void)
{
// 백 퍼버가 하나의 출력문과 다른 화면창에 미리 보여질 내용을 그려내놓기에 GImage클래스의 동적할당을 이용해
// 미리 만들어 놓는다.
_backBuffer = new GImage;
_backBuffer->init(WINSIZE_X,WINSIZE_Y);
}
void GameNode::release(void)
{
// 타이머 해제
// ㄴ 타이머는 new와 같이 삭제하지 않고 종료하면 메모리 릭이 발생한다.
// 고로 타이머는 사용하면 반드시 삭제해야한다.
// ㄴ 핸들, 타이머 번호
KillTimer(_hWnd,1);
// 키 매니저에 대한 싱글톤 해제
KEYMANAGER->releaseSingleton();
// 랜덤펑션 싱글통 해제
RND->releaseSingleton();
// 백버퍼가 들어오니 안전하게 제거
SAFE_DELETE(_backBuffer); // 이 SAFE_DELETE는 Stdafx.h에 정의되어 있다.
}
void GameNode::update(void)
{
// 버퍼링 처리와 고성능 타이머가 없기에 기본 함수 사용
// 새로 고침
InvalidateRect(_hWnd,NULL,false);
// 특정 부분이 아닌 화면 전체를 싹다 지움
}
void GameNode::render(HDC hdc)
{
// 상속을 받을것이기에 이걸 넣으면 상속 받은 애는 화면에 출력이 될 것이다.
// 표현하는 곳
}
// WinMain.cpp안에 메인프로시저에 넣기 전에 미리 여기서 검사를 시작하고 넘겨줘야
// OS에 과부하가 생기지 않을 것이다.
LRESULT GameNode::MainProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps; // -> 페인트 구조체
switch(iMessage)
{
case WM_TIMER: // 이곳에 계속해서 초기화가 일어날 것임
this->update();
break;
case WM_PAINT: // 이 부분은 render부분 , 화면에 출력하게끔 만들어줄 것임
hdc = BeginPaint(hWnd, &ps);
this->render(hdc);
EndPaint(hWnd, &ps);
break;
case WM_MOUSEMOVE:
_ptMouse.x = LOWORD(lParam);
_ptMouse.y = HIWORD(lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}
나머지 나머지 부분에 대해서 계속해서 업데이트 해 나아갈 것이다.
MainProc부분에 마우스의 움직임이나, 아니면 마우스 클릭시에 더 넣을시에 case를 추가하여 넣으면 된다.