Skip to content

Commit

Permalink
Work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
skhaz committed Jan 3, 2025
1 parent c403d63 commit 028a1a3
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 73 deletions.
36 changes: 20 additions & 16 deletions src/event.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,30 @@ enum class keyevent : int32_t {
space = SDLK_SPACE,
};

enum class controller : uint32_t {
up,
down,
left,
right,
triangle,
circle,
cross,
square
enum class joystickevent : int32_t {
up = SDL_CONTROLLER_BUTTON_DPAD_UP,
down = SDL_CONTROLLER_BUTTON_DPAD_DOWN,
left = SDL_CONTROLLER_BUTTON_DPAD_LEFT,
right = SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
triangle = SDL_CONTROLLER_BUTTON_Y,
circle = SDL_CONTROLLER_BUTTON_B,
cross = SDL_CONTROLLER_BUTTON_A,
square = SDL_CONTROLLER_BUTTON_X,
};

enum class mouseevent : int32_t {};

enum class joystickevent : int32_t {
dpad_up = SDL_CONTROLLER_BUTTON_DPAD_UP,
dpad_down = SDL_CONTROLLER_BUTTON_DPAD_DOWN,
dpad_left = SDL_CONTROLLER_BUTTON_DPAD_LEFT,
dpad_right = SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
enum class controller : int32_t {
up = static_cast<int32_t>(joystickevent::up),
down = static_cast<int32_t>(joystickevent::down),
left = static_cast<int32_t>(joystickevent::left),
right = static_cast<int32_t>(joystickevent::right),
triangle = static_cast<int32_t>(joystickevent::triangle),
circle = static_cast<int32_t>(joystickevent::circle),
cross = static_cast<int32_t>(joystickevent::cross),
square = static_cast<int32_t>(joystickevent::square),
};

enum class mouseevent : int32_t {};

class mailevent {
public:
mailevent(uint64_t to, const std::string &body) noexcept
Expand Down
107 changes: 58 additions & 49 deletions src/eventmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ eventmanager::eventmanager() {
void eventmanager::update(float_t delta) {
UNUSED(delta);

static constexpr std::array<std::pair<Uint8, SDL_Keycode>, 6> mapping = {{
{SDL_CONTROLLER_BUTTON_DPAD_UP, SDLK_UP},
{SDL_CONTROLLER_BUTTON_DPAD_LEFT, SDLK_LEFT},
{SDL_CONTROLLER_BUTTON_DPAD_DOWN, SDLK_DOWN},
{SDL_CONTROLLER_BUTTON_DPAD_RIGHT, SDLK_RIGHT},
{SDL_CONTROLLER_BUTTON_A, SDLK_SPACE},
{SDL_CONTROLLER_BUTTON_B, SDLK_SPACE},
}};
// static constexpr std::array<std::pair<Uint8, SDL_Keycode>, 6> mapping = {{
// {SDL_CONTROLLER_BUTTON_DPAD_UP, SDLK_UP},
// {SDL_CONTROLLER_BUTTON_DPAD_LEFT, SDLK_LEFT},
// {SDL_CONTROLLER_BUTTON_DPAD_DOWN, SDLK_DOWN},
// {SDL_CONTROLLER_BUTTON_DPAD_RIGHT, SDLK_RIGHT},
// {SDL_CONTROLLER_BUTTON_A, SDLK_SPACE},
// {SDL_CONTROLLER_BUTTON_B, SDLK_SPACE},
// }};

SDL_Event event;
while (SDL_PollEvent(&event)) {
Expand Down Expand Up @@ -61,53 +61,62 @@ void eventmanager::update(float_t delta) {
_controllers.erase(event.cdevice.which);
break;

case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP: {
const auto it = std::find_if(mapping.begin(), mapping.end(), [&event](const auto &pair) { return pair.first == event.cbutton.button; });

if (it != mapping.end()) {
const auto action = (event.type == SDL_CONTROLLERBUTTONDOWN) ? &eventreceiver::on_keydown : &eventreceiver::on_keyup;
for (const auto &receiver : _receivers) {
(receiver.get()->*action)(keyevent(it->second));
}
case SDL_CONTROLLERBUTTONDOWN: {
for (const auto &receiver : _receivers) {
receiver->on_joystickbuttondown(event.cbutton.which, joystickevent(event.cbutton.button));
}
} break;

case SDL_CONTROLLERAXISMOTION: {
static constexpr auto threshold = 8000;
static constexpr auto deadzone = 4000;

const auto axis = event.caxis.axis;
const auto value = event.caxis.value;
const auto process = [&](SDL_Keycode negative, SDL_Keycode positive) {
if (value < -threshold) {
for (const auto &receiver : _receivers) {
receiver->on_keydown(keyevent(negative));
}
} else if (value > threshold) {
for (const auto &receiver : _receivers) {
receiver->on_keydown(keyevent(positive));
}
} else if (std::abs(value) < deadzone) {
for (const auto &receiver : _receivers) {
receiver->on_keyup(keyevent(negative));
receiver->on_keyup(keyevent(positive));
}
}
};
case SDL_CONTROLLERBUTTONUP: {
for (const auto &receiver : _receivers) {
receiver->on_joystickbuttonup(event.cbutton.which, joystickevent(event.cbutton.button));
}

switch (axis) {
case SDL_CONTROLLER_AXIS_LEFTY:
process(SDLK_UP, SDLK_DOWN);
break;
// const auto it = std::find_if(mapping.begin(), mapping.end(), [&event](const auto &pair) { return pair.first == event.cbutton.button; });

case SDL_CONTROLLER_AXIS_LEFTX:
process(SDLK_LEFT, SDLK_RIGHT);
break;
// if (it != mapping.end()) {
// const auto action = (event.type == SDL_CONTROLLERBUTTONDOWN) ? &eventreceiver::on_keydown : &eventreceiver::on_keyup;
// for (const auto &receiver : _receivers) {
// (receiver.get()->*action)(keyevent(it->second));
// }
// }
} break;

default:
break;
}
case SDL_CONTROLLERAXISMOTION: {
// static constexpr auto threshold = 8000;
// static constexpr auto deadzone = 4000;

// const auto axis = event.caxis.axis;
// const auto value = event.caxis.value;
// const auto process = [&](SDL_Keycode negative, SDL_Keycode positive) {
// if (value < -threshold) {
// for (const auto &receiver : _receivers) {
// receiver->on_keydown(keyevent(negative));
// }
// } else if (value > threshold) {
// for (const auto &receiver : _receivers) {
// receiver->on_keydown(keyevent(positive));
// }
// } else if (std::abs(value) < deadzone) {
// for (const auto &receiver : _receivers) {
// receiver->on_keyup(keyevent(negative));
// receiver->on_keyup(keyevent(positive));
// }
// }
// };

// switch (axis) {
// case SDL_CONTROLLER_AXIS_LEFTY:
// // process(SDLK_UP, SDLK_DOWN);
// break;

// case SDL_CONTROLLER_AXIS_LEFTX:
// // process(SDLK_LEFT, SDLK_RIGHT);
// break;

// default:
// break;
// }
} break;

case input::eventtype::mail: {
Expand Down
22 changes: 19 additions & 3 deletions src/eventreceiver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,24 @@ using namespace input;

void eventreceiver::on_quit() noexcept {}

void eventreceiver::on_keydown(const keyevent &event) noexcept { UNUSED(event); }
void eventreceiver::on_keydown(const keyevent &event) noexcept {
UNUSED(event);
}

void eventreceiver::on_keyup(const keyevent &event) noexcept { UNUSED(event); }
void eventreceiver::on_keyup(const keyevent &event) noexcept {
UNUSED(event);
}

void eventreceiver::on_mail(const mailevent &event) noexcept { UNUSED(event); }
void eventreceiver::on_joystickbuttondown(int who, const joystickevent &event) noexcept {
UNUSED(who);
UNUSED(event);
}

void eventreceiver::on_joystickbuttonup(int who, const joystickevent &event) noexcept {
UNUSED(who);
UNUSED(event);
}

void eventreceiver::on_mail(const mailevent &event) noexcept {
UNUSED(event);
}
2 changes: 2 additions & 0 deletions src/eventreceiver.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ class eventreceiver {
virtual void on_quit() noexcept;
virtual void on_keydown(const keyevent &event) noexcept;
virtual void on_keyup(const keyevent &event) noexcept;
virtual void on_joystickbuttondown(int who, const joystickevent &event) noexcept;
virtual void on_joystickbuttonup(int who, const joystickevent &event) noexcept;
virtual void on_mail(const mailevent &event) noexcept;
};
}
15 changes: 10 additions & 5 deletions src/statemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@
using namespace framework;

bool statemanager::on(int player, const std::variant<input::controller> &type) const noexcept {
auto pit = _state.find(player);
if (pit != _state.end()) {
auto &map = pit->second;
auto tit = map.find(type);
if (tit != map.end()) {
if (const auto pit = _state.find(player); pit != _state.end()) {
if (const auto tit = pit->second.find(type); tit != pit->second.end()) {
return tit->second;
}
}
Expand Down Expand Up @@ -49,3 +46,11 @@ void statemanager::on_keyup(const input::keyevent &event) noexcept {
_state[0][*ctrl] = false;
}
}

void statemanager::on_joystickbuttondown(int who, const input::joystickevent &event) noexcept {
_state[who][static_cast<input::controller>(event)] = true;
}

void statemanager::on_joystickbuttonup(int who, const input::joystickevent &event) noexcept {
_state[who][static_cast<input::controller>(event)] = false;
}
4 changes: 4 additions & 0 deletions src/statemanager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ class statemanager : public input::eventreceiver {

virtual void on_keyup(const input::keyevent &event) noexcept;

virtual void on_joystickbuttondown(int who, const input::joystickevent &event) noexcept;

virtual void on_joystickbuttonup(int who, const input::joystickevent &event) noexcept;

private:
std::unordered_map<uint8_t, std::unordered_map<std::variant<input::controller>, bool>> _state;
};
Expand Down

0 comments on commit 028a1a3

Please sign in to comment.