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
RevLine 
[4329]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:
[4346]12   main-programmer: Patrick Boenzli
13   co-programmer:
[4329]14*/
15
[4346]16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_EVENT
[4329]17
[4346]18#include "event_handler.h"
[4388]19
[4350]20#include "event_listener.h"
[4361]21#include "event.h"
[4388]22#include "key_mapper.h"
[4329]23
[4381]24#include "compiler.h"
25#include "debug.h"
[4352]26
[4329]27using namespace std;
28
29
30/**
31   \brief standard constructor
32*/
[4346]33EventHandler::EventHandler () 
[4329]34{
[4352]35  this->setClassID(CL_EVENT_HANDLER, "EventHandler"); 
[4350]36
[4352]37  this->listeners = new EventListener**[ES_NUMBER];
38  for(int i = 0; i < ES_NUMBER; ++i)
[4365]39    this->listeners[i] = new EventListener*[EV_NUMBER];
[4355]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    }
[4407]49  this->state = ES_GAME;
[4329]50}
51
[4407]52
[4329]53/**
54   \brief the singleton reference to this class
55*/
[4346]56EventHandler* EventHandler::singletonRef = NULL;
[4329]57
[4407]58
[4329]59/**
60   \returns a Pointer to this Class
61*/
[4346]62EventHandler* EventHandler::getInstance(void)
[4329]63{
[4346]64  if (!EventHandler::singletonRef)
65    EventHandler::singletonRef = new EventHandler();
66  return EventHandler::singletonRef;
[4329]67}
68
[4407]69
[4329]70/**
71   \brief standard deconstructor
72
73*/
[4346]74EventHandler::~EventHandler () 
[4329]75{
[4346]76  EventHandler::singletonRef = NULL;
[4407]77  delete this->keyMapper;
[4352]78}
[4329]79
[4352]80
81
[4407]82void EventHandler::init()
83{
84  this->keyMapper = new KeyMapper();
85  this->keyMapper->loadKeyBindings();
86}
87
88
89
[4354]90void EventHandler::setState(elState state)
91{
92  this->state = state;
93}
94
[4407]95
[4405]96void EventHandler::subscribe(EventListener* el, elState state, int eventType)
[4354]97{
[4406]98  PRINTF(0)("Subscribing event type: %i\n", eventType);
[4407]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);
[4354]114}
115
116
[4405]117void EventHandler::unsubscribe(int eventType, elState state)
[4355]118{
[4406]119  PRINTF(0)("Unsubscribing event type nr: %i\n", eventType);
[4355]120  this->listeners[state][eventType] = NULL;
121}
[4354]122
[4364]123void EventHandler::flush(elState state)
[4355]124{
[4364]125  if( state == ES_ALL)
[4355]126    {
[4364]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    {
[4355]137      for(int j = 0; j < SDLK_LAST; ++j)
138        {
[4364]139          this->listeners[state][j] = NULL;
[4355]140        }
141    }
142}
143
144
145
146void EventHandler::process()
147{
148  SDL_Event event;
[4361]149  Event ev;
[4407]150  EventListener* listener = NULL;
[4355]151  while( SDL_PollEvent (&event))
152    {
153      switch( event.type)
154        {
155        case SDL_KEYDOWN:
[4361]156          ev.bPressed = true;
[4362]157          ev.type = event.key.keysym.sym;
[4355]158          break;
159        case SDL_KEYUP:
[4362]160          ev.bPressed = false;
161          ev.type = event.key.keysym.sym;
[4355]162          break;
163        case SDL_MOUSEMOTION:
[4363]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;
[4355]170          break;
171        case SDL_MOUSEBUTTONUP:
[4363]172          ev.bPressed = false;
[4406]173          ev.type = event.button.button + SDLK_LAST;
[4355]174          break;
175        case SDL_MOUSEBUTTONDOWN:
[4363]176          ev.bPressed = true;
[4406]177          ev.type = event.button.button + SDLK_LAST;
[4355]178          break;
179        case SDL_JOYAXISMOTION:
[4363]180          ev.bPressed = false;
181          ev.type = EV_JOY_AXIS_MOTION;
182          break;
[4355]183        case SDL_JOYBALLMOTION:
[4363]184          ev.bPressed = false;
185          ev.type = EV_JOY_BALL_MOTION;
186          break;
[4355]187        case SDL_JOYHATMOTION:
[4363]188          ev.bPressed = false;
189          ev.type = EV_JOY_HAT_MOTION;
190          break;
[4355]191        case SDL_JOYBUTTONDOWN:
[4363]192          ev.bPressed = true;
193          ev.type = EV_JOY_BUTTON;
194          break;
[4355]195        case SDL_JOYBUTTONUP:
[4363]196          ev.bPressed = true;
197          ev.type = EV_JOY_BUTTON;
[4355]198          break;
199        default:
200          break;
201        }
[4362]202
[4364]203      /* small debug routine: shows alle events dispatched by the event handler */
[4366]204      PRINT(0)("\n==========================| EventHandler::process () |===\n");
[4407]205      PRINT(0)("=  Got Event nr %i, for state %i", ev.type, this->state); 
[4364]206     
[4407]207      listener = this->listeners[this->state][ev.type];
[4365]208      if( listener != NULL)
209        {
[4407]210          PRINTF(0)("=  Event dispatcher msg: This event has been consumed\n");
[4365]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");     
[4355]219    }
220}
[4388]221
222
223void EventHandler::test()
224{
225  PRINT(0)("\n==========================| EventHandler::test () |===\n"); 
226  PRINT(0)("Eventhandler init successfuly\n");
[4398]227  KeyMapper km;
[4388]228  PRINT(0)("KeyMapper loaded\n");
[4398]229  km.loadKeyBindings();
230  km.debug();
[4388]231
232  PRINT(0)("=======================================================\n");     
233}
Note: See TracBrowser for help on using the repository browser.