// DXDInput.h: interface for the CDXDInput class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DXDINPUT_H__2AAA2BA1_C948_11D3_83A8_10C349C101CC__INCLUDED_)
#define AFX_DXDINPUT_H__2AAA2BA1_C948_11D3_83A8_10C349C101CC__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <dinput.h>

/*********************************************************************************************/
/* | 연산(OR 연산)이용하여 조합하면 상하좌우의 벽을 나타낸다.
   EX = UP                       = 1,  RIGHT               = 2,
        UP | RIGHT               = 3,  DOWN                = 4,              
		UP | DOWN                = 5,  RIGHT | DOWN        = 6,
		UP | RIGHT | DOWN        = 7,  LEFT                = 8,
		UP | LEFT                = 9,  RIGHT | LEFT        = 10, 
		UP | RIGHT | LEFT        = 11, DOWN | LEFT         = 12,
		UP | DOWN | LEFT         = 13, RIGHT | DOWN | LEFT = 14, 
		UP | RIGHT | DOWN | LEFT = 15,

/*********************************************************************************************/

class CDXDInput  
{
public:
	CDXDInput();
	virtual ~CDXDInput();

	//protected:
	LPDIRECTINPUT7        m_lpDInput;		// 다이렉트 인풋 자체의 포인터..
	LPDIRECTINPUTDEVICE7  m_lpDIKeyboard;	// 키보드를 위한 포인터...
	LPDIRECTINPUTDEVICE7  m_lpDIMouse;		// 마우스를 위한 포인터...

public:
	void ClassRelease();					// 모든 것의 해제........
	void ClassInit();						// 크래스의 초기화.....

	LPDIRECTINPUT7        GetDIObject ()   { return m_lpDInput; }
	LPDIRECTINPUTDEVICE7  GetDIKeyboard () { return m_lpDIKeyboard; }
	LPDIRECTINPUTDEVICE7  GetDIMouse ()    { return m_lpDIMouse; }

public:
	BOOL    KeyCheck ( BYTE *key, int keycheck );	// 현재 키가 눌렸나 체크.
	HRESULT GetMouseState ( DIMOUSESTATE *Mouse );	// 마우스의 눌린 값 체크.
	HRESULT GetKeyboardState ( BYTE *key );			// 키보드의 눌린 값 체크..
	HRESULT AcquireCheck ( BOOL acquirecheck );		// 마우스를 활성화 / 비활성화.
	BOOL	DInputCreate ( HWND hwnd, DWORD keyFlags, DWORD mouseFlags  );	// 다이렉트 인풋 생성. 다이렉트 인풋은 WM_CREATE 에서 해야 한다.

};

#endif // !defined(AFX_DXDINPUT_H__2AAA2BA1_C948_11D3_83A8_10C349C101CC__INCLUDED_)


///////////////////////////////////////////////////////////////////////////////
// < 대략적 설명 >
///////////////////////////////////////////////////////////////////////////////
// - 키보드
///////////////////////////////////////////////////////////////////////////////
//
// 1. 먼저 다이렉트 인풋을 정의한다.
//	CDXDInput g_DInput;
//
// 2. 다이렉트 인풋을 초기화 및 생성한다. (반드시 메세지 루프의 WM_CREATE 에서 해야 함.)
//	WM_CREATE : g_DInput.DInputCreate(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
//
// 3. 인풋의 활성화 비활성화를 체크하게 한다.
//	WM_ACTIVATE: g_bActiveOn = (BOOL)wParam;
//				bActiveg_Dinput.AcquireCheck(bActive)
//
// 4. 루프함수에서 키값을 받아온 후 입력값을 체크한다.
//  GameProc()
//  {
//		char tempKey[256] = { NULL, };
//		GetKeyboardState(tempKey);
//		if( g_DInput.KeyCheck(tempKey,  DIK_H))
//				++주인공 좌표;
//	}
//
///////////////////////////////////////////////////////////////////////////////
// - 마우스 체크
///////////////////////////////////////////////////////////////////////////////
//
//	DIMOUSESTATE tempMouseState;
//	g_DInput.GetMouseState(&tempMouseState);
//
//	g_CurSprMouseX += tempMouseState.lX;
//	g_CurSprMouseY += tempMouseState.lY;
//	tempMouseLButton = tempMouseState.rgbButtons[ 0 ] & 0x80;
//	tempMouseRButton = tempMouseState.rgbButtons[ 1 ] & 0x80;
//	tempMouseMButton = tempMouseState.rgbButtons[ 2 ] & 0x80;
//
//	if(g_CurSprMouseX < 0)	g_CurSprMouseX = 0;
//	if(g_CurSprMouseY < 0)	g_CurSprMouseY = 0;
//	if(g_CurSprMouseX > g_DDraw.m_MaxScrSz.cx) g_CurSprMouseX = g_DDraw.m_MaxScrSz.cx;
//	if(g_CurSprMouseY > g_DDraw.m_MaxScrSz.cy) g_CurSprMouseY = g_DDraw.m_MaxScrSz.cy;
//	
///////////////////////////////////////////////////////////////////////////////
// <*> 주의사항.
// - 다이렉트 인풋은 메인 윈도우 핸들보다 먼저 생성되어 있어야 한다.
// - 마우스의 좌표는 게임상에서 따로 좌표가 있어야 한다.
//   -> 그냥 독점 모드로 세팅하고, 그에 따라서 마우스가 움직여야 할 것 같음.
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

