spacebox/src/Input.hpp

91 lines
2.3 KiB
C++

/* +------------------------------------------------------+
____/ \____ /| - Open source game framework licensed to freely use, |
\ / / | copy, modify and sell without restriction |
+--\ ^__^ /--+ | |
| ~/ \~ | | - created for <https://foam.shampoo.ooo> |
| ~~~~~~~~~~~~ | +------------------------------------------------------+
| SPACE ~~~~~ | /
| ~~~~~~~ BOX |/
+-------------*/
#pragma once
#include <string>
#include <map>
#include <functional>
#include <algorithm>
#include "SDL.h"
#include "Node.hpp"
#include "Animation.hpp"
struct KeyCombination
{
std::string command;
int key;
bool ctrl;
bool shift;
bool alt;
};
class Input : public Node
{
private:
std::map<std::string, SDL_Keycode> key_ids
{
{"up", SDLK_UP},
{"right", SDLK_RIGHT},
{"down", SDLK_DOWN},
{"left", SDLK_LEFT},
{"f1", SDLK_F1},
{"f2", SDLK_F2},
{"f3", SDLK_F3},
{"f4", SDLK_F4},
{"f5", SDLK_F5},
{"f6", SDLK_F6},
{"f7", SDLK_F7},
{"f8", SDLK_F8},
{"f9", SDLK_F9},
{"f10", SDLK_F10},
{"f11", SDLK_F11},
{"f12", SDLK_F11},
{"enter", SDLK_RETURN},
{"space", SDLK_SPACE},
{"escape", SDLK_ESCAPE}
};
std::vector<KeyCombination> key_map;
bool suppressed = false;
KeyCombination parse_key(const std::string& command, const nlohmann::json& json) const;
public:
inline static std::string any = "any";
Animation unsuppress_animation = Animation(std::bind(&Input::unsuppress, this));
Input(Node*);
void respond(SDL_Event&);
void load_key_map();
SDL_Keycode get_key_code(const std::string&) const;
void add_to_key_map(std::string, SDL_Keycode, bool = false, bool = false, bool = false);
void print_key_combination(const KeyCombination&) const;
void suppress();
void unsuppress();
bool is_suppressed();
virtual std::string class_name() const { return "Input"; }
};
/* Add Input class to the sb namespace. This should be the default location, but Input is left in the global namespace
* for backward compatibility.
*/
namespace sb
{
using ::Input;
}
#include "extension.hpp"
#include "Configuration.hpp"
#include "Delegate.hpp"