00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef EVENTHANDLER_H_
00010 #define EVENTHANDLER_H_
00011
00012
00013 #include "../Engine/Camera.h"
00014 #include "../Physics/Physics.h"
00015 #include "../Engine/GameState.h"
00016 #include <map>
00017 #include <cstdlib>
00018
00019 class EventHandler:public INotifiable
00020 {
00021
00022 typedef void (EventHandler::*func)();
00023 static const int KEYBINDINGS=4;
00024
00025 std::map<unsigned char, func>* mainMenuBindings()
00026 {
00027 std::map<unsigned char, func>* keybindings = new std::map<unsigned char, func>();
00028 keybindings->insert(std::pair<unsigned char, func>('y',&EventHandler::newGame));
00029 return keybindings;
00030
00031 };
00032 std::map<unsigned char, func>* pauseBindings()
00033 {
00034 std::map<unsigned char, func>* keybindings = new std::map<unsigned char, func>();
00035 keybindings->insert(std::pair<unsigned char, func>('w',&EventHandler::slideforward));
00036 keybindings->insert(std::pair<unsigned char, func>('s',&EventHandler::slidebackward));
00037 keybindings->insert(std::pair<unsigned char, func>('a',&EventHandler::slideleft));
00038 keybindings->insert(std::pair<unsigned char, func>('d',&EventHandler::slideright));
00039 keybindings->insert(std::pair<unsigned char, func>('+',&EventHandler::slideup));
00040 keybindings->insert(std::pair<unsigned char, func>('-',&EventHandler::slidedown));
00041 keybindings->insert(std::pair<unsigned char, func>('Q',&EventHandler::rollleft));
00042 keybindings->insert(std::pair<unsigned char, func>('E',&EventHandler::rollright));
00043 keybindings->insert(std::pair<unsigned char, func>('A',&EventHandler::yawleft));
00044 keybindings->insert(std::pair<unsigned char, func>('D',&EventHandler::yawright));
00045 keybindings->insert(std::pair<unsigned char, func>('W',&EventHandler::pitchup));
00046 keybindings->insert(std::pair<unsigned char, func>('S',&EventHandler::pitchdown));
00047 keybindings->insert(std::pair<unsigned char, func>('p',&EventHandler::pause));
00048 keybindings->insert(std::pair<unsigned char, func>('\x1B',&EventHandler::exit_));
00049 return keybindings;
00050 };
00051
00052 std::map<unsigned char, func>* gameBindings()
00053 {
00054 std::map<unsigned char, func>* keybindings = new std::map<unsigned char, func>();
00055 keybindings->insert(std::pair<unsigned char, func>('w',&EventHandler::slideforward));
00056 keybindings->insert(std::pair<unsigned char, func>('s',&EventHandler::slidebackward));
00057 keybindings->insert(std::pair<unsigned char, func>('a',&EventHandler::slideleft));
00058 keybindings->insert(std::pair<unsigned char, func>('d',&EventHandler::slideright));
00059 keybindings->insert(std::pair<unsigned char, func>('+',&EventHandler::slideup));
00060 keybindings->insert(std::pair<unsigned char, func>('-',&EventHandler::slidedown));
00061 keybindings->insert(std::pair<unsigned char, func>('Q',&EventHandler::rollleft));
00062 keybindings->insert(std::pair<unsigned char, func>('E',&EventHandler::rollright));
00063 keybindings->insert(std::pair<unsigned char, func>('A',&EventHandler::yawleft));
00064 keybindings->insert(std::pair<unsigned char, func>('D',&EventHandler::yawright));
00065 keybindings->insert(std::pair<unsigned char, func>('W',&EventHandler::pitchup));
00066 keybindings->insert(std::pair<unsigned char, func>('S',&EventHandler::pitchdown));
00067 keybindings->insert(std::pair<unsigned char, func>('h',&EventHandler::hitball));
00068 keybindings->insert(std::pair<unsigned char, func>('y',&EventHandler::debug));
00069 keybindings->insert(std::pair<unsigned char, func>('p',&EventHandler::pause));
00070 keybindings->insert(std::pair<unsigned char, func>('<',&EventHandler::decpower));
00071 keybindings->insert(std::pair<unsigned char, func>('>',&EventHandler::incpower));
00072
00073
00074 return keybindings;
00075 };
00076
00077 std::map<unsigned char, func>* animationBindings()
00078 {
00079 std::map<unsigned char, func>* keybindings = new std::map<unsigned char, func>();
00080 keybindings->insert(std::pair<unsigned char, func>('w',&EventHandler::slideforward));
00081 keybindings->insert(std::pair<unsigned char, func>('s',&EventHandler::slidebackward));
00082 keybindings->insert(std::pair<unsigned char, func>('a',&EventHandler::slideleft));
00083 keybindings->insert(std::pair<unsigned char, func>('d',&EventHandler::slideright));
00084 keybindings->insert(std::pair<unsigned char, func>('+',&EventHandler::slideup));
00085 keybindings->insert(std::pair<unsigned char, func>('-',&EventHandler::slidedown));
00086 keybindings->insert(std::pair<unsigned char, func>('Q',&EventHandler::rollleft));
00087 keybindings->insert(std::pair<unsigned char, func>('E',&EventHandler::rollright));
00088 keybindings->insert(std::pair<unsigned char, func>('A',&EventHandler::yawleft));
00089 keybindings->insert(std::pair<unsigned char, func>('D',&EventHandler::yawright));
00090 keybindings->insert(std::pair<unsigned char, func>('W',&EventHandler::pitchup));
00091 keybindings->insert(std::pair<unsigned char, func>('S',&EventHandler::pitchdown));
00092 keybindings->insert(std::pair<unsigned char, func>('p',&EventHandler::pause));
00093
00094 return keybindings;
00095 };
00096
00097
00098 Camera * cam;
00099 Physics * physics;
00100 GameState *state;
00101
00102 real slidespeed;
00103 real rotatespeed;
00104
00105 void slideforward() {cam->slide(0.0,0.0,-slidespeed);}
00106 void slidebackward() {cam->slide(0.0,0.0,slidespeed);}
00107 void slideleft() {cam->slide(-slidespeed,0.0,0.0);}
00108 void slideright() {cam->slide(slidespeed,0.0,0.0);}
00109 void slideup() {cam->slide(0.0,slidespeed,0.0);}
00110 void slidedown() {cam->slide(0.0,-slidespeed,0.0);}
00111 void rollleft() { cam->roll(-rotatespeed);}
00112 void rollright() {cam->roll(rotatespeed);}
00113 void yawleft() {cam ->rotate(rotatespeed);}
00114 void yawright() { cam->rotate(-rotatespeed);}
00115 void pitchup() { cam->pitch(rotatespeed);}
00116 void pitchdown() { cam->pitch(-rotatespeed);}
00117 void hitball() {
00118 state->setCurrentState(GameState::ANIMATION);
00119 Vector direction = cam->getN();
00120 physics->hitCueBall(direction,1,Vector(0.0,0.0,0.0));
00121
00122 }
00123 void incpower() {physics->increasePower();}
00124 void decpower() {physics->decreasePower();}
00125
00126 void debug() { physics->debug();}
00127 void newGame() { state->setCurrentState(GameState::NEW_GAME); }
00128 void mainMenu() { state->setCurrentState(GameState::MAIN_MENU); }
00129 void exit_() { exit(1);}
00130 void pause()
00131 { switch(state->getCurrentState())
00132 {
00133 case GameState::HIT_BALL: state->setCurrentState(GameState::PAUSE_HIT);break;
00134 case GameState::PAUSE_HIT: state->setCurrentState(GameState::HIT_BALL); break;
00135 case GameState::PAUSE_ANI: state->setCurrentState(GameState::ANIMATION); break;
00136 case GameState::ANIMATION: state->setCurrentState(GameState::PAUSE_ANI); break;
00137 default:
00138 break;
00139 }
00140 }
00141
00142
00143
00144 std::map<unsigned char, func>* activeKeyBindings;
00145 std::map<std::string,std::map<unsigned char, func>*> keyBindings;
00146
00147 public:
00148 EventHandler(Physics *physics=NULL,Camera *cam=NULL, GameState *state=NULL);
00149 virtual ~EventHandler();
00150 void processNotification(ISubject *subject);
00151 void handleKeyboardEvent(unsigned char key, int x, int y);
00152 void handleMouseEvent(int button, int state, int x, int y);
00153
00154 };
00155
00156 #endif