Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/event/key_mapper.cc @ 9822

Last change on this file since 9822 was 9406, checked in by bensch, 18 years ago

orxonox/trunk: merged the proxy back

merged with commandsvn merge -r9346:HEAD https://svn.orxonox.net/orxonox/branches/proxy .

no conflicts

File size: 8.4 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
[4864]25#include "globals.h"
[5944]26#include "parser/ini_parser/ini_parser.h"
[7256]27#include "util/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
34
[9406]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[] = {
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},
[8724]86  {&KeyMapper::PEV_JUMP,                 "Jump",                             SDLK_SPACE},
[4386]87
[7661]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
[7661]93  {&KeyMapper::PEV_CHANGE_SHIP,          CONFIG_NAME_PLAYER_CHANGE_SHIP,     SDLK_g},
[4410]94
[6998]95
[7661]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
[7661]103  {&KeyMapper::PEV_NEXT_WORLD,           CONFIG_NAME_NEXT_WORLD,             SDLK_x},
104  {&KeyMapper::PEV_PREVIOUS_WORLD,       CONFIG_NAME_PREV_WORLD,             SDLK_z},
[4582]105
[7661]106  {&KeyMapper::PEV_PAUSE,                CONFIG_NAME_PAUSE,                  SDLK_p},
107  {&KeyMapper::PEV_QUIT,                 CONFIG_NAME_QUIT,                   SDLK_ESCAPE},
108  {NULL, "", 0}
[4833]109};
[4400]110
111
[4452]112
[4367]113/**
[4836]114 *  standard constructor
[4367]115*/
[4582]116KeyMapper::KeyMapper ()
[4367]117{
[4582]118   this->setClassID(CL_KEY_MAPPER, "KeyMapper");
[4367]119}
120
121
122/**
[4836]123 *  standard deconstructor
[4367]124*/
[4582]125KeyMapper::~KeyMapper ()
[4367]126{
127}
[4369]128
[4452]129
[4369]130/**
[4836]131 *  loads new key bindings from a file
132 * @param filename: The path and name of the file to load the bindings from
[4369]133*/
[7221]134void KeyMapper::loadKeyBindings (const std::string& fileName)
[4369]135{
[4866]136  IniParser parser(fileName);
137  this->loadKeyBindings(&parser);
138}
[4582]139
[4866]140void KeyMapper::loadKeyBindings(IniParser* iniParser)
141{
[7661]142  if( !iniParser->getSection (CONFIG_SECTION_CONTROL))
[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
[5936]149  iniParser->firstVar();
[7256]150  while( iniParser->getCurrentName() != "" )
[4866]151  {
[7677]152    PRINTF(3)("Keys: Parsing %s, %s now.\n", iniParser->getCurrentName().c_str(), iniParser->getCurrentValue().c_str());
[5474]153    // map the name to an sdl index
[5014]154    index = nameToIndex (iniParser->getCurrentValue());
[5474]155    // map the index to a internal name
156    this->mapKeys(iniParser->getCurrentName(), index);
[5015]157    iniParser->nextVar();
[4866]158  }
[4369]159
160
161  // PARSE MISC SECTION
[7661]162//   if( !iniParser->getSection (CONFIG_SECTION_MISC_KEYS))
163//   {
164//     PRINTF(1)("Could not find key bindings" CONFIG_SECTION_MISC_KEYS "\n");
165//     return;
166//   }
167//
168//   iniParser->firstVar();
169//   while( iniParser->getCurrentName() != "" )
170//   {
171//     PRINTF(3)("MISC: Parsing %s, %s now.\n", iniParser->getCurrentName(), iniParser->getCurrentValue());
172//     index = nameToIndex (iniParser->getCurrentValue());
173//     this->mapKeys(iniParser->getCurrentName(), index);
174//     iniParser->nextVar();
175//   }
[4369]176}
[4386]177
[7256]178void KeyMapper::loadKeyBindings()
179{
[7661]180  if( !Preferences::getInstance()->sectionExists(CONFIG_SECTION_CONTROL))
[7256]181  {
[7661]182    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_CONTROL "\n");
[7256]183    return;
184  }
185  int* index;
186
[7661]187  std::list<std::string> keys = Preferences::getInstance()->listKeys(CONFIG_SECTION_CONTROL);
[7256]188  for ( std::list<std::string>::const_iterator it = keys.begin(); it!=keys.end(); it++ )
189  {
[7661]190    PRINTF(3)("Keys: Parsing %s, %s now.\n", it->c_str(), Preferences::getInstance()->getString(CONFIG_SECTION_CONTROL, *it, "").c_str());
[7256]191    // map the name to an sdl index
[7661]192    index = nameToIndex (Preferences::getInstance()->getString(CONFIG_SECTION_CONTROL, *it, ""));
[7256]193    // map the index to a internal name
194    this->mapKeys(*it, index);
195  }
196}
197
[4452]198/**
[4836]199 *  this function looks up name to key index
200 * @param the name of the button
[4452]201*/
[7221]202int* KeyMapper::nameToIndex (const std::string& name)
[4386]203{
204  coord[0] = -1;
205  coord[1] = -1;
206  int c;
[5474]207  if( (c = keynameToSDLK (name)) != -1) {
[4386]208      coord[1] = c;
209      coord[0] = 0;
210    }
[5474]211  if( (c = buttonnameToSDLB (name)) != -1) {
[4386]212      coord[1] = c;
213      coord[0] = 1;
214    }
215  return coord;
216}
[4389]217
218
[4452]219/**
[4836]220 *  the function maps name to key ids
221 * @param name of the key
222 * @param id of the key
[4452]223*/
[7221]224void KeyMapper::mapKeys(const std::string& name, int* index)
[4399]225{
[5474]226  for( int i = 0; map[i].pValue != NULL; ++i )
[4399]227    {
[7221]228      if( name == map[i].pName)
[4582]229      {
[5474]230        if( index[0] == 0)
[5915]231        {
[5474]232          *map[i].pValue = index[1];
[7677]233          PRINTF(4)("Mapping %s to '%s' (id %i)\n", name.c_str(), SDLKToKeyname(index[1]).c_str(), index[1]);
[5474]234          break;
[5915]235        }
236        else {
[5474]237          *map[i].pValue = index[1];
[7677]238          PRINTF(4)("Mapping %s to '%s' (id %i)\n", name.c_str(), SDLBToButtonname(index[1]).c_str(), index[1]);
[5474]239          break;
[5915]240        }
[4582]241      }
[4399]242    }
243}
244
245
[4452]246/**
[4836]247 *  this function gives some debug information about the key mapper class
[4452]248*/
[4389]249void KeyMapper::debug()
250{
[4582]251  PRINT(0)("\n==========================| KeyMapper::debug() |===\n");
[4403]252  for(int i = 0; map[i].pValue != NULL; ++i)
253    {
[7661]254      PRINT(0)("%s = %i\n",map[i].pName.c_str(), *map[i].pValue);
[4403]255    }
[4582]256  PRINT(0)("=======================================================\n");
[4389]257}
Note: See TracBrowser for help on using the repository browser.