Added mouse movement and click support
This commit is contained in:
parent
5c90d15869
commit
52acb4044c
3 changed files with 101 additions and 3 deletions
|
@ -5,8 +5,15 @@
|
||||||
#include "KeyStateManager.h"
|
#include "KeyStateManager.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
// Initialize static members
|
||||||
|
|
||||||
std::map<unsigned char,bool> KeyStateManager::ascii_keys_status = {};
|
std::map<unsigned char,bool> KeyStateManager::ascii_keys_status = {};
|
||||||
std::map<int,bool> KeyStateManager::special_keys_status = {};
|
std::map<int,bool> KeyStateManager::special_keys_status = {};
|
||||||
|
std::map<int,bool> KeyStateManager::mouse_button_status = {};
|
||||||
|
|
||||||
|
Vec2i KeyStateManager::current_mouse_delta;
|
||||||
|
Vec2i KeyStateManager::last_mouse_delta;
|
||||||
|
Vec2i KeyStateManager::last_mouse_position;
|
||||||
|
|
||||||
void KeyStateManager::register_glut_callbacks()
|
void KeyStateManager::register_glut_callbacks()
|
||||||
{
|
{
|
||||||
|
@ -14,8 +21,16 @@ void KeyStateManager::register_glut_callbacks()
|
||||||
glutKeyboardUpFunc(KeyStateManager::key_up);
|
glutKeyboardUpFunc(KeyStateManager::key_up);
|
||||||
glutSpecialFunc(KeyStateManager::special_key_press);
|
glutSpecialFunc(KeyStateManager::special_key_press);
|
||||||
glutSpecialUpFunc(KeyStateManager::special_key_up);
|
glutSpecialUpFunc(KeyStateManager::special_key_up);
|
||||||
|
|
||||||
|
glutMouseFunc(KeyStateManager::mouse_click);
|
||||||
|
glutPassiveMotionFunc(KeyStateManager::mouse_movement);
|
||||||
|
glutMotionFunc(KeyStateManager::mouse_movement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================
|
||||||
|
// Keyboard
|
||||||
|
// ==================
|
||||||
|
|
||||||
bool KeyStateManager::is_key_pressed(unsigned char key)
|
bool KeyStateManager::is_key_pressed(unsigned char key)
|
||||||
{
|
{
|
||||||
if (ascii_keys_status.find(key) == ascii_keys_status.end())
|
if (ascii_keys_status.find(key) == ascii_keys_status.end())
|
||||||
|
@ -37,21 +52,25 @@ bool KeyStateManager::is_special_key_pressed(int key)
|
||||||
void KeyStateManager::key_press(unsigned char event_key, int mouse_x, int mouse_y)
|
void KeyStateManager::key_press(unsigned char event_key, int mouse_x, int mouse_y)
|
||||||
{
|
{
|
||||||
update_key(event_key,true);
|
update_key(event_key,true);
|
||||||
|
mouse_movement(mouse_x,mouse_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeyStateManager::key_up(unsigned char event_key, int mouse_x, int mouse_y)
|
void KeyStateManager::key_up(unsigned char event_key, int mouse_x, int mouse_y)
|
||||||
{
|
{
|
||||||
update_key(event_key,false);
|
update_key(event_key,false);
|
||||||
|
mouse_movement(mouse_x,mouse_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeyStateManager::special_key_press(int event_key, int mouse_x, int mouse_y)
|
void KeyStateManager::special_key_press(int event_key, int mouse_x, int mouse_y)
|
||||||
{
|
{
|
||||||
update_special_key(event_key,true);
|
update_special_key(event_key,true);
|
||||||
|
mouse_movement(mouse_x,mouse_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeyStateManager::special_key_up(int event_key, int mouse_x, int mouse_y)
|
void KeyStateManager::special_key_up(int event_key, int mouse_x, int mouse_y)
|
||||||
{
|
{
|
||||||
update_special_key(event_key,false);
|
update_special_key(event_key,false);
|
||||||
|
mouse_movement(mouse_x,mouse_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeyStateManager::update_key(unsigned char event_key, bool new_status)
|
void KeyStateManager::update_key(unsigned char event_key, bool new_status)
|
||||||
|
@ -77,3 +96,58 @@ void KeyStateManager::update_special_key(int event_key, bool new_status)
|
||||||
special_keys_status.insert({event_key,new_status});
|
special_keys_status.insert({event_key,new_status});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================
|
||||||
|
// Mouse
|
||||||
|
// ==================
|
||||||
|
|
||||||
|
void KeyStateManager::mouse_movement(int mouse_x, int mouse_y)
|
||||||
|
{
|
||||||
|
Vec2i current_frame;
|
||||||
|
current_frame.x = mouse_x;
|
||||||
|
current_frame.y = mouse_y;
|
||||||
|
|
||||||
|
Vec2i frame_delta = current_frame - last_mouse_position;
|
||||||
|
current_mouse_delta.x += frame_delta.x;
|
||||||
|
current_mouse_delta.y += frame_delta.y;
|
||||||
|
|
||||||
|
last_mouse_position = current_frame;
|
||||||
|
|
||||||
|
std::cout << frame_delta.x << "," << frame_delta.y << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeyStateManager::mouse_click(int mouse_button, int button_state, int mouse_x, int mouse_y)
|
||||||
|
{
|
||||||
|
bool new_status = button_state == GLUT_DOWN;
|
||||||
|
|
||||||
|
if (mouse_button_status.find(mouse_button) != mouse_button_status.end())
|
||||||
|
{
|
||||||
|
mouse_button_status.at(mouse_button) = new_status;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mouse_button_status.insert({mouse_button,new_status});
|
||||||
|
}
|
||||||
|
mouse_movement(mouse_x,mouse_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeyStateManager::is_mouse_button_pressed(int mouse_button)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (mouse_button_status.find(mouse_button) == mouse_button_status.end())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return mouse_button_status.at(mouse_button);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Vec2i& KeyStateManager::get_mouse_delta(bool update)
|
||||||
|
{
|
||||||
|
if (update)
|
||||||
|
{
|
||||||
|
last_mouse_delta = current_mouse_delta;
|
||||||
|
current_mouse_delta.x = 0;
|
||||||
|
current_mouse_delta.y = 0;
|
||||||
|
}
|
||||||
|
return last_mouse_delta;
|
||||||
|
}
|
|
@ -8,8 +8,10 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <GL/glut.h>
|
#include <GL/glut.h>
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
/// Handles the key events from glut and keep the status of keys up to date.
|
|
||||||
|
/// Handles the key and mouse events from glut and keep their status up to date.
|
||||||
/// "Static class"
|
/// "Static class"
|
||||||
class KeyStateManager {
|
class KeyStateManager {
|
||||||
public:
|
public:
|
||||||
|
@ -21,16 +23,34 @@ public:
|
||||||
static bool is_key_pressed(unsigned char key);
|
static bool is_key_pressed(unsigned char key);
|
||||||
static bool is_special_key_pressed(int key);
|
static bool is_special_key_pressed(int key);
|
||||||
|
|
||||||
|
static bool is_mouse_button_pressed(int mouse_button);
|
||||||
|
|
||||||
|
/// Updates and returns the movement of the mouse.
|
||||||
|
/// \param update If true, updates the mouse delta that will be returned
|
||||||
|
/// \return Updated displacement on each axis between the two last updates.
|
||||||
|
static const Vec2i& get_mouse_delta(bool update = false);
|
||||||
|
|
||||||
// Glut callbacks for input events
|
// Glut callbacks for input events
|
||||||
static void key_press(unsigned char event_key, int mouse_x, int mouse_y);
|
static void key_press(unsigned char event_key, int mouse_x, int mouse_y);
|
||||||
static void key_up(unsigned char event_key, int mouse_x, int mouse_y);
|
static void key_up(unsigned char event_key, int mouse_x, int mouse_y);
|
||||||
static void special_key_press(int event_key, int mouse_x, int mouse_y);
|
static void special_key_press(int event_key, int mouse_x, int mouse_y);
|
||||||
static void special_key_up(int event_key, int mouse_x, int mouse_y);
|
static void special_key_up(int event_key, int mouse_x, int mouse_y);
|
||||||
|
|
||||||
|
static void mouse_click(int mouse_button, int button_state, int mouse_x, int mouse_y);
|
||||||
|
/// Accumulates the movements of the mouse
|
||||||
|
static void mouse_movement(int mouse_x, int mouse_y);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// The maps are used to keep track of the keys which were pressed or released during runtime.
|
// The maps are used to keep track of the keys which were pressed or released during runtime.
|
||||||
static std::map<unsigned char,bool> ascii_keys_status;
|
static std::map<unsigned char,bool> ascii_keys_status;
|
||||||
static std::map<int,bool> special_keys_status;
|
static std::map<int,bool> special_keys_status;
|
||||||
|
static std::map<int,bool> mouse_button_status;
|
||||||
|
|
||||||
|
// Updated by callback
|
||||||
|
static Vec2i current_mouse_delta;
|
||||||
|
// Updated on user request
|
||||||
|
static Vec2i last_mouse_delta;
|
||||||
|
static Vec2i last_mouse_position;
|
||||||
|
|
||||||
// These functions are called by *_press and *_up to update their values
|
// These functions are called by *_press and *_up to update their values
|
||||||
static void update_key(unsigned char event_key, bool new_status);
|
static void update_key(unsigned char event_key, bool new_status);
|
||||||
|
|
|
@ -13,7 +13,11 @@ static Texture raptor_texture;
|
||||||
|
|
||||||
void manage_inputs()
|
void manage_inputs()
|
||||||
{
|
{
|
||||||
if (KeyStateManager::is_key_pressed(' '))
|
if (KeyStateManager::is_mouse_button_pressed(GLUT_LEFT_BUTTON))
|
||||||
|
{
|
||||||
|
glClearColor(0,0,0.5,1);
|
||||||
|
}
|
||||||
|
else if (KeyStateManager::is_key_pressed(' '))
|
||||||
{
|
{
|
||||||
glClearColor(0.5,0,0,1);
|
glClearColor(0.5,0,0,1);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +50,7 @@ void display()
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluLookAt(7.5, 7.5, 7.5,
|
gluLookAt(10, 7.5, 10,
|
||||||
0, 0, 1,
|
0, 0, 1,
|
||||||
0, 1, 0);
|
0, 1, 0);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue