Added mouse support

master
OneLoneCoder 8 years ago
parent 9a163c7ebf
commit c168b16748
  1. 100
      olcConsoleGameEngine.h

@ -26,8 +26,10 @@ Blog: www.onelonecoder.com
Video: Video:
~~~~~~ ~~~~~~
https://youtu.be/cWc0hgYwZyc https://youtu.be/cWc0hgYwZyc
Added mouse support: https://youtu.be/tdqc9hZhHxM
Last Updated: 30/08/2017
Last Updated: 21/08/2017
Usage: Usage:
~~~~~~ ~~~~~~
@ -56,7 +58,8 @@ the application to close.
Input is also handled for you - interrogate the m_keys[] array with the virtual Input is also handled for you - interrogate the m_keys[] array with the virtual
keycode you want to know about. bPressed is set for the frame the key is pressed down keycode you want to know about. bPressed is set for the frame the key is pressed down
in, bHeld is set if the key is held down, bReleased is set for the frame the key in, bHeld is set if the key is held down, bReleased is set for the frame the key
is released in. is released in. The same applies to mouse! m_mousePosX and Y can be used to get
the current cursor position, and m_mouse[1..5] returns the mouse buttons.
The draw routines treat characters like pixels. By default they are set to white solid The draw routines treat characters like pixels. By default they are set to white solid
blocks - but you can draw any unicode character, using any of the colours listed below. blocks - but you can draw any unicode character, using any of the colours listed below.
@ -247,6 +250,7 @@ public:
m_nScreenHeight = 30; m_nScreenHeight = 30;
m_hConsole = GetStdHandle(STD_OUTPUT_HANDLE); m_hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
m_hConsoleIn = GetStdHandle(STD_INPUT_HANDLE);
m_keyNewState = new short[256]; m_keyNewState = new short[256];
m_keyOldState = new short[256]; m_keyOldState = new short[256];
memset(m_keyNewState, 0, 256 * sizeof(short)); memset(m_keyNewState, 0, 256 * sizeof(short));
@ -254,6 +258,9 @@ public:
memset(m_keys, 0, 256 * sizeof(sKeyState)); memset(m_keys, 0, 256 * sizeof(sKeyState));
m_mousePosX = 0;
m_mousePosY = 0;
m_sAppName = L"Default"; m_sAppName = L"Default";
@ -273,6 +280,8 @@ public:
cfi.FontWeight = FW_NORMAL; cfi.FontWeight = FW_NORMAL;
wcscpy_s(cfi.FaceName, L"Consolas"); wcscpy_s(cfi.FaceName, L"Consolas");
if (!SetCurrentConsoleFontEx(m_hConsole, false, &cfi)) if (!SetCurrentConsoleFontEx(m_hConsole, false, &cfi))
return Error(L"SetCurrentConsoleFontEx"); return Error(L"SetCurrentConsoleFontEx");
@ -290,6 +299,11 @@ public:
if (!SetConsoleWindowInfo(m_hConsole, TRUE, &m_rectWindow)) if (!SetConsoleWindowInfo(m_hConsole, TRUE, &m_rectWindow))
Error(L"SetConsoleWindowInfo"); Error(L"SetConsoleWindowInfo");
// Set flags to allow mouse input
if (!SetConsoleMode(m_hConsoleIn, ENABLE_EXTENDED_FLAGS | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT))
Error(L"SetConsoleMode");
m_bufScreen = new CHAR_INFO[m_nScreenWidth*m_nScreenHeight]; m_bufScreen = new CHAR_INFO[m_nScreenWidth*m_nScreenHeight];
return 1; return 1;
@ -497,7 +511,7 @@ private:
tp1 = tp2; tp1 = tp2;
float fElapsedTime = elapsedTime.count(); float fElapsedTime = elapsedTime.count();
// Handle Input // Handle Keyboard Input
for (int i = 0; i < 256; i++) for (int i = 0; i < 256; i++)
{ {
m_keyNewState[i] = GetAsyncKeyState(i); m_keyNewState[i] = GetAsyncKeyState(i);
@ -522,6 +536,76 @@ private:
m_keyOldState[i] = m_keyNewState[i]; m_keyOldState[i] = m_keyNewState[i];
} }
// Handle Mouse Input - Check for window events
INPUT_RECORD inBuf[32];
DWORD events = 0;
GetNumberOfConsoleInputEvents(m_hConsoleIn, &events);
if(events > 0)
ReadConsoleInput(m_hConsoleIn, inBuf, events, &events);
// Handle events - we only care about mouse clicks and movement
// for now
for (DWORD i = 0; i < events; i++)
{
switch (inBuf[i].EventType)
{
case MOUSE_EVENT:
{
switch (inBuf[i].Event.MouseEvent.dwEventFlags)
{
case MOUSE_MOVED:
{
m_mousePosX = inBuf[i].Event.MouseEvent.dwMousePosition.X;
m_mousePosY = inBuf[i].Event.MouseEvent.dwMousePosition.Y;
}
break;
case 0:
{
for (int m = 0; m < 5; m++)
m_mouseNewState[m] = (inBuf[i].Event.MouseEvent.dwButtonState & (1 << m)) > 0;
}
break;
default:
break;
}
}
break;
default:
break;
// We don't care just at the moment
}
}
for (int m = 0; m < 5; m++)
{
m_mouse[m].bPressed = false;
m_mouse[m].bReleased = false;
if (m_mouseNewState[m] != m_mouseOldState[m])
{
if (m_mouseNewState[m])
{
m_mouse[m].bPressed = true;
m_mouse[m].bHeld = true;
}
else
{
m_mouse[m].bReleased = true;
m_mouse[m].bHeld = false;
}
}
m_mouseOldState[m] = m_mouseNewState[m];
}
// Handle Frame Update // Handle Frame Update
if (!OnUserUpdate(fElapsedTime)) if (!OnUserUpdate(fElapsedTime))
@ -529,7 +613,7 @@ private:
// Update Title & Present Screen Buffer // Update Title & Present Screen Buffer
wchar_t s[128]; wchar_t s[128];
swprintf_s(s, 128, L"OneLoneCoder.com - Console Game Engine - %s - FPS: %3.2f ", m_sAppName.c_str(), 1.0f / fElapsedTime); swprintf_s(s, 128, L"OneLoneCoder.com - Console Game Engine - %s - FPS: %3.2f - %d ", m_sAppName.c_str(), 1.0f / fElapsedTime, events);
SetConsoleTitle(s); SetConsoleTitle(s);
WriteConsoleOutput(m_hConsole, m_bufScreen, { (short)m_nScreenWidth, (short)m_nScreenHeight }, { 0,0 }, &m_rectWindow); WriteConsoleOutput(m_hConsole, m_bufScreen, { (short)m_nScreenWidth, (short)m_nScreenHeight }, { 0,0 }, &m_rectWindow);
} }
@ -557,7 +641,10 @@ protected:
bool bPressed; bool bPressed;
bool bReleased; bool bReleased;
bool bHeld; bool bHeld;
} m_keys[256]; } m_keys[256], m_mouse[5];
int m_mousePosX;
int m_mousePosY;
protected: protected:
@ -574,7 +661,10 @@ private:
HANDLE m_hOriginalConsole; HANDLE m_hOriginalConsole;
CONSOLE_SCREEN_BUFFER_INFO m_OriginalConsoleInfo; CONSOLE_SCREEN_BUFFER_INFO m_OriginalConsoleInfo;
HANDLE m_hConsole; HANDLE m_hConsole;
HANDLE m_hConsoleIn;
SMALL_RECT m_rectWindow; SMALL_RECT m_rectWindow;
short *m_keyOldState; short *m_keyOldState;
short *m_keyNewState; short *m_keyNewState;
bool m_mouseOldState[5];
bool m_mouseNewState[5];
}; };
Loading…
Cancel
Save