๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

Input

by eazuooz 2022. 9. 15.

์˜ˆ์ œ :)

https://github.com/eazuooz/WindowAPI/commit/7e41da72605d73d8e695940704de8764fb165f3a

 

Input Manager · eazuooz/WindowAPI@7e41da7

Show file tree Showing 12 changed files with 182 additions and 22 deletions.

github.com

 

์ง€๊ธˆ๊นŒ์ง€์˜ ํ‚ค ์ž…๋ ฅ์—๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅธ๊ฒƒ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋งŒ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒŒ์ž„์—์„œ๋Š” ์กฐ๊ธˆ ๋” ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์˜ ์ž…๋ ฅ์„ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.

 

1. ํ‚ค๊ฐ€ ๋ˆŒ๋ ค์žˆ์„๋•Œ

2. ํ‚ค๊ฐ€ ๋‚ด๋ ค๊ฐ”์„๋•Œ

3. ํ‚ค๊ฐ€ ์˜ฌ๋ผ์™”์„๋•Œ

 

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด ๊ฒƒ์„ ๊ด€๋ฆฌํ•ด์ค„ ์ธํ’‹ ๋งค๋‹ˆ์ €๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ ํ•  ๊ฒƒ์ด๋‹ค.

 

	enum class KEY_CODE
	{
		Q, W, E, R, T, Y, U, I, O, P,
		A, S, D, F, G, H, J, K, L, 
		Z, X, C, V, B, N, M,
		END,
	};
	enum KEY_STATE
	{
		DOWN,
		PRESSED,
		UP,
		NONE,
	};

	class InputManager
	{
		SINGLE(InputManager)

	public:
		struct Key
		{
			KEY_CODE  eType;
			KEY_STATE eState;
			bool	  bPressed;
		};

		void Initialize();
		void Tick();

		KEY_STATE GetKeyState(KEY_CODE keyCode);

	private:
		std::vector<Key>	mKeys;
	};

 

 

	int ASCII[(UINT)KEY_CODE::END] =
	{
		'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P',
		'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 
		'Z', 'X', 'C', 'V', 'B', 'N', 'M',
	};
	
	InputManager* InputManager::mInstance = nullptr;

	void InputManager::Initialize()
	{
		for (UINT i = 0; i < (UINT)KEY_CODE::END; i++)
		{
			Key key;
			key.eType = (KEY_CODE)i;
			key.eState = KEY_STATE::NONE;
			key.bPressed = false;

			mKeys.push_back(key);
		}
	}

	void InputManager::Tick()
	{
		for (UINT i = 0; i < (UINT)KEY_CODE::END; ++i)
		{
			// ํ•ด๋‹นํ‚ค๊ฐ€ ํ˜„์žฌ ๋ˆŒ๋ ค์žˆ๋‹ค.
			if (GetAsyncKeyState(ASCII[i]) & 0x8000)
			{
				// ์ด์ „ ํ”„๋ ˆ์ž„์—๋„ ๋ˆŒ๋ ค ์žˆ์—ˆ๋‹ค.
				if (mKeys[i].bPressed)
					mKeys[i].eState = KEY_STATE::PRESSED;
				else
					mKeys[i].eState = KEY_STATE::DOWN;
				
				mKeys[i].bPressed = true;
			}
			else // ํ•ด๋‹นํ‚ค๊ฐ€ ํ˜„์žฌ ์•ˆ๋ˆŒ๋ ค์žˆ๋‹ค.
			{
				// ์ด์ „ ํ”„๋ ˆ์ž„์—๋Š” ๋ˆŒ๋ ค ์žˆ์—ˆ๋‹ค.
				if (mKeys[i].bPressed)
					mKeys[i].eState = KEY_STATE::UP;
				else // ์ด์ „ ํ”„๋ ˆ์ž„์—๋„ ์•ˆ๋ˆŒ๋ ค ์žˆ์—ˆ๋‹ค.
					mKeys[i].eState = KEY_STATE::NONE;

				mKeys[i].bPressed = false;
			}
		}
	}

	KEY_STATE InputManager::GetKeyState(KEY_CODE keyCode)
	{
		return mKeys[static_cast<UINT>(keyCode)].eState;
	}

 

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ํ‚ค ์ž…๋ ฅ๋„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ

์ดˆ๊ธฐํ™”์™€ ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ฒดํฌ ํ•ด์ฃผ๊ฒŒ๋” ๋Œ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

	void Application::Initialize(WindowData data)
	{
		mWindowData.hWnd = data.hWnd;
		mWindowData.hdc = GetDC(mWindowData.hWnd);

		// ์ดˆ๊ธฐํ™”
		SceneManager::GetInstance().Initialize();
		Time::GetInstance().Initialize();
		InputManager::GetInstance().Initialize();
	}

	void Application::Tick()
	{
		// ์—…๋ฐ์ดํŠธ
		Time::GetInstance().Tick();
		InputManager::GetInstance().Tick();
		SceneManager::GetInstance().Tick();



		// ๋ Œ๋”๋ง
		SceneManager::GetInstance().Render(mWindowData.hdc);
		Time::GetInstance().Render(mWindowData.hdc);
	}

๊ทธ๋ฆฌ๊ณ  ์กฐ๊ธˆ ๋” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ •์˜ํ•ด์ฃผ๊ฒ ๋‹ค.

Player์—์„œ ํ•ด๋‹น ํ‚ค์ž…๋ ฅ์„ ๋ฐ”๊พธ์–ด ์‚ฌ์šฉํ•ด๋ณด์ž~

#define KEY_PREESED(KEY) ya::KEY_STATE::PRESSED == ya::InputManager::GetInstance().GetKeyState(KEY)
#define KEY_DOWN(KEY) ya::KEY_STATE::DOWN == ya::InputManager::GetInstance().GetKeyState(KEY)
#define KEY_UP(KEY) ya::KEY_STATE::UP == ya::InputManager::GetInstance().GetKeyState(KEY)

	void Player::Tick()
	{
		// ํ‚ค์ž…๋ ฅ์— ๋”ฐ๋ฅธ ์ด๋™
		Vector2 vPos = GetPos();

		// ์‹œ๊ฐ„ ๋™๊ธฐํ™”
		if (KEY_UP(KEY_CODE::W))
		{
			//vPos.y -= m_fSpeed * DT;
			vPos.y -= 50.f;
		}

		if (GetAsyncKeyState('S') & 0x8000)
		{
			vPos.y += mSpeed * Time::DeltaTime();
		}

		if (GetAsyncKeyState('A') & 0x8000)
		{
			vPos.x -= mSpeed * Time::DeltaTime();
		}

		if (GetAsyncKeyState('D') & 0x8000)
		{
			vPos.x += mSpeed * Time::DeltaTime();
		}

		SetPos(vPos);
	}

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Resources, Brush, Pen  (0) 2022.09.20
Double Buffering  (0) 2022.09.19
Scene, Object, Time  (0) 2022.09.15
Singleton Patten  (0) 2022.09.13
FrameWork  (1) 2022.09.07

๋Œ“๊ธ€