League Of Legends - Link Select [winAPI 03] Core class & Singleton
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/winAPI

[winAPI 03] Core class & Singleton

by GAMEMING 2024. 4. 8.
728x90

 

 

์ฝ”์–ด(Core)๋Š” ๋ง๊ทธ๋Œ€๋กœ ์ค‘์‹ฌ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ ์ฃผ์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์ „๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋ฉฐ ์‹ฑ๊ธ€ํ†ค(singleton)์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ„ด์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๋•Œ ์ฝ”์–ด ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ค‘์‹ฌ์ด ๋  ๊ฒƒ์ด๊ธฐ์— ์ด ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์ผ ์ˆ˜๊ฐ€ ์—†์–ด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

 

- Core class ( ๋™์ ํ• ๋‹น Heap ์˜์—ญ ์‚ฌ์šฉ )

// Core.h
class Core {
private:  
	static Core* pInst;  
	
	Core();
	~Core();

public:
	static Core* Instance()   
	{
		if (pInst == nullptr) {
			return new Core; 
		}
		return pInst; 
	}

	static void Release()
	{
		if (pInst != nullptr) {
			delete pInst;
			pInst = nullptr;
		}
	}

};


// Core.cpp
#include "Core.h"

Core* Core::pInst = nullptr; 


// main.cpp - wWinMain
 Core* pCore = Core::Instance();

 

 

 

์šฐ์„  ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ํ•˜๋‚˜๋กœ ์ œํ•œํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

์ƒ์„ฑ์ž์™€ ์†Œ๋ฉธ์ž๋Š” private์œผ๋กœ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์˜ค๋กœ์ง ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ๋งŒ ๋งŒ๋“ค๊ณ  ์ง€์šฐ๊ณ  ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

 

์–ด๋””์„œ๋“  ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๋ ค๋ฉด?

→  ์ž๊ธฐ ์ž์‹ ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. ๋‹ค๋งŒ, ์ƒ์„ฑ์ž์™€ ์†Œ๋ฉธ์ž๊ฐ€ private์œผ๋กœ ์„ ์–ธ๋  ๊ฒฝ์šฐ ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค(ํ”„๋ผ์ด๋น—์ด๋ผ ์ƒ์„ฑ์ž๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ). ๊ฐ์ฒด๊ฐ€ ์—†๋Š”๋ฐ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์™€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€? 

→  No. ๋ˆ„๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์–ด(this๊ฐ€ ์—†์Œ) ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

→  ๋ฉค๋ฒ„ ์—†์ด ํ˜ธ์ถœํ•˜๋ ค๋ฉด static(์ •์ )์œผ๋กœ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค

→  ์ •์  ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€ ์ •์  ๋ฉค๋ฒ„๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ •์ (static) ๋ณ€์ˆ˜ ์„ ์–ธ์— ๋Œ€ํ•˜์—ฌ

 1. ํ•จ์ˆ˜ ์•ˆ์— ์„ ์–ธ  data ์˜์—ญ (ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ํ• ๋‹น๋œ ๊ณต๊ฐ„์— ๋‚จ์•„์žˆ์Œ -> ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ) 
 2. ํŒŒ์ผ ์•ˆ์— ์„ ์–ธ data์˜์—ญ, ํŒŒ์ผ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ
 3. ํด๋ž˜์Šค ์•ˆ์— ์„ ์–ธ data์˜์—ญ / ํด๋ž˜์Šค์˜ ์‚ฌ์ด์ฆˆ(ํฌ๊ธฐ)์™€๋Š” ์ƒ๊ด€ ์—†๊ฒŒ , ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

  →  ์–ด๋””์„œ๋“  ๋งŒ๋“ค๋”๋ผ๋„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์žˆ๋Š” ๊ฒƒ

 *  ์ •์ ๋ฉค๋ฒ„๋Š” ๋ฌด์กฐ๊ฑด ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์ดˆ๊ธฐํ™” ํ•ด์ค˜์•ผํ•จ ์•ˆํ•˜๋ฉด ๋งํฌ ์˜ค๋ฅ˜

 

 

Core ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ ๋‘ ๊ฐ€์ง€๋ฅผ ๋งŒ๋“ค์ž

 

1. ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๋Š” ํ•จ์ˆ˜ ( static Core* Instance() )

 ์ž๊ธฐ ์ž์‹ ์˜ ํฌ์ธํ„ฐํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” Instanceํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค

 → ์ตœ์ดˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ (pInst๊ฐ€ nullptr์ธ ๊ฒฝ์šฐ) : ๋™์ ์œผ๋กœ Core ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 → 2๋ฒˆ ์ด์ƒ ํ˜ธ์ถœ์ธ ๊ฒฝ์šฐ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

2. ํ•ด์ œํ•˜๋Š” ํ•จ์ˆ˜ ( static void Release() )

 ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด๋Š” ํ•ด์ œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. pInst๊ฐ€ nullptr์ด ์•„๋‹ˆ๋ผ๋ฉด(๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด) ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ๊ทธ ๊ณต๊ฐ„์€ nullptr๋กœ ๋ฐ”๊พผ๋‹ค. 

 

 

pInst๋Š” Core.cpp์—์„œ ๋ฌด์กฐ๊ฑด ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

 

 

 

- Core class ( Data์˜์—ญ ์‚ฌ์šฉ )

class Core {
private:
	Core();                
	~Core();

public:
	static Core* Instance() {
		static Core core;
		return &core;
	}
};

 

 

๊ฐ„๋‹จํ•˜๋‹ค. Core์˜ ์ฃผ์†Œ๋ฅผ ์–ป์–ด์„œ ์ ‘๊ทผํ•˜๋ฉด ๋˜๋Š”๋ฐ ํ•ด์ œ ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋‹จ์ ์œผ๋กœ๋Š” ํ”„๋กœ๊ทธ๋žจ ์ค‘๊ฐ„์— ์ง€์šธ ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค. ๋ณดํ†ต Manager์—์„œ ์“ฐ์ด๋ฉฐ ๊ตณ์ด ์ง€์šธ ํ•„์š” ์—†์„ ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

 

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค์€ ๋งคํฌ๋กœ๋กœ ์ •ํ•ด๋‘๋ฉด ์ข‹๋‹ค์šฐ์„  ๊ทธ ์ „์— ๋ฏธ๋ฆฌ ๋งŒ๋“ค๊ณ  ๋‹ค์‹œ ์‚ดํŽด๋ณผ ๊ฒฝ์šฐ๊ฐ€ ์—†๋Š” ๊ฒƒ๋“ค์„ ๋ชจ์•„ pch.h๋กœ ๋งŒ๋“ค๊ณ , ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ๋œ ํ—ค๋”๋กœ ๋งŒ๋“ค์–ด ๋†“์ž.๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ๋œ ํ—ค๋”๋Š” ๋ชจ๋“  cppํŒŒ์ผ์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์†๋„๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

// pch.h

#pragma once
#include <windows.h>

#include "define.h"

 

 

* ํ”„๋กœ์ ํŠธ์˜ ์†์„ฑ → C/C++ → ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ํ—ค๋” → ๋งจ ์œ„์˜ ์„ค์ • ๋งŒ๋“ค๊ธฐ + ๋‘ ๋ฒˆ์งธ ํ—ค๋” ํŒŒ์ผ ์ด๋ฆ„ ์„ค์ •

 

 

 

define.h ๋‚ด๋ถ€์— Core ํด๋ž˜์Šค์˜ instance๋ถ€๋ถ„์„ ๋งคํฌ๋กœ๋กœ ์ง€์ •ํ•œ๋‹ค.

 

#include "pch.h"

# define SINGLE(type) public:\
		static Core* Instance()\
		{\
		static Core mgr;\
		return &mgr;\
		}

 

 

์—ฌ๊ธฐ์„œ ๋ฐฑ์Šฌ๋ž˜์‰ฌ(\)๋Š” ๋งคํฌ๋กœ ๋‚ด์—์„œ ํ•œ ์ค„ ๋„์šฐ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. public๋„ ์žŠ์ง€๋ง์ž.๋ชจ๋“  cpp ํŒŒ์ผ ๋‚ด์— pch.h๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด,์œ„์˜ Core ํด๋ž˜์Šค ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

