Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/cleanup/src/lib/event/key_mapper.cc @ 10593

Last change on this file since 10593 was 10571, checked in by bensch, 18 years ago

cleaned out unused defs files, and moved glincl to grafics, alincl.h to sound

File size: 8.5 KB
RevLine 
[4582]1/*
[4367]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
[4388]13   co-programmer: Christian Meyer
[4582]14
[4388]15   This code was inspired by the command_node.cc code from Christian Meyer in revision
16   4386 and earlier.
[4367]17*/
18
19#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_EVENT
20
[4386]21#include "key_mapper.h"
[4367]22
[5915]23#include "event_def.h"
24
[10571]25#include "orxonox_globals.h"
[5944]26#include "parser/ini_parser/ini_parser.h"
[9869]27#include "parser/preferences/preferences.h"
[4400]28#include "key_names.h"
[7661]29#include "event_def.h"
[5075]30#include "debug.h"
[4386]31
[5915]32
[4367]33
[9869]34ObjectListDefinition(KeyMapper);
[4367]35
[4452]36/* initialize all variables to a reasonable value*/
[6997]37int KeyMapper::PEV_FORWARD           = EV_UNKNOWN;
38int KeyMapper::PEV_BACKWARD          = EV_UNKNOWN;
[4452]39int KeyMapper::PEV_LEFT              = EV_UNKNOWN;
40int KeyMapper::PEV_RIGHT             = EV_UNKNOWN;
[6998]41int KeyMapper::PEV_UP                = EV_UNKNOWN;
42int KeyMapper::PEV_DOWN              = EV_UNKNOWN;
[5978]43int KeyMapper::PEV_ROLL_LEFT         = EV_UNKNOWN;
44int KeyMapper::PEV_ROLL_RIGHT        = EV_UNKNOWN;
[4452]45int KeyMapper::PEV_STRAFE_LEFT       = EV_UNKNOWN;
46int KeyMapper::PEV_STRAFE_RIGHT      = EV_UNKNOWN;
[8724]47int KeyMapper::PEV_JUMP              = EV_UNKNOWN;
[4386]48
[4452]49int KeyMapper::PEV_FIRE1             = EV_UNKNOWN;
50int KeyMapper::PEV_FIRE2             = EV_UNKNOWN;
51int KeyMapper::PEV_PREVIOUS_WEAPON   = EV_UNKNOWN;
52int KeyMapper::PEV_NEXT_WEAPON       = EV_UNKNOWN;
[4386]53
[6998]54int KeyMapper::PEV_CHANGE_SHIP       = EV_UNKNOWN;
55
[4452]56int KeyMapper::PEV_VIEW0             = EV_UNKNOWN;
57int KeyMapper::PEV_VIEW1             = EV_UNKNOWN;
58int KeyMapper::PEV_VIEW2             = EV_UNKNOWN;
59int KeyMapper::PEV_VIEW3             = EV_UNKNOWN;
60int KeyMapper::PEV_VIEW4             = EV_UNKNOWN;
[4582]61int KeyMapper::PEV_VIEW5             = EV_UNKNOWN;
[4386]62
[4452]63int KeyMapper::PEV_NEXT_WORLD        = EV_UNKNOWN;
64int KeyMapper::PEV_PREVIOUS_WORLD    = EV_UNKNOWN;
[4386]65
[4452]66int KeyMapper::PEV_PAUSE             = EV_UNKNOWN;
67int KeyMapper::PEV_QUIT              = EV_UNKNOWN;
[4386]68
[4410]69
70
[4452]71//! this is the mapping array from names to ids: enter all orxonox.conf keys here
[4833]72/** @todo use globals.h for this.... everything is done there for those Options,
[4834]73 * and you do not have to care about The namings, as they might change
[4833]74 */
[7661]75KeyMapper::KeyMapping KeyMapper::map[] = {
[9880]76      {&KeyMapper::PEV_FORWARD,              CONFIG_NAME_PLAYER_FORWARD,         SDLK_w},
77      {&KeyMapper::PEV_BACKWARD,             CONFIG_NAME_PLAYER_BACKWARD,        SDLK_s},
78      {&KeyMapper::PEV_UP,                   CONFIG_NAME_PLAYER_UP,              SDLK_r},
79      {&KeyMapper::PEV_DOWN,                 CONFIG_NAME_PLAYER_DOWN,            SDLK_f},
80      {&KeyMapper::PEV_LEFT,                 CONFIG_NAME_PLAYER_LEFT,            SDLK_a},
81      {&KeyMapper::PEV_RIGHT,                CONFIG_NAME_PLAYER_RIGHT,           SDLK_d},
82      {&KeyMapper::PEV_ROLL_RIGHT,           CONFIG_NAME_PLAYER_ROLL_LEFT,       SDLK_z},
83      {&KeyMapper::PEV_ROLL_LEFT,            CONFIG_NAME_PLAYER_ROLL_RIGHT,      SDLK_c},
84      {&KeyMapper::PEV_STRAFE_LEFT,          "StrafeLeft",                       SDLK_q},
85      {&KeyMapper::PEV_STRAFE_RIGHT,         "StrafeRight",                      SDLK_e},
86      {&KeyMapper::PEV_JUMP,                 "Jump",                             SDLK_SPACE},
[4386]87
[9880]88      {&KeyMapper::PEV_FIRE1,                CONFIG_NAME_PLAYER_FIRE,            EV_MOUSE_BUTTON_LEFT},
89      {&KeyMapper::PEV_FIRE2,                "Fire2",                            EV_MOUSE_BUTTON_RIGHT},
90      {&KeyMapper::PEV_NEXT_WEAPON,          CONFIG_NAME_PLAYER_NEXT_WEAPON,     EV_MOUSE_BUTTON_WHEELUP},
91      {&KeyMapper::PEV_PREVIOUS_WEAPON,      CONFIG_NAME_PLAYER_PREV_WEAPON,     EV_MOUSE_BUTTON_WHEELDOWN},
[4412]92
[9880]93      {&KeyMapper::PEV_CHANGE_SHIP,          CONFIG_NAME_PLAYER_CHANGE_SHIP,     SDLK_g},
[4410]94
[6998]95
[9880]96      {&KeyMapper::PEV_VIEW0,                CONFIG_NAME_VIEW0,                  SDLK_1},
97      {&KeyMapper::PEV_VIEW1,                CONFIG_NAME_VIEW1,                  SDLK_2},
98      {&KeyMapper::PEV_VIEW2,                CONFIG_NAME_VIEW2,                  SDLK_3},
99      {&KeyMapper::PEV_VIEW3,                CONFIG_NAME_VIEW3,                  SDLK_4},
100      {&KeyMapper::PEV_VIEW4,                CONFIG_NAME_VIEW4,                  SDLK_5},
101      {&KeyMapper::PEV_VIEW5,                CONFIG_NAME_VIEW5,                  SDLK_6},
[4410]102
[9880]103      {&KeyMapper::PEV_NEXT_WORLD,           CONFIG_NAME_NEXT_WORLD,             SDLK_x},
104      {&KeyMapper::PEV_PREVIOUS_WORLD,       CONFIG_NAME_PREV_WORLD,             SDLK_z},
[4582]105
[9880]106      {&KeyMapper::PEV_PAUSE,                CONFIG_NAME_PAUSE,                  SDLK_p},
107      {&KeyMapper::PEV_QUIT,                 CONFIG_NAME_QUIT,                   SDLK_ESCAPE},
108      {NULL, "", 0}
109    };
[4400]110
111
[4452]112
[4367]113/**
[4836]114 *  standard constructor
[4367]115*/
[4582]116KeyMapper::KeyMapper ()
[4367]117{
[9869]118  this->registerObject(this, KeyMapper::_objectList);
[4367]119}
120
121
122/**
[4836]123 *  standard deconstructor
[4367]124*/
[4582]125KeyMapper::~KeyMapper ()
[9880]126{}
[4369]127
[4452]128
[4369]129/**
[4836]130 *  loads new key bindings from a file
131 * @param filename: The path and name of the file to load the bindings from
[4369]132*/
[7221]133void KeyMapper::loadKeyBindings (const std::string& fileName)
[4369]134{
[4866]135  IniParser parser(fileName);
136  this->loadKeyBindings(&parser);
137}
[4582]138
[4866]139void KeyMapper::loadKeyBindings(IniParser* iniParser)
140{
[9880]141  IniParser::Section* section = iniParser->getSection (CONFIG_SECTION_CONTROL);
142  if( section == NULL)
[4866]143  {
[7661]144    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_CONTROL "\n");
[4866]145    return;
146  }
[4369]147  int* index;
[4582]148
[9880]149
150  for(IniParser::Entry::iterator entry = section->begin();
151      entry != section->end();
152      ++entry)
[4866]153  {
[9880]154    PRINTF(3)("Keys: Parsing %s, %s now.\n", (*entry).name().c_str(), (*entry).value().c_str());
[5474]155    // map the name to an sdl index
[9880]156    index = nameToIndex ((*entry).value());
[5474]157    // map the index to a internal name
[9880]158    this->mapKeys((*entry).name(), index);
[4866]159  }
[4369]160
161
162  // PARSE MISC SECTION
[9880]163  //   if( !iniParser->getSection (CONFIG_SECTION_MISC_KEYS))
164  //   {
165  //     PRINTF(1)("Could not find key bindings" CONFIG_SECTION_MISC_KEYS "\n");
166  //     return;
167  //   }
168  //
169  //   iniParser->firstVar();
170  //   while( iniParser->getCurrentName() != "" )
171  //   {
172  //     PRINTF(3)("MISC: Parsing %s, %s now.\n", iniParser->getCurrentName(), iniParser->getCurrentValue());
173  //     index = nameToIndex (iniParser->getCurrentValue());
174  //     this->mapKeys(iniParser->getCurrentName(), index);
175  //     iniParser->nextVar();
176  //   }
[4369]177}
[4386]178
[7256]179void KeyMapper::loadKeyBindings()
180{
[7661]181  if( !Preferences::getInstance()->sectionExists(CONFIG_SECTION_CONTROL))
[7256]182  {
[7661]183    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_CONTROL "\n");
[7256]184    return;
185  }
186  int* index;
187
[7661]188  std::list<std::string> keys = Preferences::getInstance()->listKeys(CONFIG_SECTION_CONTROL);
[7256]189  for ( std::list<std::string>::const_iterator it = keys.begin(); it!=keys.end(); it++ )
190  {
[7661]191    PRINTF(3)("Keys: Parsing %s, %s now.\n", it->c_str(), Preferences::getInstance()->getString(CONFIG_SECTION_CONTROL, *it, "").c_str());
[7256]192    // map the name to an sdl index
[7661]193    index = nameToIndex (Preferences::getInstance()->getString(CONFIG_SECTION_CONTROL, *it, ""));
[7256]194    // map the index to a internal name
195    this->mapKeys(*it, index);
196  }
197}
198
[4452]199/**
[4836]200 *  this function looks up name to key index
201 * @param the name of the button
[4452]202*/
[7221]203int* KeyMapper::nameToIndex (const std::string& name)
[4386]204{
205  coord[0] = -1;
206  coord[1] = -1;
207  int c;
[9880]208  if( (c = keynameToSDLK (name)) != -1)
209  {
210    coord[1] = c;
211    coord[0] = 0;
212  }
213  if( (c = buttonnameToSDLB (name)) != -1)
214  {
215    coord[1] = c;
216    coord[0] = 1;
217  }
[4386]218  return coord;
219}
[4389]220
221
[4452]222/**
[4836]223 *  the function maps name to key ids
224 * @param name of the key
225 * @param id of the key
[4452]226*/
[7221]227void KeyMapper::mapKeys(const std::string& name, int* index)
[4399]228{
[5474]229  for( int i = 0; map[i].pValue != NULL; ++i )
[9880]230  {
231    if( name == map[i].pName)
[4399]232    {
[9880]233      if( index[0] == 0)
[4582]234      {
[9880]235        *map[i].pValue = index[1];
236        PRINTF(4)("Mapping %s to '%s' (id %i)\n", name.c_str(), SDLKToKeyname(index[1]).c_str(), index[1]);
237        break;
[4582]238      }
[9880]239      else
240      {
241        *map[i].pValue = index[1];
242        PRINTF(4)("Mapping %s to '%s' (id %i)\n", name.c_str(), SDLBToButtonname(index[1]).c_str(), index[1]);
243        break;
244      }
[4399]245    }
[9880]246  }
[4399]247}
248
249
[4452]250/**
[4836]251 *  this function gives some debug information about the key mapper class
[4452]252*/
[4389]253void KeyMapper::debug()
254{
[4582]255  PRINT(0)("\n==========================| KeyMapper::debug() |===\n");
[4403]256  for(int i = 0; map[i].pValue != NULL; ++i)
[9880]257  {
258    PRINT(0)("%s = %i\n",map[i].pName.c_str(), *map[i].pValue);
259  }
[4582]260  PRINT(0)("=======================================================\n");
[4389]261}
Note: See TracBrowser for help on using the repository browser.