API 프레임워크 구축(3) GameCore

Gloz·2022년 11월 27일
0

API에 대한 내용

목록 보기
7/11

프레임워크 구축

  • API 프레임 워크를 구축함에 있어서 현재 WinMain.cpp를 제외하고 앞에서 정리해놓은
    Stdafx.h 을 제외한 Image를 넣을 클래스와 코어 부분인 GameNode 그리고 매니저클래스의 KeyManager 부분을 하나씩 정리하겠다.

GameCore

GameNode.h

  • GameNode.h
#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(){}
}

GameNode.cpp

  • GameNode.cpp
#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를 추가하여 넣으면 된다.

profile
개발자가 되기 위해 조금씩 나아가겠습니다.

0개의 댓글