#pragma once
class Core {
	SINGLE(Core);
private:
	Core();                
	~Core();

public:
};

 

 

 

 

- Core class๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด์ƒ๋„ ์„ค์ •๊ณผ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ

 

๋ณธ๊ฒฉ์ ์œผ๋กœ Core class๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด๋ณด์ž.

 

 

// Core.class

class Core {
	SINGLE(Core);
private:
	HWND    handle;         
	POINT   ptResolution; 
	HDC     hDC;          

	Core();                
	~Core();

public:
	int Init(HWND _hWnd, POINT _ptResolution);
	void Progress();
};

 

 

 

Core ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ฐฝ ํ•ธ๋“ค์„ ๋ฐ›์„ ๋ณ€์ˆ˜(handle)์™€, ํ•ด์ƒ๋„๋ฅผ ๋ฐ›์„ ๋ณ€์ˆ˜(ptResolution)์„ ๋งŒ๋“ ๋‹ค, hDC๋Š” ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜๋กœ ์กฐ๊ธˆ ์ด๋”ฐ๊ฐ€ ๋ฐ‘์—์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 

์ด ๋ณ€์ˆ˜๋“ค์€ ๋ชจ๋‘ private์œผ๋กœ ์ด ๊ฐ’๋“ค์„ ๊ฐ€์ง€๊ณ  ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋“ค์€ public์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

 

 

#include "pch.h"
#include "Core.h"

Core::Core()
	:handle(0)
	, ptResolution{}
	, hDC(0)
{

}

Core::~Core()
{
	ReleaseDC(handle, hDC);
}

int Core::Init(HWND _handle, POINT _ptResolution)
{  
	handle = _handle;
	ptResolution = _ptResolution;

	RECT rt = {0, 0 , ptResolution.x, ptResolution.y };  
	AdjustWindowRect(&rt, WS_OVERLAPPEDWINDOW, true);
	SetWindowPos(handle, nullptr, 100, 100, rt.right - rt.left, rt.bottom - rt.top, 0);

	return S_OK;
}

void Core::Progress()
{

}

 

 

 

Core.cpp์„ ์‚ดํŽด๋ณด๊ฒ ๋‹ค. ์šฐ์„  ์ƒ์„ฑ์ž์—์„  ๊ฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ดˆ๊ธฐํ™”๋ฅผ, ์†Œ๋ฉธ์ž์—์„  ์ถ”ํ›„์— ์“ธ hDC๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ถ€๋ถ„์„ ์จ์ค€๋‹ค.

 

Init()ํ•จ์ˆ˜๋Š” class ๊ฐ์ฒด๊ฐ€ ์‹œ์ž‘ํ•  ๋•Œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋„ฃ์€ ํ•จ์ˆ˜๋‹ค. ํ•ธ๋“ค ๊ฐ’(_handle)๊ณผ ์„ค์ •ํ•  ํ•ด์ƒ๋„ ๊ฐ’(_ptResolution)์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค.

๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ handle์™€ ptResolution์— ๋„ฃ๋Š”๋‹ค.

 

AdjustWindowRect() ํ•จ์ˆ˜๋Š” ์œˆ๋„์šฐ๊ฐ€ ์‹ค์ œ๋กœ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์„ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ, ๋ฉ”๋‰ด๋ฐ”๋‚˜ ์œˆ๋„์šฐ ์ฐฝ ์ฃผ๋ณ€์œผ๋กœ ์ƒ๊ฒจ์žˆ๋Š” ํ…Œ๋‘๋ฆฌ ์˜์—ญ(8pixel ์ •๋„)๋ฅผ ์ œ์™ธํ•œ ์˜์—ญ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

IpRect : ์œˆ๋„์šฐ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” RECT ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ
dwStyle : ์œˆ๋„์šฐ์˜ ์Šคํƒ€์ผ (๋ชจ์–‘๊ณผ ๋™์ž‘ - ํ…Œ๋‘๋ฆฌ, ์ œ๋ชฉ ํ‘œ์‹œ์ค„, ํฌ๊ธฐ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋“ฑ)
bMenu : ๋ฉ”๋‰ด๋ฐ”

 

 

 

ํ˜„์žฌ RECT ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋ฉฐ SetWindowPos() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์œˆ๋„์šฐ์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

