Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 4381 was 4381, checked in by bensch, 19 years ago

orxonox/trunk: made include more local. stdincl.h not in base_object.h anymore

File size: 4.2 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   This code is inspired by Christian Meyers CommandNode code (in Orxonox v0.2.3)
16*/
17
18#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_EVENT
19
20#include "event_handler.h"
21#include "event_listener.h"
22#include "event.h"
23
24#include "ini_parser.h"
25#include "keynames.h"
26#include "compiler.h"
27#include "debug.h"
28
29using namespace std;
30
31
32/**
33   \brief standard constructor
34*/
35EventHandler::EventHandler () 
36{
37  this->setClassID(CL_EVENT_HANDLER, "EventHandler"); 
38
39  this->listeners = new EventListener**[ES_NUMBER];
40  for(int i = 0; i < ES_NUMBER; ++i)
41    this->listeners[i] = new EventListener*[EV_NUMBER];
42
43  /* now initialize them all to zero */
44  for(int i = 0; i < ES_NUMBER; ++i)
45    {
46      for(int j = 0; j < SDLK_LAST; ++j)
47        {
48          this->listeners[i][j] = NULL;
49        }
50    }
51}
52
53/**
54   \brief the singleton reference to this class
55*/
56EventHandler* EventHandler::singletonRef = NULL;
57
58/**
59   \returns a Pointer to this Class
60*/
61EventHandler* EventHandler::getInstance(void)
62{
63  if (!EventHandler::singletonRef)
64    EventHandler::singletonRef = new EventHandler();
65  return EventHandler::singletonRef;
66}
67
68/**
69   \brief standard deconstructor
70
71*/
72EventHandler::~EventHandler () 
73{
74  EventHandler::singletonRef = NULL;
75}
76
77
78
79void EventHandler::setState(elState state)
80{
81  this->state = state;
82}
83
84void EventHandler::subscribeListener(EventListener* el, elState state, int eventType)
85{
86  if( likely(this->listeners[state][eventType] == NULL))
87    this->listeners[state][eventType] = el;
88  else
89    PRINTF(0)("Someone tried to subscribe to event %i @ state %i but this event has already been subscribed\n", eventType, state);
90}
91
92
93void EventHandler::unsubscribeListener(int eventType, elState state)
94{
95  this->listeners[state][eventType] = NULL;
96}
97
98void EventHandler::flush(elState state)
99{
100  if( state == ES_ALL)
101    {
102      for(int i = 0; i < ES_NUMBER; ++i)
103        {
104          for(int j = 0; j < SDLK_LAST; ++j)
105            {
106              this->listeners[i][j] = NULL;
107            }
108        }
109    }
110  else
111    {
112      for(int j = 0; j < SDLK_LAST; ++j)
113        {
114          this->listeners[state][j] = NULL;
115        }
116    }
117}
118
119
120
121void EventHandler::process()
122{
123  SDL_Event event;
124  Event ev;
125  EventListener* listener;
126  while( SDL_PollEvent (&event))
127    {
128      switch( event.type)
129        {
130        case SDL_KEYDOWN:
131          ev.bPressed = true;
132          ev.type = event.key.keysym.sym;
133          break;
134        case SDL_KEYUP:
135          ev.bPressed = false;
136          ev.type = event.key.keysym.sym;
137          break;
138        case SDL_MOUSEMOTION:
139          ev.bPressed = false;
140          ev.type = EV_MOUSE_MOTION;
141          ev.x = event.motion.x;
142          ev.y = event.motion.y;
143          ev.xRel = event.motion.xrel;
144          ev.yRel = event.motion.yrel;
145          break;
146        case SDL_MOUSEBUTTONUP:
147          ev.bPressed = false;
148          ev.type = EV_MOUSE_BUTTON;
149          break;
150        case SDL_MOUSEBUTTONDOWN:
151          ev.bPressed = true;
152          ev.type = EV_MOUSE_BUTTON;
153          break;
154        case SDL_JOYAXISMOTION:
155          ev.bPressed = false;
156          ev.type = EV_JOY_AXIS_MOTION;
157          break;
158        case SDL_JOYBALLMOTION:
159          ev.bPressed = false;
160          ev.type = EV_JOY_BALL_MOTION;
161          break;
162        case SDL_JOYHATMOTION:
163          ev.bPressed = false;
164          ev.type = EV_JOY_HAT_MOTION;
165          break;
166        case SDL_JOYBUTTONDOWN:
167          ev.bPressed = true;
168          ev.type = EV_JOY_BUTTON;
169          break;
170        case SDL_JOYBUTTONUP:
171          ev.bPressed = true;
172          ev.type = EV_JOY_BUTTON;
173          break;
174        default:
175          break;
176        }
177
178      /* small debug routine: shows alle events dispatched by the event handler */
179      PRINT(0)("\n==========================| EventHandler::process () |===\n");
180      PRINT(0)("=  Got Event nr%i\n, for state %i", event.type, this->state); 
181     
182      listener = this->listeners[this->state][event.key.keysym.sym];
183      if( listener != NULL)
184        {
185          listener->process(ev);
186          PRINTF(0)("=  Event dispatcher msg: This event has been consumed\n");
187        }
188      else
189        {
190          PRINTF(0)("=  Event dispatcher msg: This event has NOT been consumed\n");
191        }
192
193      PRINT(0)("=======================================================\n");     
194    }
195}
Note: See TracBrowser for help on using the repository browser.