I already have
this posted in the code snippets board, but I wasn't sure if anybody that uses DarkGDK really goes there often since the majority of posts there are for DBP. So here it is.
Tools:
////////////////////////////////////////////////////////////////////////////////////////////////////
// file: Utilities\Tools.h
//
// summary: Declares the tools
//
// author: Branflakes (Bran flakes91093)
//
// contact: Branflakes91093@live.com
////////////////////////////////////////////////////////////////////////////////////////////////////
#include "Windows.h"
#include <math.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Tools
//
// summary: Various tools.
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Tools
{
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Timer class.</summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
class Timer
{
private:
bool counting;
DWORD time,
start; // starting time.
public:
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Default Constructor. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
Timer();
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Destructor. </summary>
///
/// <remarks> Branflakes, 1/23/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
~Timer();
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Starts the timer. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void Start();
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Stops the timer. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void Stop();
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Returns whether or not the timer is currently running. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <returns> true if running, else false. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
bool Counting() const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Returns the current time in milliseconds. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <returns> current time in milliseconds. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD Time() const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Updates this object. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void Update();
};
template<typename T>
inline T Max(const T First, const T Second) {
return ((First >= Second) ? First : Second);
}
template<typename T>
inline T Min(const T First, const T Second) {
return ((First <= Second) ? First : Second);
}
template<typename T>
inline T Clamp(T &Val, const T Low, const T High) {
if(Val < Low)
return (Val = Low);
if(Val > High)
return (Val = High);
return Val;
}
}
and Input:
////////////////////////////////////////////////////////////////////////////////////////////////////
// file: Utilities\Input.h
//
// summary: Declares the input class
//
// author: Branflakes (Bran flakes91093)
//
// contact: Branflakes91093@live.com
////////////////////////////////////////////////////////////////////////////////////////////////////
#include "Tools.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Input
//
// summary: Contains specialized classes and constants to handle more than seeing
// whether a key is down or not. Use virtual keys.
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Input
{
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Values that represent virtual keys. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
enum eKeys {
KEY_0 = 0x30,
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_A = 0x41,
KEY_B,
KEY_C,
KEY_D,
KEY_E,
KEY_F,
KEY_G,
KEY_H,
KEY_I,
KEY_J,
KEY_K,
KEY_L,
KEY_M,
KEY_N,
KEY_O,
KEY_P,
KEY_Q,
KEY_R,
KEY_S,
KEY_T,
KEY_U,
KEY_V,
KEY_W,
KEY_X,
KEY_Y,
KEY_Z
};
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Stores data for each key.</summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
struct KeyData
{
public:
KeyData();
~KeyData();
bool pressed;
bool released;
bool held;
bool dclick; // Double click.
bool active;
//Tools::Timer timer;
Tools::Timer dtimer; // Double click timer.
int hit; // Used for counting clicks to see if a key has been double clicked.
};
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Handles mouse and keyboard. Use virtual keys. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
class InputState
{
private:
HWND hWnd;
KeyData keyData[256];
UINT ddelay; // Double click delay
POINT gPos; // Global mouse position
POINT rPos; // Relative mouse position
public:
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Default Constructor. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
InputState();
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Constructor. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="hWND"> The window. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
InputState(const HWND hWND);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Queries if a key is active. </summary>
///
/// <remarks> Branflakes, 1/20/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
///
/// <returns> true if the key is active, false if not. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
bool IsKeyActive(const BYTE vkKey) const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Query if 'vkKey' is down. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
///
/// <returns> true if down, false if not. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
bool IsKeyDown(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Query if 'vkKey' is up. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
///
/// <returns> true if up, false if not. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
bool IsKeyUp(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Returns whether or not the key is being held. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="vkKey"> The vk key. </param>
///
/// <returns> true if it is, else false. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
bool KeyHeld(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Returns whether the key is pressed. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
///
/// <returns> true when pressed, else false. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
bool KeyPressed(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Returns whether the key is released. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
///
/// <returns> true when released, else false. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
bool KeyReleased(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Returns whether the key is double clicked. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
///
/// <returns> true when double clicked, else false. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
bool DoubleClick(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Gets the hwnd. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <returns> The hwnd. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
const HWND GetHWND() const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Gets the double click delay. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <returns> The double click delay. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
UINT GetDoubleClickDelay() const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Global mouse x coordinate. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <returns> Global mouse x coordinate. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
UINT GlobalMouseX() const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Global mouse y coordinate. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <returns> Global mouse y coordinate. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
UINT GlobalMouseY() const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Relative mouse x coordinate. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="hWND"> The window. </param>
///
/// <returns> Relative mouse x coordinate. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
int RelativeMouseX(const HWND hWND) const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Relative mouse x coordinate. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <returns> Relative mouse x coordinate. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
int RelativeMouseX() const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Relative mouse y coordinate. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="hWND"> The window. </param>
///
/// <returns> Relative mouse y coordinate. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
int RelativeMouseY(const HWND hWND) const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Relative mouse y coordinate. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <returns> Relative mouse y coordinate. </returns>
////////////////////////////////////////////////////////////////////////////////////////////////////
int RelativeMouseY() const;
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Sets the double click delay. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="Delay"> The delay. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
void SetDoubleClickDelay(const UINT Delay);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Sets the global mouse position. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="X"> The x coordinate. </param>
/// <param name="Y"> The y coordinate. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
void SetMousePosGlobal(const UINT X, const UINT Y);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Sets the relative mouse position. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="hWND"> The window. </param>
/// <param name="X"> The x coordinate. </param>
/// <param name="Y"> The y coordinate. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
void SetMousePosRelative(const HWND hWND, const int X, const int Y);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Sets a mouse position relative. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="X"> The x coordinate. </param>
/// <param name="Y"> The y coordinate. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
void SetMousePosRelative(const int X, const int Y);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Sets the hwnd. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="hWND"> The window. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
void SetHWND(const HWND hWND);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Activates the key described by vkKey. </summary>
///
/// <remarks> Branflakes, 1/22/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
void ActivateKey(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Deactivates a key. </summary>
///
/// <remarks> Branflakes, 1/20/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
void DeactivateKey(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Updates the keyboard. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void UpdateKeyboard();
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Updates the mouse. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void UpdateMouse();
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Updates the keyboard and mouse. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void Update();
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Updates the key described by vkKey. </summary>
///
/// <remarks> Branflakes, 1/17/2010. </remarks>
///
/// <param name="vkKey"> The virtual key. </param>
////////////////////////////////////////////////////////////////////////////////////////////////////
void UpdateKey(const BYTE vkKey);
////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary> Only updates the keys that are activated. </summary>
///
/// <remarks> Branflakes, 1/20/2010. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void FastUpdate();
};
}
(The only reason I'm putting Tools on this is because Input::InputState relies on it)
The Input::InputState class takes input to a new level and makes everything a lot easier, instead of just using dbKeyState() and dbMouseClick(). It can check if a (virtual) key is:
-Pressed
-Held(true after one loop after of being pressed)
-Down(pressed or held)
-Up(not pressed or held)
-Released(true for one loop after the key is released)
-DoubleClick(WORKS WITH KEYBOARD AND MOUSE!!! (Every virtual key))
The namespaces also do not rely on DarkGDK one bit, so you can use them in any application (although, Input classes need the windows message pump, so they will not work in a console application)
Comments were made with AtomineerUtils, if anyone is wondering.
Attached is the project for creating a static library with an example project.
Tell me what you think!
Your_Health = (My_Mood == HAPPY) ? 100 : NULL;