rt-right - rt.left ์™€ rt.bottom - rt.top์€ ๊ฐ๊ฐ ์œˆ๋„์šฐ์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

hWnd: ์œˆ๋„์šฐ ํ•ธ๋“ค
hWndInsertAfter: ์ƒˆ๋กœ์šด Z ์ˆœ์„œ๋ฅผ ์„ค์ •
X: ์œˆ๋„์šฐ์˜ x ์ขŒํ‘œ
Y: ์œˆ๋„์šฐ์˜ y ์ขŒํ‘œ
cx: ์œˆ๋„์šฐ์˜ ๋„ˆ๋น„
cy: ์œˆ๋„์šฐ์˜ ๋†’์ด
uFlags: ์œˆ๋„์šฐ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ”Œ๋ž˜๊ทธ

 

 

 

๋‹ค์Œ์€ main์„ ์ˆ˜์ •ํ•ด ๋ฐ˜์˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);


    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT, szWindowClass, MAX_LOADSTRING);
   
    MyRegisterClass(hInstance);


    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    if (FAILED(Core::Instance()->Init(hWnd, POINT{ 1280, 768 }))) { 
        MessageBox(nullptr, L"Core ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ์‹คํŒจ", L"ERROR", MB_OK);   
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT));

    MSG msg;

    while (true){
        if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
            if (WM_QUIT == msg.message)
                break;

            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else{
            Core::Instance()->Progress();
        }
    }

    return (int) msg.wParam;
}

 

 

 

์•ž์„œ ๋‹ค๋ฃจ์—ˆ๋“ฏ์ด Core ๊ฐ์ฒด๋Š” Instance()๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ•ด์„œ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•ด ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์‹คํ–‰ํ•˜์ž.

ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃจ๊ณ  ์žˆ๋˜ ์ฐฝ์˜ handle ๊ฐ’๊ณผ 1280, 768์„ ํ•ด์ƒ๋„ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๊ฒ ๋‹ค.

 

๋งŒ์•ฝ ์ด ์ž‘์—…์„ ์‹คํŒจํ•˜๋ฉด FALED ๊ฐ’์ด true๊ฐ€ ๋˜์–ด ๋ฉ”์„ธ์ง€ ๋ฐ•์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋„๋ก ํ•˜์ž.

 

์‹คํŒจ ์‹œ ๋‚˜์˜ค๋Š” ๋ฉ”์„ธ์ง€ ๋ฐ•์Šค

 

 

 

 

์ด์ œ ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ ค๋ณด์ž.

์ด์ œ๋Š” Core class ๋‚ด๋ถ€์˜ Progress() ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์„ ์—ฌ๊ธฐ์— ์ฝ”๋”ฉํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ธฐ ์ž‘์—… ๋˜ํ•œ ์—ฌ๊ธฐ์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฉ”์„ธ์ง€์—์„œ ์ฒ˜๋ฆฌํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์ด DC๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค ๋‚ด๋ถ€์— HDC ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ค€ ๊ฒƒ.

 

์ด๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆด ๊ฒƒ์ธ๊ฐ€? 

Object ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ฒ ๋‹ค

 

// Object.h
#pragma once

class Object {
public:
	POINT	ptPos;
	POINT	ptScale;

public:
	Object();
	~Object();
};


// Object.cpp
#include "pch.h"
#include "Object.h"

Object::Object()
	: ptPos{}
	, ptScale{}
{
}

Object::~Object()
{
}

 

 

 

์•ž์œผ๋กœ ์ด Object class๋ฅผ ์ด์šฉํ•ด ๊ฒŒ์ž„์— ์กด์žฌํ•˜๋Š” ๋ฌผ์ฒด๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. ๋ณดํ†ต ํ˜„์žฌ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋“ค์€ private์„ ์ด์šฉํ•ด ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์˜ณ์ง€๋งŒ, public์œผ๋กœ ์ผ๋‹จ ์„ค์ •ํ•˜๊ฒ ๋‹ค.

 

 

// Core.cpp
#include "Object.h"

Object obj;

//  ...

