- κΈ°μ‘΄ ν€ μ λ ₯ λ°©μμ λ¬Έμ
μ°μ λ°μν μ μλ 첫 λ²μ§Έ μν©μ Aμ B λ¬Όμ²΄κ° μ΄λνλ κ²μμμ ν€ λ§€λμ κ° μλ€λ©΄, κ° λ¬Όμ²΄λ μμ μ ν€ μ λ ₯μ κ°λ³μ μΌλ‘ μ²λ¦¬νκ² λλ€. κ·Έλ κ² λ κ²½μ° ν€λ₯Ό μ²λ¦¬νλ μ λ°± λ²μ μν© μ€μ A 물체λ νμ¬ νλ μμμ μ΄λμ μ²λ¦¬νμ§λ§, B 물체λ λ€μ νλ μμμ μ΄λμ μ²λ¦¬νλ κ²½μ°κ° μκΈΈ μ μλ€. μ΄λ μ μ μ μ μ₯μμ A 물체λ λ¨Όμ μ΄λνκ³ , B 물체λ μ½κ°μ μ§μ° νμ μ΄λνλ κ²μ²λΌ 보μ΄κ² λλ€.
λ λ²μ§Έ μν©μ μ°λ¦¬κ° μ ν κ²μμ νλ€κ³ κ°μ νμ. μ§§κ² μ νν λμ κΈΈκ² μ νλ₯Ό λλ₯Ό λ λ λΌκ°λ νκ³Ό κ±°λ¦¬κ° λ€λ₯΄κ² μ€κ³νλ €κ³ νλ€λ©΄, μ΄λ₯Ό μ΄λ»κ² ꡬνν κ²μΈκ°?
νμ¬ μ°λ¦¬κ° μμ
νλ ꡬ쑰λ λ§€ μκ°μκ° UPDATE ν¨μλ₯Ό νμΈνκ³ , λͺ¨λ μ
λ°μ΄νΈκ° λλλ©΄ μ΄ λ³κ²½μ μ λ°μνμ¬ κ·Έλ¦¬κ³ μλ€. μ΄ κ³Όμ μ΄ 1νλ μμ κ³Όμ μ΄κ³ μ΄ ν νλ μμ 걸리λ μκ°μ DTλΌκ³ ν¨. ex) 900νλ μμ΄λΌ νλ©΄ 1μ΄μ 900λ² μμ
ν¨
μ°λ¦¬λ ν νλ μ μκ°(DT)μ΄ μ§λ νμ κ²°κ³Όκ°μ λ³Ό μ μκΈ°μ, κ·Έ λ¬Όμ²΄κ° λ°λ‘λ°λ‘ μ΄λνλ κ²μ λ³Ό μ μμ. Aμ λ¬Όμ²΄κ° λ¨Όμ μ΄λνκ³ κ·Έ ν Bκ° μ΄λνλλΌλ, ν DTμμμ μΌμ΄λ¬μΌλ©΄ μ΄λ μ μ κ° λ΄€μ λ κ± λμμ μμ§μ΄λ κ²κ³Ό λ€λ¦ μμ. ν νλ μμμ μ μ©λ ν€λ 무쑰건 κ°μ μ΄λ²€νΈλ‘ μ²λ¦¬λμ΄μΌ νλ€.
- Key Managerλ₯Ό μ¬μ©νλ μ΄μ
1) νλ μ λκΈ°ν : λμΌ νλ μμμ μΌμ΄λ μΌμ κ°μ ν€μ λν΄ λμΌν μ΄λ²€νΈλ‘ μ²λ¦¬ν΄μΌ ν¨.
2) ν€ μ λ ₯μ μ¬λ¬ μ΄λ²€νΈλ‘ λλ μ²λ¦¬ : TAP, HOLD, AWAY, NONE
// KeyManager.h
enum class KEY_STATE {
NONE,
TAP,
HOLD,
AWAY,
};
enum class KEY {
LEFT,
RIGHT,
UP,
DOWN,
Q,
W,
E,
R,
T,
Y,
U,
I,
O,
P,
A,
S,
D,
F,
G,
Z,
X,
C,
V,
B,
ALT,
CTRL,
LSHIFT,
SPACE,
ENTER,
ESC,
LAST,
};
struct keyInfo {
KEY_STATE state;
bool prev;
};
class KeyManager
{
SINGLE(KeyManager);
private:
vector<keyInfo> vecKey;
public:
void init();
void update();
public:
KEY_STATE GetKeyState(KEY key) { return vecKey[(int)key].state; }
};
1) ν€ μ λ ₯ μ΄λ²€νΈ μ μ → enum class KEY_STATE
ν€ μ΄λ²€νΈλ₯Ό μ μνλ€.
NONE - μ΄μ νλ μμλ λλ¦¬μ§ μκ³ , νμ¬ νλ μμμλ λλ¦¬μ§ μμ.
TAP - μ΄μ νλ μμλ λλ¦¬μ§ μκ³ , νμ¬ νλ μμ λ§ λλ¦Ό.
HOLD - μ΄μ νλ μμλ λλ Έκ³ , νμ¬ νλ μμλ λλ¦Ό.
AWAY - μ΄μ νλ μμ λλ Έλλ°, νμ¬ νλ μμμλ λλ¦¬μ§ μμ. (λ§ λ)
2) μ§μν ν€ μ μ → enum class KEY
μ΄ νλ‘κ·Έλ¨ λ΄μμ μ΄λ€ ν€λ₯Ό μ²λ¦¬ν κ²μΈμ§ μ μνμ.
3) ν€ μ 보 ꡬ쑰체 → struct keyInfo
ν€ μνκ°(state)κ³Ό μ΄μ νλ μμμ ν€κ° λλ Έλ μ§(prev)μ λν μ 보λ₯Ό κ°κ³ μλ€.
4) KeyManager Class
vector<keyInfo> vecKey → ν€ μν μ 보λ 벑ν°λ‘ κ΄λ¦¬νλ€.
KEY_STATE GetKeyState(KEY key) → νΉμ ν€μ νμ¬ μνλ₯Ό λ°ννλ ν¨μ
// KeyManager.cpp
#include "pch.h"
#include "KeyManager.h"
#include "Core.h"
int arrVK[(int)KEY::LAST] =
{
VK_LEFT, // LEFT,
VK_RIGHT, // RIGHT,
VK_UP, // UP,
VK_DOWN, // DOWN,
'Q',
'W',
'E',
'R',
'T',
'Y',
'U',
'I',
'O',
'P',
'A',
'S',
'D',
'F',
'G',
'Z',
'X',
'C',
'V',
'B',
VK_MENU, // ALT,
VK_CONTROL, // CTRL,
VK_LSHIFT, // LSHIFT,
VK_SPACE, // SPACE,
VK_RETURN, // ENTER,
VK_ESCAPE, // ESC,
// LAST,
};
KeyManager::KeyManager()
{
}
KeyManager::~KeyManager()
{
}
void KeyManager::init()
{
for (int i = 0; i < (int)KEY::LAST; ++i) {
vecKey.emplace_back(keyInfo{ KEY_STATE::NONE, false });
}
// std::cout << "vecKey size after init: " << vecKey.size() << std::endl;
}
void KeyManager::update()
{
// HWND mainWnd = Core::Instance()->getMainHandle();
HWND hWnd = GetFocus();
// μλμ° ν¬μ»€μ± μ€μΌ λ
if (nullptr != hWnd) {
// λͺ¨λ ν€μ λν΄μ
for (int i = 0; i < (int)KEY::LAST; ++i) {
if (GetAsyncKeyState(arrVK[i]) & 0x8000) { // ν€κ° λλ €μλ€
if (vecKey[i].prev) { // μ΄μ μλ λλ €μμλ€.
vecKey[i].state = KEY_STATE::HOLD;
}
else {
vecKey[i].state = KEY_STATE::TAP;
}
vecKey[i].prev = true;
}
else { // ν€κ° μλλ €μλ€.
if (vecKey[i].prev) { // μ΄μ μλ λλ €μμλ€.
vecKey[i].state = KEY_STATE::AWAY;
}
else {
vecKey[i].state = KEY_STATE::NONE;
}
vecKey[i].prev = false;
}
}
}
else { // ν¬μ»€μ± μλ λ
for (int i = 0; i < (int)KEY::LAST; ++i) {
vecKey[i].prev = false;
if (KEY_STATE::TAP == vecKey[i].state || KEY_STATE::HOLD == vecKey[i].state)
vecKey[i].state = KEY_STATE::AWAY;
else if (KEY_STATE::AWAY == vecKey[i].state)
vecKey[i].state = KEY_STATE::NONE;
}
}
}
λ΄κ° λ§λ ν€μ μ€μ κ°μν€λ₯Ό μ‘°ν©ν΄μΌ ν νμκ° μλ€ → arrVK()
μ€μ μλμ° λ΄μ κ°μν€μ μμ€ν€μ½λλ₯Ό μ΄μ©νμ¬ μμ±νλλ‘ νλ€.
ν€ λ§€λμ μ μ΄κΈ°ν ν¨μμμλ κ° ν€μ λν μ 보λ₯Ό NONE, falseλ‘ μ΄κΈ°ννμ¬ ν€ μ 보 벑ν°μ μ½μ νλ€.
μ λ°μ΄νΈ ν¨μμμλ μλμ° ν¬μ»€μ±μ μμλ΄μΌ νλλ° 'μλμ° ν¬μ»€μ±'μ΄λ νμ¬ μ μ κ° μλμ° μ°½μ ν¬μ»€μ± μ€μΈκ°? μ ν΄λΉνλ λ΄μ©μ΄λ€. λ§μ½ μλμ° μ°½μ΄ λ΄λ €κ°μμλ λΆκ΅¬νκ³ ν€ μ λ ₯μ λ°λ μνλΌλ©΄ κ²μ λ΄μμ μ΄μνκ² μ μ©λ μ μλ€.
νμ¬ λ©μΈ μ°½μΌλ‘λ§ ν¬μ»€μ±νλ €λ©΄ μ£ΌμμΌλ‘ μ²λ¦¬λ HWND mainWnd = Core::Instance()->getMainHandle(); μ μ¬μ©νλ©΄ λλ νμ¬ νλ‘κ·Έλ¨μμλ λ§λ€μ΄μ§ λͺ¨λ μ°½μ λν΄μ μ λ ₯μ λ°κΈ° μν¨μΌλ‘ hWndκ° nullμ΄ μλ λλ§ ν€ μ λ ₯μ λ°λλ‘ νλ€.
μλμ° ν¬μ»€μ± μ€μΌ λ λͺ¨λ ν€μ λν΄μ νμ¬ λλ Έλμ§μ μλλ Έλμ§, μ΄μ μ λλ Έλμ§μ μλλ Έλμ§λ₯Ό 체ν¬ν΄ κ° μν μ΄λ²€νΈλ₯Ό μ€μ νλ€.
ν€ λ§€λμ λ₯Ό Core.cppμ μ μ©νλ©΄ λλλ° μλμ κ°λ€.
// Core.cpp
#include "KeyManager.h" // μΆκ°
int Core::Init(HWND _handle, POINT _ptResolution)
{
// ...
TimeManager::Instance()->Init();
KeyManager::Instance()->init(); // μΆκ°
// ...
}
void Core::Progress()
{
// Manager update
TimeManager::Instance()->update();
KeyManager::Instance()->update(); // μΆκ°
Update();
Render();
}
void Core::Update()
{
Vec2 vPos = obj.getPos();
// μμ
if (KeyManager::Instance()->GetKeyState(KEY::LEFT)==KEY_STATE::AWAY) {
vPos.x -= 200.f * TimeManager::Instance()->getfDT();
}
if (KeyManager::Instance()->GetKeyState(KEY::RIGHT) == KEY_STATE::AWAY) {
vPos.x += 200.f * TimeManager::Instance()->getfDT();
}
obj.setPos(vPos);
}
'π§ Study > winAPI' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[winAPI 08] Object (0) | 2024.06.05 |
---|---|
[winAPI 07] Scene & Scene Manager (1) | 2024.06.04 |
[winAPI 05] Double Buffering (0) | 2024.06.04 |
[winAPI 04] Timer (0) | 2024.04.09 |
[winAPI 03] Core class & Singleton (0) | 2024.04.08 |