🧐 Study/winAPI

[winAPI 03] Core class & Singleton

GAMEMING 2024. 4. 8. 05:26

 

 

μ½”μ–΄(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만번 정도가 λŒμ•„κ°€μ„œ(λ„ˆλ¬΄ λΉ¨λΌμ„œ) μƒκΈ°λŠ” λ¬Έμ œλ‹€

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ λ°©μ•ˆμ€ λ‹€μŒ μ‹œκ°„μ—..

 

 

 

 

728x90