Some cleanup in input sensing code + fixed a totally stupid bug

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3671 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2009-06-28 23:24:58 +00:00
parent a359f74ea4
commit b8f2ef6c16
4 changed files with 66 additions and 69 deletions

View File

@ -411,7 +411,7 @@ namespace StateManager
RibbonGridWidget* devices = getCurrentScreen()->getWidget<RibbonGridWidget>("devices");
assert( devices != NULL );
std::cout << "-------\nentering sensing mode for " << devices->getSelectionIDString().c_str() << std::endl;
std::cout << "\n% Entering sensing mode for " << devices->getSelectionIDString().c_str() << std::endl;
new PressAKeyDialog(0.4f, 0.4f);
@ -455,7 +455,7 @@ namespace StateManager
if(keyboard)
{
std::cout << "received some keyboard input\n";
std::cout << "% Binding " << KartActionStrings[binding_to_set] << " : setting to keyboard key " << sensedInput->btnID << " \n\n";
KeyboardDevice* keyboard = input_manager->getDeviceList()->getKeyboard(0);
keyboard->editBinding(binding_to_set, sensedInput->btnID);
@ -465,13 +465,18 @@ namespace StateManager
}
else if(gamepad)
{
std::cout << "received some gamepad input on device " << sensedInput->deviceID << " : ";
std::cout << "% Binding " << KartActionStrings[binding_to_set] << " : setting to gamepad #" << sensedInput->deviceID << " : ";
if(sensedInput->type == Input::IT_STICKMOTION)
std::cout << "axis\n";
{
std::cout << "axis " << sensedInput->btnID << " direction " <<
(sensedInput->axisDirection == Input::AD_NEGATIVE ? "-" : "+") << "\n\n";
}
else if(sensedInput->type == Input::IT_STICKBUTTON)
std::cout << "button " << sensedInput->btnID << "\n";
{
std::cout << "button " << sensedInput->btnID << "\n\n";
}
else
std::cout << "WTF?\n";
std::cout << "Sensed unknown gamepad event type??\n";
int gamepadID = -1;

View File

@ -283,7 +283,7 @@ void GamePadDevice::editBinding(const PlayerAction action, const Input::InputTyp
{
m_bindings[action].type = type;
m_bindings[action].id = id;
m_bindings[PA_ACCEL].dir = direction;
m_bindings[action].dir = direction;
}
// -----------------------------------------------------------------------------
void GamePadDevice::resetAxisDirection(const int axis, Input::AxisDirection direction, const int player)

View File

@ -164,7 +164,55 @@ void InputManager::handleStaticAction(int key, int value)
}
/**
* Handles input when an input sensing mode (when configuring input)
*/
void InputManager::inputSensing(Input::InputType type, int deviceID, int btnID, int axisDirection, int value)
{
// See if the new input should be stored. This happens if:
// 1) the value is larger
// 2) nothing has been saved yet
// 3) the new event has the preferred type : TODO - reimplement
// The latter is necessary since some gamepads have analog
// buttons that can return two different events when pressed
bool store_new = abs(value) > m_max_sensed_input ||
m_max_sensed_type == Input::IT_NONE;
// don't store if we're trying to do something like bindings keyboard keys on a gamepad
if(m_mode == INPUT_SENSE_KEYBOARD && type != Input::IT_KEYBOARD) store_new = false;
if(m_mode == INPUT_SENSE_GAMEPAD && type != Input::IT_STICKMOTION && type != Input::IT_STICKBUTTON) store_new = false;
// only store axes when they're pushed quite far
if(m_mode == INPUT_SENSE_GAMEPAD && type == Input::IT_STICKMOTION && abs(value) < MAX_VALUE *2/3) store_new = false;
if(store_new)
{
m_sensed_input->type = type;
if(type == Input::IT_STICKMOTION)
{
std::cout << "%% storing new axis binding, value=" << value <<
" deviceID=" << deviceID << " btnID=" << btnID << " axisDirection=" <<
(axisDirection == Input::AD_NEGATIVE ? "-" : "+") << "\n";
}
else if(type == Input::IT_STICKBUTTON)
{
std::cout << "%% storing new gamepad button binding\n";
}
m_sensed_input->deviceID = deviceID;
m_sensed_input->btnID = btnID;
m_sensed_input->axisDirection = axisDirection;
m_max_sensed_input = abs(value);
m_max_sensed_type = type;
}
// Notify the completion of the input sensing if the key/stick/... is released.
if(value==0)
{
StateManager::gotSensedInput(m_sensed_input);
}
}
//-----------------------------------------------------------------------------
/** Handles the conversion from some input to a GameAction and its distribution
@ -211,73 +259,17 @@ void InputManager::input(Input::InputType type, int deviceID, int btnID, int axi
if (m_mode == INPUT_SENSE_KEYBOARD ||
m_mode == INPUT_SENSE_GAMEPAD)
{
//if(type == Input::IT_STICKMOTION)
// std::cout << "sensing input detected an axis event\n";
//if(type == Input::IT_STICKBUTTON)
// std::cout << "sensing input detected a button event\n";
// Input sensing should be canceled. (TODO)
//if (ga == GA_LEAVE && m_sensed_input->type==Input::IT_KEYBOARD)
//{
// StateManager::gotSensedInput(NULL);
//}
// Stores the sensed input when the button/key/axes/<whatever> is
// released only and is not used in a fixed mapping.
//else
//if (!UserConfigParams::isFixedInput(type, id0, id1, id2) ) // ignore static actions (TODO)
{
// See if the new input should be stored. This happens if:
// 1) the value is larger
// 2) nothing has been saved yet
// 3) the new event has the preferred type : TODO - reimplement
// The latter is necessary since some gamepads have analog
// buttons that can return two different events when pressed
bool store_new = abs(value) > m_max_sensed_input ||
m_max_sensed_type == Input::IT_NONE;
// (m_mode == INPUT_SENSE_GAMEPAD && (type == Input::IT_STICKMOTION ||
// type == Input::IT_STICKBUTTON) &&
// abs(value) > m_max_sensed_input);
// don't store if we're trying to do something like bindings keyboard keys on a gamepad
if(m_mode == INPUT_SENSE_KEYBOARD && type != Input::IT_KEYBOARD) store_new = false;
if(m_mode == INPUT_SENSE_GAMEPAD && type != Input::IT_STICKMOTION && type != Input::IT_STICKBUTTON) store_new = false;
// only store axes when they're pushed quite far
if(m_mode == INPUT_SENSE_GAMEPAD && type == Input::IT_STICKMOTION && abs(value) < MAX_VALUE *2/3) store_new = false;
if(store_new)
{
m_sensed_input->type = type;
if(type == Input::IT_STICKMOTION)
std::cout << "storing new axis binding, value=" << value <<
" deviceID=" << deviceID << " btnID=" << btnID << "\n";
if(type == Input::IT_STICKBUTTON)
std::cout << "storing new button binding\n";
m_sensed_input->deviceID = deviceID;
m_sensed_input->btnID = btnID;
m_sensed_input->axisDirection = axisDirection;
m_max_sensed_input = abs(value);
m_max_sensed_type = type;
}
// Notify the completion of the input sensing if the key/stick/
// ... is released.
if(value==0)
{
StateManager::gotSensedInput(m_sensed_input);
}
}
inputSensing(type, deviceID, btnID, axisDirection, value);
}
// Otherwise, do something with the key if it matches a binding
else if (action_found)
{
// ... when in-game
if(StateManager::isGameState())
{
RaceManager::getWorld()->getLocalPlayerKart(player)->action(action, abs(value));
}
// ... when in menus
else
{
// reset timer when released

View File

@ -68,9 +68,9 @@ private:
int m_mouse_val_x, m_mouse_val_y;
void input(Input::InputType, int, int, int, int);
//void postIrrLichtMouseEvent(irr::EMOUSE_INPUT_EVENT type, const int x, const int y);
void handleStaticAction(int id0, int value);
void handlePlayerAction(PlayerAction pa, const int playerNo, int value);
void inputSensing(Input::InputType type, int deviceID, int btnID, int axisDirection, int value);
public:
InputManager();
~InputManager();