Hi Leute,
Ich habe vor kurzen ein Spiel fertiggestellt.
Allerdings reagiert das Spiel auf manchen PCs nichtauf die Tastatureingabe.
Jetzt stellt sich bei mir die Frage:"Woran kann das liegen?"
Es kann ja kein Fehler vom Programmcode sein, oder?
Falls es etwas hilft, das Spiel hab ich mit Irrlicht erstellt.
Ich hab einen Receiver von den dem Irrlichtreceiver abgeleitet.
Die Tasten werden in einer std::map gespeichert (Tastenname und Zustand).
Wird eine Taste gedrückt, wird die entsprechende Taste in der std::map gesucht
und ihr Zustand entsprechend verändert
Die Zustände sind:
Pressed - Taste wurde gerade erst gedrückt
Down - Taste wird über längeren Zeitraum gedrückt
Released- Taste wurde gerade losgelassen
Up - Taste wird nicht gedrückt
Damit die States von Released zu Up und von Pressed zu Down wechseln ruft
das Spiel in jeden Frame UpdateKeyStates() auf.
Hier der relevante Quellcode(falls es doch daran liegen sollte):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
bool CEventReceiver::OnEvent(const SEvent& event)
{
//Tastenevent abfragen
if (event.EventType == irr::EET_KEY_INPUT_EVENT)
{
std::map<irr::EKEY_CODE,eKeyState>::iterator i;
for(i = m_KeyMap.begin();i != m_KeyMap.end();i++)
{
if(i->first == event.KeyInput.Key)
i->second=ChangeKeyState(i->second,event);
}
return true;
}
return false;
}
eKeyState CEventReceiver::ChangeKeyState(eKeyState keystate,const irr::SEvent &event)
{
//Wenn die Taste gedrückt ist...
if(event.KeyInput.PressedDown == true)
{
//Prüfen ob sie vorher losgelassen wurde...
if(keystate == UP || keystate == RELEASED)
keystate = PRESSED;
else
keystate = DOWN;
}
else //Wenn sie nicht gedrückt wurde
{
if(keystate == PRESSED || keystate == DOWN)
keystate = RELEASED; else keystate = UP;
}
return keystate;
}
void CEventReceiver::UpdateKeyStates()
{
std::map<irr::EKEY_CODE,eKeyState>::iterator i;
for(i = m_KeyMap.begin();i != m_KeyMap.end();i++)
{
if(i->second == PRESSED)
i->second = DOWN;
else if(i->second == RELEASED)
i->second = UP;
}
}
|