00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef HEADER_SUPERTUX_CONTROL_JOYSTICKKEYBOARDCONTROLLER_HPP
00018 #define HEADER_SUPERTUX_CONTROL_JOYSTICKKEYBOARDCONTROLLER_HPP
00019
00020 #include "control/controller.hpp"
00021
00022 #include <SDL.h>
00023
00024 #include <map>
00025 #include <string>
00026 #include <vector>
00027
00028 #include "util/reader_fwd.hpp"
00029 #include "util/writer_fwd.hpp"
00030
00031 class Menu;
00032 class KeyboardMenu;
00033 class JoystickMenu;
00034 class Controller;
00035
00036 class JoystickKeyboardController
00037 {
00038 private:
00039 friend class KeyboardMenu;
00040 friend class JoystickMenu;
00041
00042 typedef Controller::Control Control;
00043 typedef Uint8 JoyId;
00044
00045 typedef std::map<SDLKey, Control> KeyMap;
00046 typedef std::map<std::pair<JoyId, int>, Control> ButtonMap;
00047 typedef std::map<std::pair<JoyId, int>, Control> AxisMap;
00048 typedef std::map<std::pair<JoyId, int>, Control> HatMap;
00049
00050 public:
00051 JoystickKeyboardController();
00052 virtual ~JoystickKeyboardController();
00053
00056 void process_event(const SDL_Event& event);
00057
00058 void write(Writer& writer);
00059 void read(const Reader& lisp);
00060 void update();
00061 void reset();
00062
00063 void updateAvailableJoysticks();
00064
00065 Controller *get_main_controller();
00066
00067 private:
00068 void process_key_event(const SDL_KeyboardEvent& event);
00069 void process_hat_event(const SDL_JoyHatEvent& jhat);
00070 void process_axis_event(const SDL_JoyAxisEvent& jaxis);
00071 void process_button_event(const SDL_JoyButtonEvent& jbutton);
00072 void process_console_key_event(const SDL_KeyboardEvent& event);
00073 void process_menu_key_event(const SDL_KeyboardEvent& event);
00074
00075 void print_joystick_mappings();
00076
00077 SDLKey reversemap_key(Control c);
00078 int reversemap_joybutton(Control c);
00079 int reversemap_joyaxis(Control c);
00080 int reversemap_joyhat(Control c);
00081
00082 void unbind_joystick_control(Control c);
00083
00084 void bind_joybutton(JoyId joy_id, int button, Control c);
00085 void bind_joyaxis(JoyId joy_id, int axis, Control c);
00086 void bind_joyhat(JoyId joy_id, int dir, Control c);
00087 void bind_key(SDLKey key, Control c);
00088
00089 void set_joy_controls(Control id, bool value);
00090
00091 private:
00092 Controller *controller;
00093
00094 KeyMap keymap;
00095
00096 ButtonMap joy_button_map;
00097
00098 AxisMap joy_axis_map;
00099
00100 HatMap joy_hat_map;
00101
00102 std::vector<SDL_Joystick*> joysticks;
00103
00104 std::string name;
00105
00106 int dead_zone;
00108 int min_joybuttons;
00110 int max_joybuttons;
00111
00112 int max_joyaxis;
00113
00114 int max_joyhats;
00115
00116 Uint8 hat_state;
00117
00118 bool jump_with_up_joy;
00119 bool jump_with_up_kbd;
00120
00121 int wait_for_key;
00122 int wait_for_joystick;
00123
00124 private:
00125 JoystickKeyboardController(const JoystickKeyboardController&);
00126 JoystickKeyboardController& operator=(const JoystickKeyboardController&);
00127 };
00128
00129 #endif
00130
00131