mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2026-01-29 17:38:16 +03:00
Hello WWWWWWorld!
This commit is contained in:
333
desktop_version/src/KeyPoll.cpp
Normal file
333
desktop_version/src/KeyPoll.cpp
Normal file
@@ -0,0 +1,333 @@
|
||||
#include "KeyPoll.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
void KeyPoll::setSensitivity(int _value)
|
||||
{
|
||||
switch (_value)
|
||||
{
|
||||
case 0:
|
||||
sensitivity = 28000;
|
||||
break;
|
||||
case 1:
|
||||
sensitivity = 16000;
|
||||
break;
|
||||
case 2:
|
||||
sensitivity = 8000;
|
||||
break;
|
||||
case 3:
|
||||
sensitivity = 4000;
|
||||
break;
|
||||
case 4:
|
||||
sensitivity = 2000;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
KeyPoll::KeyPoll()
|
||||
{
|
||||
xVel = 0;
|
||||
yVel = 0;
|
||||
setSensitivity(2);
|
||||
|
||||
quitProgram = 0;
|
||||
textentrymode=true;
|
||||
keybuffer="";
|
||||
leftbutton=0; rightbutton=0; middlebutton=0;
|
||||
mx=0; my=0;
|
||||
resetWindow = 0;
|
||||
toggleFullscreen = false;
|
||||
pressedbackspace=false;
|
||||
|
||||
useFullscreenSpaces = false;
|
||||
if (strcmp(SDL_GetPlatform(), "Mac OS X") == 0)
|
||||
{
|
||||
useFullscreenSpaces = true;
|
||||
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES);
|
||||
if (hint != NULL)
|
||||
{
|
||||
useFullscreenSpaces = (strcmp(hint, "1") == 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KeyPoll::enabletextentry()
|
||||
{
|
||||
keybuffer="";
|
||||
textentrymode = true;
|
||||
SDL_StartTextInput();
|
||||
}
|
||||
|
||||
void KeyPoll::disabletextentry()
|
||||
{
|
||||
textentrymode = false;
|
||||
SDL_StopTextInput();
|
||||
}
|
||||
|
||||
void KeyPoll::Poll()
|
||||
{
|
||||
SDL_Event evt;
|
||||
while (SDL_PollEvent(&evt))
|
||||
{
|
||||
/* Keyboard Input */
|
||||
if (evt.type == SDL_KEYDOWN)
|
||||
{
|
||||
keymap[evt.key.keysym.sym] = true;
|
||||
if (evt.key.keysym.sym == SDLK_BACKSPACE)
|
||||
{
|
||||
pressedbackspace = true;
|
||||
}
|
||||
else if ( ( evt.key.keysym.sym == SDLK_RETURN ||
|
||||
evt.key.keysym.sym == SDLK_f ) &&
|
||||
#ifdef __APPLE__ /* OSX prefers the command key over the alt keys. -flibit */
|
||||
keymap[SDLK_LGUI] )
|
||||
#else
|
||||
( keymap[SDLK_LALT] ||
|
||||
keymap[SDLK_RALT] ) )
|
||||
#endif
|
||||
{
|
||||
toggleFullscreen = true;
|
||||
}
|
||||
|
||||
if (textentrymode)
|
||||
{
|
||||
if (evt.key.keysym.sym == SDLK_BACKSPACE)
|
||||
{
|
||||
keybuffer = keybuffer.substr(0, keybuffer.length() - 1);
|
||||
}
|
||||
else if ( evt.key.keysym.sym == SDLK_v &&
|
||||
keymap[SDLK_LCTRL] )
|
||||
{
|
||||
keybuffer += SDL_GetClipboardText();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (evt.type == SDL_KEYUP)
|
||||
{
|
||||
keymap[evt.key.keysym.sym] = false;
|
||||
if (evt.key.keysym.sym == SDLK_BACKSPACE)
|
||||
{
|
||||
pressedbackspace = false;
|
||||
}
|
||||
}
|
||||
else if (evt.type == SDL_TEXTINPUT)
|
||||
{
|
||||
keybuffer += evt.text.text;
|
||||
}
|
||||
|
||||
/* Mouse Input */
|
||||
else if (evt.type == SDL_MOUSEMOTION)
|
||||
{
|
||||
mx = evt.motion.x;
|
||||
my = evt.motion.y;
|
||||
}
|
||||
else if (evt.type == SDL_MOUSEBUTTONDOWN)
|
||||
{
|
||||
if (evt.button.button == SDL_BUTTON_LEFT)
|
||||
{
|
||||
mx = evt.button.x;
|
||||
my = evt.button.y;
|
||||
leftbutton = 1;
|
||||
}
|
||||
else if (evt.button.button == SDL_BUTTON_RIGHT)
|
||||
{
|
||||
mx = evt.button.x;
|
||||
my = evt.button.y;
|
||||
rightbutton = 1;
|
||||
}
|
||||
else if (evt.button.button == SDL_BUTTON_MIDDLE)
|
||||
{
|
||||
mx = evt.button.x;
|
||||
my = evt.button.y;
|
||||
middlebutton = 1;
|
||||
}
|
||||
}
|
||||
else if (evt.type == SDL_MOUSEBUTTONUP)
|
||||
{
|
||||
if (evt.button.button == SDL_BUTTON_LEFT)
|
||||
{
|
||||
mx = evt.button.x;
|
||||
my = evt.button.y;
|
||||
leftbutton=0;
|
||||
}
|
||||
else if (evt.button.button == SDL_BUTTON_RIGHT)
|
||||
{
|
||||
mx = evt.button.x;
|
||||
my = evt.button.y;
|
||||
rightbutton=0;
|
||||
}
|
||||
else if (evt.button.button == SDL_BUTTON_MIDDLE)
|
||||
{
|
||||
mx = evt.button.x;
|
||||
my = evt.button.y;
|
||||
middlebutton=0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Controller Input */
|
||||
else if (evt.type == SDL_CONTROLLERBUTTONDOWN)
|
||||
{
|
||||
buttonmap[(SDL_GameControllerButton) evt.cbutton.button] = true;
|
||||
}
|
||||
else if (evt.type == SDL_CONTROLLERBUTTONUP)
|
||||
{
|
||||
buttonmap[(SDL_GameControllerButton) evt.cbutton.button] = false;
|
||||
}
|
||||
else if (evt.type == SDL_CONTROLLERAXISMOTION)
|
||||
{
|
||||
if (evt.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX)
|
||||
{
|
||||
if ( evt.caxis.value > -sensitivity &&
|
||||
evt.caxis.value < sensitivity )
|
||||
{
|
||||
xVel = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
xVel = (evt.caxis.value > 0) ? 1 : -1;
|
||||
}
|
||||
}
|
||||
if (evt.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY)
|
||||
{
|
||||
if ( evt.caxis.value > -sensitivity &&
|
||||
evt.caxis.value < sensitivity )
|
||||
{
|
||||
yVel = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
yVel = (evt.caxis.value > 0) ? 1 : -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (evt.type == SDL_CONTROLLERDEVICEADDED)
|
||||
{
|
||||
SDL_GameController *toOpen = SDL_GameControllerOpen(evt.cdevice.which);
|
||||
printf(
|
||||
"Opened SDL_GameController ID #%i, %s\n",
|
||||
evt.cdevice.which,
|
||||
SDL_GameControllerName(toOpen)
|
||||
);
|
||||
controllers[SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(toOpen))] = toOpen;
|
||||
}
|
||||
else if (evt.type == SDL_CONTROLLERDEVICEREMOVED)
|
||||
{
|
||||
SDL_GameController *toClose = controllers[evt.cdevice.which];
|
||||
controllers.erase(evt.cdevice.which);
|
||||
printf("Closing %s\n", SDL_GameControllerName(toClose));
|
||||
SDL_GameControllerClose(toClose);
|
||||
}
|
||||
|
||||
/* Window Events */
|
||||
else if (evt.type == SDL_WINDOWEVENT)
|
||||
{
|
||||
/* Window Resize */
|
||||
if (evt.window.event == SDL_WINDOWEVENT_RESIZED)
|
||||
{
|
||||
resetWindow = true;
|
||||
}
|
||||
|
||||
/* Window Focus */
|
||||
else if (evt.window.event == SDL_WINDOWEVENT_FOCUS_GAINED)
|
||||
{
|
||||
isActive = true;
|
||||
if (!useFullscreenSpaces)
|
||||
{
|
||||
SDL_Window *window = SDL_GetWindowFromID(evt.window.windowID);
|
||||
wasFullscreen = SDL_GetWindowFlags(window);
|
||||
SDL_SetWindowFullscreen(window, 0);
|
||||
}
|
||||
SDL_DisableScreenSaver();
|
||||
}
|
||||
else if (evt.window.event == SDL_WINDOWEVENT_FOCUS_LOST)
|
||||
{
|
||||
isActive = false;
|
||||
if (!useFullscreenSpaces)
|
||||
{
|
||||
SDL_SetWindowFullscreen(
|
||||
SDL_GetWindowFromID(evt.window.windowID),
|
||||
wasFullscreen
|
||||
);
|
||||
}
|
||||
SDL_EnableScreenSaver();
|
||||
}
|
||||
|
||||
/* Mouse Focus */
|
||||
else if (evt.window.event == SDL_WINDOWEVENT_ENTER)
|
||||
{
|
||||
SDL_DisableScreenSaver();
|
||||
}
|
||||
else if (evt.window.event == SDL_WINDOWEVENT_LEAVE)
|
||||
{
|
||||
SDL_EnableScreenSaver();
|
||||
}
|
||||
}
|
||||
|
||||
/* Quit Event */
|
||||
else if (evt.type == SDL_QUIT)
|
||||
{
|
||||
quitProgram = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool KeyPoll::isDown(SDL_Keycode key)
|
||||
{
|
||||
return keymap[key];
|
||||
}
|
||||
|
||||
bool KeyPoll::isUp(SDL_Keycode key)
|
||||
{
|
||||
return !keymap[key];
|
||||
}
|
||||
|
||||
bool KeyPoll::isDown(std::vector<SDL_GameControllerButton> buttons)
|
||||
{
|
||||
for (size_t i = 0; i < buttons.size(); i += 1)
|
||||
{
|
||||
if (buttonmap[buttons[i]])
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool KeyPoll::isDown(SDL_GameControllerButton button)
|
||||
{
|
||||
return buttonmap[button];
|
||||
}
|
||||
|
||||
bool KeyPoll::controllerButtonDown()
|
||||
{
|
||||
for (
|
||||
SDL_GameControllerButton button = SDL_CONTROLLER_BUTTON_A;
|
||||
button < SDL_CONTROLLER_BUTTON_DPAD_UP;
|
||||
button = (SDL_GameControllerButton) (button + 1)
|
||||
) {
|
||||
if (isDown(button))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool KeyPoll::controllerWantsLeft(bool includeVert)
|
||||
{
|
||||
return ( buttonmap[SDL_CONTROLLER_BUTTON_DPAD_LEFT] ||
|
||||
xVel < 0 ||
|
||||
( includeVert &&
|
||||
( buttonmap[SDL_CONTROLLER_BUTTON_DPAD_UP] ||
|
||||
yVel < 0 ) ) );
|
||||
}
|
||||
|
||||
bool KeyPoll::controllerWantsRight(bool includeVert)
|
||||
{
|
||||
return ( buttonmap[SDL_CONTROLLER_BUTTON_DPAD_RIGHT] ||
|
||||
xVel > 0 ||
|
||||
( includeVert &&
|
||||
( buttonmap[SDL_CONTROLLER_BUTTON_DPAD_DOWN] ||
|
||||
yVel > 0 ) ) );
|
||||
}
|
||||
Reference in New Issue
Block a user