์ง๊ธ๊น์ง ๋ฐ์ํ๊ณ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์.
1. ๋ฌผ์ฒด๋ฅผ ์์ง์์ ๋ ๋จ๋ ์์ ๋ฌธ์ ๋ ๋งค๋ฒ ์ ์ฒด ํฝ์ ์ ๋ฌดํจํ ํ๊ณ ๋ค์ ๊ทธ๋ ค์ฃผ์ด์ผ ํ๋ค.
2. ๋ฌผ์ฒด๊ฐ ๋ง์ด ์์ฑํ ๋ ๊น๋นก ๊ฑฐ๋ฆฌ๋ ๋ฌธ์ ๋ ๋๋ธ ๋ฒํผ๋ง์ ์ด์ฉํ๋ค.
- ํ๋ฉด ์ ์ฒด ๋ฌดํจํ
์ผ๋จ ์ ์ฒด ํ๋ฉด ํฌ๊ธฐ์ ํฐ์ ๋ํ์ผ๋ก ๊ทธ๋ ค์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
void Core::Render()
{
// ํ๋ฉด clear
Rectangle(hDC, -1, -1, ptResolution.x + 1, ptResolution.y + 1);
Vec2 vPos = obj.getPos();
Vec2 vScale = obj.getScale();
Rectangle(hDC,
int(vPos.x - vScale.x / 2.f),
int(vPos.y - vScale.y / 2.f),
int(vPos.x + vScale.x / 2.f),
int(vPos.y + vScale.y / 2.f));
}
- ๋๋ธ ๋ฒํผ๋ง
์ฐ๋ฆฌ๋ ํ์ฌ ํ๋ฉด A์ ๊ทธ๋ฆฌ๊ณ ๋ณด๊ณ ์๋ค๊ณ ํ์. A ํ๋ฉด ๋ค๋ก B ํ๋ฉด์ ํ๋ ๋ ๋ง๋ค์ด์ ๊ธฐ์กด ๊ทธ๋ฆฌ๋ ์์ ์ Bํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ ๋ค ๊ทธ๋ฆฐ ํ์ Aํ๋ฉด์ผ๋ก ๋ณต์ฌํด ์ ๋ฌํด์ฃผ๋ฉด ๊ทธ๋ฆฌ๋ ํ๋ฉด์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ด์ง ์๊ณ ์ต์ข ์ ์ผ๋ก ๊ทธ๋ ค์ง ํ๋ฉด๋ง์ ํ์ธํ ์ ์๋ค.
๋นํธ๋งต : ์ฐ๋ฆฌ๊ฐ ๋ณด๋ ์๋์ฐ ์ฐฝ์ ํฝ์ ์ ๋ชจ๋ ํฉ์ณ ์ผ์ปซ๋๋ค.
// Core.h
class Core {
SINGLE(Core);
private:
HWND handle;
POINT ptResolution;
HDC hDC;
HBITMAP hBit; // ์ถ๊ฐ!
HDC mDC; // ์ถ๊ฐ!
private:
void Update();
void Render();
public:
int Init(HWND _hWnd, POINT _ptResolution);
void Progress();
HWND getMainHandle() { return handle; }
};
// Core.cpp
#include "pch.h"
#include "Core.h"
#include "TimeManager.h"
#include "Object.h"
Object obj;
Core::Core()
:handle(0)
, ptResolution{}
, hDC(0)
, hBit(0) // ์ด๊ธฐํ
, mDC(0) // ์ด๊ธฐํ
{
}
Core::~Core()
{
ReleaseDC(handle, hDC);
DeleteDC(mDC); // ์ญ์
DeleteObject(hBit); // ์ญ์
}
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);
hDC = GetDC(handle);
// ์ด์ค ๋ฒํผ๋ง ์ฉ๋์ ๋นํธ๋งต๊ณผ DC๋ฅผ ๋ง๋ ๋ค
hBit = CreateCompatibleBitmap(hDC, ptResolution.x, ptResolution.y);
mDC = CreateCompatibleDC(hDC);
HBITMAP hOldBit = (HBITMAP)SelectObject(mDC, hBit);
DeleteObject(hOldBit);
// Manager์ด๊ธฐํ
TimeManager::Instance()->Init();
obj.setPos(Vec2((float)(ptResolution.x / 2), (float)(ptResolution.y / 2)));
obj.setScale( Vec2(100, 100 ));
return S_OK;
}
void Core::Progress()
{
// Manager update
TimeManager::Instance()->update();
Update();
Render();
}
void Core::Update()
{
Vec2 vPos = obj.getPos();
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
vPos.x -= 200.f * TimeManager::Instance()->getfDT();
}
if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
vPos.x += 200.f * TimeManager::Instance()->getfDT();
}
obj.setPos(vPos);
}
void Core::Render()
{
// ํ๋ฉด clear
Rectangle(mDC, -1, -1, ptResolution.x + 1, ptResolution.y + 1);
Vec2 vPos = obj.getPos();
Vec2 vScale = obj.getScale();
Rectangle(mDC,
int(vPos.x - vScale.x / 2.f),
int(vPos.y - vScale.y / 2.f),
int(vPos.x + vScale.x / 2.f),
int(vPos.y + vScale.y / 2.f));
BitBlt(hDC, 0, 0, ptResolution.x, ptResolution.y, // ๋ชฉ์ ์ง, ๋ณต์ฌ ๋ฐ์ ๋ถ์
mDC, 0, 0, SRCCOPY); // ๋ณต์ฌ ๋์
}
์ค์ ๋ถ๋ถ์ ์๋์ ๊ฐ๋ค.
๊ฐ์ ํด์๋ ํฌ๊ธฐ์ ๋นํธ๋งต์ ํ๋ ๋ง๋ค๊ณ ์ด ํธ๋ค ์์ด๋๋ฅผ ๋ฐ์, ์ด ๋นํธ๋งต์ ์๋๋ก ํ๋ DC๋ฅผ ์์ฑํ๋ค. ์ด์ค ๋ฒํผ๋ง์ ๊ตฌํํ ๋, ์๋ก ์์ฑ๋ ๋นํธ๋งต์ DC์ ์ ํํ์ฌ ๊ทธ ๋นํธ๋งต์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋๋ก ์ค์ ํ๋ ๊ฒ์ด ํ์ํ๋ฐ ์ด ๊ณผ์ ์์ ์ด์ ์ ์ ํ๋ ๋นํธ๋งต์ ๋ฐํ๋ฐ์, ์ฌ์ฉ์ด ๋๋ ํ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด๋ฅผ ์ญ์ ํด์ผ ํ๋ ์ผ์ ์งํํด์ผ ํ๋ค.
์์ฑ๋ ๊ฒ์ ๋ณต์ฌํ๋ ์ฝ๋๊ฐ ํ์ํ๋ฐ ์ด๋ ์ฌ์ฉํ๋ ํจ์๋ BitBlt()์ด๋ค.
BOOL BitBlt(
HDC hdcDest, // ๋ณต์ฌํ ๋์ DC ํธ๋ค
int xDest, // ๋์ DC ์ผ์ชฝ ์ ๋ชจ์๋ฆฌ์ x์ขํ
int yDest, // ๋์ DC ์ผ์ชฝ ์ ๋ชจ์๋ฆฌ์ y์ขํ
int width, // ๋ณต์ฌํ ๋นํธ๋งต์ ๋๋น
int height, // ๋ณต์ฌํ ๋นํธ๋งต์ ๋์ด
HDC hdcSrc, // ๋ณต์ฌํ ์๋ณธ DC ํธ๋ค
int xSrc, // ์๋ณธ DC์์์ x์ขํ
int ySrc, // ์๋ณธ DC์์์ y์ขํ
DWORD rop // ๋์คํฐ ์์
์ฝ๋
);
์ด ํจ์๋ ํ๋ํ๋์ ํฝ์ ์ ์ฎ๊ธฐ๋ ๋ฐ๋ณต ํ์๋ผ ๋ง์ด ๋๋ฆฌ๋ค (ํ๋ ์ ๋๋ ๋ฐ์). CPU๋ก ์ด ์์ ์ ํ๊ธฐ์ ๋๋ฌด ๋ญ๋น์ด๊ธฐ ๋๋ฌธ์ ๋ค์ด๋ ํธX๋ถํฐ๋ GPU๋ฅผ ํ์ฉํ๊ฒ ๋๋ค. winAPI์์๋ ๋๋ฆฌ๊ธดํ๋ฐ, ์ด๋ฏธ ํ ํฝ์ ๋จ์๋ก ์ฎ๊ธฐ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ ๋จ์ด์ง์ง ์๋๋ค.
'๐ค Study > winAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[winAPI 07] Scene & Scene Manager (1) | 2024.06.04 |
---|---|
[winAPI 06] Key Manager (1) | 2024.06.04 |
[winAPI 04] Timer (0) | 2024.04.09 |
[winAPI 03] Core class & Singleton (0) | 2024.04.08 |
[winAPI 02] ๋ง์ฐ์ค๋ก ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ & ๊ฒ์ ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๊ตฌ์กฐ (0) | 2024.04.08 |