int Core::Init(HWND _handle, POINT _ptResolution)
{
	// ...
	hDC = GetDC(handle);

	obj.ptPos = POINT{ ptResolution.x, ptResolution.y };
	obj.ptScale = POINT{ 100,100 };
    
	return S_OK;
}

void Core::Progress()
{
	Rectangle(hDC, 10, 10, 110, 110);
}

 

 

 

hDC ๋ณ€์ˆ˜์— handle ๊ฐ’์„ ์ด์šฉํ•ด DC๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆด ๋•Œ ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ๊ตฌ์กฐ์ฒด์— ์ „๋‹ฌํ•ด์ฃผ๋„๋ก ํ•œ๋‹ค.

์ดํ›„ Progress() ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ ค์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

 

 

๋ฉ”์„ธ์ง€ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ๊ณ„์†ํ•ด์„œ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฐ ๊ฒƒ์ด๋‹ค.

(์‹ค์ œ ๊ฒŒ์ž„์€ ๊ฐ ์žฅ๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค. ์ด๋ฅผ ๋ Œ๋”๋ง์ด๋ผ ํ•˜๊ณ  1์ดˆ 60๋ฒˆ ํ•ด์•ผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ž„ )

 

๋‹ค์Œ์€ ํ‚ค ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ์‚ฌ๊ฐํ˜•์„ ์ด๋™์‹œ์ผœ๋ณด์ž

 

 

 

- ํ‚ค ์ž…๋ ฅํ•ด์„œ ์‚ฌ๊ฐํ˜• ์ด๋™ํ•˜๊ธฐ (Updateํ•ฉ์ˆ˜์™€ Renderํ•จ์ˆ˜)

 

// Core.h
class Core {
	SINGLE(Core);
private:
	HWND    handle;       
	POINT   ptResolution; 
	HDC		hDC;         

	Core();
	~Core();

private:
	void Update();  // ์ถ”๊ฐ€
	void Render();  // ์ถ”๊ฐ€

public:
	int Init(HWND _hWnd, POINT _ptResolution);
	void Progress();
};


// Core.cpp

// Init ํ•จ์ˆ˜ 
	obj.ptPos = POINT{ ptResolution.x / 2, ptResolution.y / 2 };  // ์ˆ˜์ •
    
oid Core::Progress()
{
	Update();
	Render();
}


void Core::Update()   
{
	// ํ‚ค์ž…๋ ฅ..
	if (GetAsyncKeyState(VK_LEFT) & 0x8000) {  

		obj.ptPos.x -= 1;
	}
	if (GetAsyncKeyState(VK_RIGHT) & 0x8000) { 

		obj.ptPos.x += 1;
	}
}

void Core::Render() 
{
	Rectangle(hDC,
		obj.ptPos.x - obj.ptScale.x / 2,
		obj.ptPos.y - obj.ptScale.y / 2, 
		obj.ptPos.x + obj.ptScale.x / 2,
		obj.ptPos.y + obj.ptScale.y / 2);
}

 

 

Update() ํ•จ์ˆ˜๋Š” ๋ฌผ์ฒด์˜ ๋ณ€๊ฒฝ๋œ ์ขŒํ‘œ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋ฉฐ, Render()์€ ์ด ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ๊ทธ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

 

GetAsyncKeyState() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ๋น„ํŠธ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ 0x8000๊ณผ ๋น„ํŠธ์—ฐ์‚ฐ ํ•ด์ฃผ๋ฉด ํ‚ค๊ฐ€ ๋ˆŒ๋ ธ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ‚ค๊ฐ€ ๋ˆŒ๋ ธ์„ ๋•Œ ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ค„์ด๋Š” ์ฝ”๋“œ๋‹ค.

 

๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด์ž

 

 

 

ํ‚ค๋ณด๋“œ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค

์ž˜๋ชป๋œ๊ฒŒ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ฝ”๋“œ์—์„œ Progress()ํ•จ์ˆ˜๊ฐ€ 1์ดˆ์— 4๋งŒ๋ฒˆ ์ •๋„๊ฐ€ ๋Œ์•„๊ฐ€์„œ(๋„ˆ๋ฌด ๋นจ๋ผ์„œ) ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋‹ค

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์•ˆ์€ ๋‹ค์Œ ์‹œ๊ฐ„์—..