controller and mouse support

This commit is contained in:
Alfie King 2024-09-13 12:12:31 +01:00
parent 9e7ba471ae
commit fa76489449
5 changed files with 91 additions and 16 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
.vscode .vscode
build build
main.x86_64

View File

@ -2,6 +2,27 @@
#include <map> #include <map>
#include <string> #include <string>
struct Controller
{
SDL_GameController* controller;
std::string name;
std::map<Uint8, bool> buttons;
Sint16 leftStickX = 0;
Sint16 leftStickY = 0;
Sint16 rightStickX = 0;
Sint16 rightStickY = 0;
Sint16 leftTrigger = 0;
Sint16 rightTrigger = 0;
};
struct Mouse
{
int x;
int y;
int wheel;
std::map<int, bool> buttons;
};
class Input class Input
{ {
private: private:
@ -9,6 +30,10 @@ class Input
public: public:
bool exit; bool exit;
std::map<int, Controller> controllers;
std::map<SDL_Keycode, bool> activeKeys; std::map<SDL_Keycode, bool> activeKeys;
Mouse mouse;
Input();
void update(); void update();
}; };

View File

@ -1,9 +1,14 @@
// prevent multiple inclusion
#pragma once #pragma once
// class for 2D float vector
class float_vec2 class float_vec2
{ {
// public members
public: public:
// x and y coordinates
float x, y; float x, y;
// operator functions
float_vec2 operator+(float_vec2 vec) float_vec2 operator+(float_vec2 vec)
{ {
return { x + vec.x, y + vec.y }; return { x + vec.x, y + vec.y };
@ -26,10 +31,14 @@ class float_vec2
} }
}; };
// class for 2D integer vector
class int_vec2 class int_vec2
{ {
// public members
public: public:
// x and y coordinates
int x, y; int x, y;
// operator functions
int_vec2 operator+(int_vec2 vec) int_vec2 operator+(int_vec2 vec)
{ {
return { x + vec.x, y + vec.y }; return { x + vec.x, y + vec.y };

View File

@ -79,27 +79,31 @@ int main(int argc, char* argv[])
quit(); quit();
} }
if (engine->input.activeKeys[SDLK_d]) if (engine->input.activeKeys[SDLK_d] || engine->input.controllers[0].buttons[SDL_CONTROLLER_BUTTON_DPAD_RIGHT] || engine->input.controllers[0].leftStickX > 8000)
{ {
animations->setAnimation("walk_right"); animations->setAnimation("walk_right");
sprite->move({ 1, 0 }); sprite->move({ 1, 0 });
} }
if (engine->input.activeKeys[SDLK_a]) if (engine->input.activeKeys[SDLK_a] || engine->input.controllers[0].buttons[SDL_CONTROLLER_BUTTON_DPAD_LEFT] || engine->input.controllers[0].leftStickX < -8000)
{ {
animations->setAnimation("walk_left"); animations->setAnimation("walk_left");
sprite->move({ -1, 0 }); sprite->move({ -1, 0 });
} }
if (engine->input.activeKeys[SDLK_w]) if (engine->input.activeKeys[SDLK_w] || engine->input.controllers[0].buttons[SDL_CONTROLLER_BUTTON_DPAD_UP] || engine->input.controllers[0].leftStickY < -8000)
{ {
animations->setAnimation("walk_back"); animations->setAnimation("walk_back");
sprite->move({ 0, -1 }); sprite->move({ 0, -1 });
} }
if (engine->input.activeKeys[SDLK_s]) if (engine->input.activeKeys[SDLK_s] || engine->input.controllers[0].buttons[SDL_CONTROLLER_BUTTON_DPAD_DOWN] || engine->input.controllers[0].leftStickY > 8000)
{ {
animations->setAnimation("walk_front"); animations->setAnimation("walk_front");
sprite->move({ 0, 1 }); sprite->move({ 0, 1 });
} }
if (!engine->input.activeKeys[SDLK_d] && !engine->input.activeKeys[SDLK_a] && !engine->input.activeKeys[SDLK_w] && !engine->input.activeKeys[SDLK_s]) if (!engine->input.activeKeys[SDLK_d] && !engine->input.activeKeys[SDLK_a] && !engine->input.activeKeys[SDLK_w] && !engine->input.activeKeys[SDLK_s]
&& !engine->input.controllers[0].buttons[SDL_CONTROLLER_BUTTON_DPAD_RIGHT] && !engine->input.controllers[0].buttons[SDL_CONTROLLER_BUTTON_DPAD_LEFT]
&& !engine->input.controllers[0].buttons[SDL_CONTROLLER_BUTTON_DPAD_UP] && !engine->input.controllers[0].buttons[SDL_CONTROLLER_BUTTON_DPAD_DOWN]
&& engine->input.controllers[0].leftStickX == 0 && engine->input.controllers[0].leftStickY == 0)
{ {
animations->setAnimation("idle"); animations->setAnimation("idle");
} }

View File

@ -1,20 +1,56 @@
#include "input.h" #include "input.h"
Input::Input()
{
SDL_Init(SDL_INIT_JOYSTICK);
exit = false;
}
void Input::update() void Input::update()
{ {
while (SDL_PollEvent(&event)) while (SDL_PollEvent(&event))
{ {
if (event.type == SDL_KEYDOWN) switch (event.type)
{ {
case SDL_CONTROLLERBUTTONDOWN:
controllers[event.cbutton.which].buttons[event.cbutton.button] = true;
break;
case SDL_CONTROLLERBUTTONUP:
controllers[event.cbutton.which].buttons[event.cbutton.button] = false;
break;
case SDL_MOUSEBUTTONDOWN:
mouse.buttons[event.button.button] = true;
break;
case SDL_MOUSEBUTTONUP:
mouse.buttons[event.button.button] = false;
break;
case SDL_KEYDOWN:
activeKeys[event.key.keysym.sym] = true; activeKeys[event.key.keysym.sym] = true;
} break;
else if (event.type == SDL_KEYUP) case SDL_KEYUP:
{
activeKeys.erase(event.key.keysym.sym); activeKeys.erase(event.key.keysym.sym);
} break;
else if (event.type == SDL_QUIT) case SDL_CONTROLLERDEVICEADDED:
{ controllers[SDL_NumJoysticks() - 1] = {
SDL_GameControllerOpen(SDL_NumJoysticks() - 1),
SDL_GameControllerName(SDL_GameControllerOpen(SDL_NumJoysticks() - 1))
};
printf("Controller added: %s\n", controllers[SDL_NumJoysticks() - 1].name.c_str());
break;
case SDL_QUIT:
exit = true; exit = true;
} break;
}
for (auto& controller : controllers)
{
controller.second.leftStickX = SDL_GameControllerGetAxis(controller.second.controller, SDL_CONTROLLER_AXIS_LEFTX);
controller.second.leftStickY = SDL_GameControllerGetAxis(controller.second.controller, SDL_CONTROLLER_AXIS_LEFTY);
controller.second.rightStickX = SDL_GameControllerGetAxis(controller.second.controller, SDL_CONTROLLER_AXIS_RIGHTX);
controller.second.rightStickY = SDL_GameControllerGetAxis(controller.second.controller, SDL_CONTROLLER_AXIS_RIGHTY);
controller.second.leftTrigger = SDL_GameControllerGetAxis(controller.second.controller, SDL_CONTROLLER_AXIS_TRIGGERLEFT);
controller.second.rightTrigger = SDL_GameControllerGetAxis(controller.second.controller, SDL_CONTROLLER_AXIS_TRIGGERRIGHT);
}
SDL_GetMouseState(&mouse.x, &mouse.y);
mouse.wheel = event.wheel.y;
} }
} }