Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/util/event/event_handler.cc @ 4407

Last change on this file since 4407 was 4407, checked in by patrick, 19 years ago

orxonox/trunk: event management now runs with new event-handler: no chance to kill current game without killall…

File size: 5.0 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Patrick Boenzli
13   co-programmer:
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_EVENT
17
18#include "event_handler.h"
19
20#include "event_listener.h"
21#include "event.h"
22#include "key_mapper.h"
23
24#include "compiler.h"
25#include "debug.h"
26
27using namespace std;
28
29
30/**
31   \brief standard constructor
32*/
33EventHandler::EventHandler () 
34{
35  this->setClassID(CL_EVENT_HANDLER, "EventHandler"); 
36
37  this->listeners = new EventListener**[ES_NUMBER];
38  for(int i = 0; i < ES_NUMBER; ++i)
39    this->listeners[i] = new EventListener*[EV_NUMBER];
40
41  /* now initialize them all to zero */
42  for(int i = 0; i < ES_NUMBER; ++i)
43    {
44      for(int j = 0; j < SDLK_LAST; ++j)
45        {
46          this->listeners[i][j] = NULL;
47        }
48    }
49  this->state = ES_GAME;
50}
51
52
53/**
54   \brief the singleton reference to this class
55*/
56EventHandler* EventHandler::singletonRef = NULL;
57
58
59/**
60   \returns a Pointer to this Class
61*/
62EventHandler* EventHandler::getInstance(void)
63{
64  if (!EventHandler::singletonRef)
65    EventHandler::singletonRef = new EventHandler();
66  return EventHandler::singletonRef;
67}
68
69
70/**
71   \brief standard deconstructor
72
73*/
74EventHandler::~EventHandler () 
75{
76  EventHandler::singletonRef = NULL;
77  delete this->keyMapper;
78}
79
80
81
82void EventHandler::init()
83{
84  this->keyMapper = new KeyMapper();
85  this->keyMapper->loadKeyBindings();
86}
87
88
89
90void EventHandler::setState(elState state)
91{
92  this->state = state;
93}
94
95
96void EventHandler::subscribe(EventListener* el, elState state, int eventType)
97{
98  PRINTF(0)("Subscribing event type: %i\n", eventType);
99  if( state == ES_ALL )
100    {
101      for(int i = 0; i < ES_NUMBER; ++i)
102        if( likely(this->listeners[state][eventType] == NULL))
103          this->listeners[i][eventType] = el;
104        else
105          PRINTF(0)("Someone tried to subscribe to event %i @ state %i but this event has already been subscribed\n", eventType, state);
106    }
107  else 
108    if( likely(this->listeners[state][eventType] == NULL))
109      {
110        this->listeners[state][eventType] = el;
111      }
112    else
113      PRINTF(0)("Someone tried to subscribe to event %i @ state %i but this event has already been subscribed\n", eventType, state);
114}
115
116
117void EventHandler::unsubscribe(int eventType, elState state)
118{
119  PRINTF(0)("Unsubscribing event type nr: %i\n", eventType);
120  this->listeners[state][eventType] = NULL;
121}
122
123void EventHandler::flush(elState state)
124{
125  if( state == ES_ALL)
126    {
127      for(int i = 0; i < ES_NUMBER; ++i)
128        {
129          for(int j = 0; j < SDLK_LAST; ++j)
130            {
131              this->listeners[i][j] = NULL;
132            }
133        }
134    }
135  else
136    {
137      for(int j = 0; j < SDLK_LAST; ++j)
138        {
139          this->listeners[state][j] = NULL;
140        }
141    }
142}
143
144
145
146void EventHandler::process()
147{
148  SDL_Event event;
149  Event ev;
150  EventListener* listener = NULL;
151  while( SDL_PollEvent (&event))
152    {
153      switch( event.type)
154        {
155        case SDL_KEYDOWN:
156          ev.bPressed = true;
157          ev.type = event.key.keysym.sym;
158          break;
159        case SDL_KEYUP:
160          ev.bPressed = false;
161          ev.type = event.key.keysym.sym;
162          break;
163        case SDL_MOUSEMOTION:
164          ev.bPressed = false;
165          ev.type = EV_MOUSE_MOTION;
166          ev.x = event.motion.x;
167          ev.y = event.motion.y;
168          ev.xRel = event.motion.xrel;
169          ev.yRel = event.motion.yrel;
170          break;
171        case SDL_MOUSEBUTTONUP:
172          ev.bPressed = false;
173          ev.type = event.button.button + SDLK_LAST;
174          break;
175        case SDL_MOUSEBUTTONDOWN:
176          ev.bPressed = true;
177          ev.type = event.button.button + SDLK_LAST;
178          break;
179        case SDL_JOYAXISMOTION:
180          ev.bPressed = false;
181          ev.type = EV_JOY_AXIS_MOTION;
182          break;
183        case SDL_JOYBALLMOTION:
184          ev.bPressed = false;
185          ev.type = EV_JOY_BALL_MOTION;
186          break;
187        case SDL_JOYHATMOTION:
188          ev.bPressed = false;
189          ev.type = EV_JOY_HAT_MOTION;
190          break;
191        case SDL_JOYBUTTONDOWN:
192          ev.bPressed = true;
193          ev.type = EV_JOY_BUTTON;
194          break;
195        case SDL_JOYBUTTONUP:
196          ev.bPressed = true;
197          ev.type = EV_JOY_BUTTON;
198          break;
199        default:
200          break;
201        }
202
203      /* small debug routine: shows alle events dispatched by the event handler */
204      PRINT(0)("\n==========================| EventHandler::process () |===\n");
205      PRINT(0)("=  Got Event nr %i, for state %i", ev.type, this->state); 
206     
207      listener = this->listeners[this->state][ev.type];
208      if( listener != NULL)
209        {
210          PRINTF(0)("=  Event dispatcher msg: This event has been consumed\n");
211          listener->process(ev);
212        }
213      else
214        {
215          PRINTF(0)("=  Event dispatcher msg: This event has NOT been consumed\n");
216        }
217
218      PRINT(0)("=======================================================\n");     
219    }
220}
221
222
223void EventHandler::test()
224{
225  PRINT(0)("\n==========================| EventHandler::test () |===\n"); 
226  PRINT(0)("Eventhandler init successfuly\n");
227  KeyMapper km;
228  PRINT(0)("KeyMapper loaded\n");
229  km.loadKeyBindings();
230  km.debug();
231
232  PRINT(0)("=======================================================\n");     
233}
Note: See TracBrowser for help on using the repository browser.