 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Asto JLI'ler

Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 10.06.2007, 14:29 Titel: |
|
|
Danke Fallen für den Tipp mit der Überprüfung der Keymap-Werte
Ist wohl die einfachste Methode
CPP: | void CDirectInput::getKeyboardInput(string& str, int max_len)
{
// alle Tasten der Tastatur
bool bKeyboard[256];
if(FAILED(m_lpDIDevice->GetDeviceState(sizeof(bKeyboard),(LPVOID)&bKeyboard)))
{
// Kontrolle wiederholen, falls verloren
m_lpDIDevice->Acquire();
return;
}
ProcessKeyboardInput(str, bKeyboard, max_len);
} |
CPP: | void CDirectInput::ProcessKeyboardInput(string& str, bool* bKeyboardMap, int max_len)
{
int laenge = str.length(); // Stringlänge
unsigned long CurTime = timeGetTime(); // Aktuelle Zeit in ms
// Überprüfe, ob sich ein Tastenstatus geändert hat
bool KeyChanged = false;
for(int i = 0; i < 255; i++)
{
if(bKeyboardMapOld[i] != bKeyboardMap[i])
KeyChanged = true;
bKeyboardMapOld[i] = bKeyboardMap[i];
}
// Abbrechen, wenn Zeitraum zu kurz
if ((CurTime - LastKeyPressedTime) < 150)
return;
// Wenn Tastenwechsel: Setze Zeit zurück
if(KeyChanged)
LastKeyPressedTime = CurTime;
// Wenn Backspace gedrückt, dann letztes Zeichen entfernen
if(bKeyboardMap[DIK_BACKSPACE] && laenge > 0)
{
str.erase(--str.end());
return;
}
// Klein- / Großschreibung:
// Kleine Buchstaben (ab 97)
unsigned int lower_or_upper = 97;
// Großschreibung (ab 65)
if(bKeyboardMap[DIK_LSHIFT] || bKeyboardMap[DIK_RSHIFT])
{
lower_or_upper = 65;
}
// Array überprüfen, ob 'passende' Taste gedrückt
for(int i = 0; i < 26; i++)
{
if(bKeyboardMap[Keys[i]] && laenge < max_len) // true: Änder den string
{
str += static_cast<char>(i + lower_or_upper);
return;
}
}
// Ansonsten String ohne Änderrungen
return;
} |
*erdnuss knabber*
warum eigentlich die nuss in deinem Post? Deine Signa bringt mich zum grübeln XD
Meinst du mit der Nuss das da ein Fehler drin ist!? bzw war? ^^
CPP: | // If so, reset repeat timer
if (ChangedKey)
LastKeyPressedTime = CurTime;
// abort if the time is not right
if ((CurTime - LastKeyPressedTime) < KeyRepeatTime)
return; |
muss man nämlich in der anderen reihenfolge aufrufen, sonst hat man das problem, das nur buchstaben geschrieben werden, wenn man die taste länger gedrückt hält ^^
Oder ich hab einfach
CPP: | ChangedKey = NewKeyMap[i]==OldKeyMap[i] ? ChangedKey : true; |
falsch interpretiert
habe nämlich meine probleme mit der verkürzten if-struktur, sie dient meiner meinung nach nicht der verständlichkeit :X
@Otscho, hmm hab grad mal MSDN durchsucht - geht bestimmt, nur weiss ich noch nicht wie. ist aber eine gute idee, dann hat der user seine gewohnte wartezeit ^^
Nur: Man muss es ja nicht übertreiben, ist ja nur zur Eingabe des Char-Namens *gg*
Ok... die Klasse werde ich sicher noch für andere Dinge verwenden  _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:04 Titel: |
|
|
GreatFlo hat Folgendes geschrieben: |
Oder ich hab einfach
CPP: | ChangedKey = NewKeyMap[i]==OldKeyMap[i] ? ChangedKey : true; |
falsch interpretiert
habe nämlich meine probleme mit der verkürzten if-struktur, sie dient meiner meinung nach nicht der verständlichkeit :X |
naja, das ist Genwöhnungssache; diese Art von if-abfrage (in Wahrheit ist es das nur bedingt) nennt man "ternären Operator". Die Umsetzung in if-Zweige sähe bei deinem Beispiel folgendermaßen aus: CPP: | if( NewKeyMap[i] == OldKeyMap[i] )
Changed = Changed; // also im Grunde nichts -> bleib erhalten
else
ChangedKey = true; | Du kannst das also eigtl so schreiben(wie du afaik auch oben getan hast: CPP: | if( NewKeyMap[i] != OldKeyMap[i] )
ChangedKey = true; |
btw: Abstrakt gesehen sieht die Struktur so aus: CPP: | [Abfrage] ? [wenn true] : [wenn false]
// ->
if( [Abfrage] )
[wenn true;
else
[wenn false] |
Im Grunde ist die explizite if-Abfrage vorzuziehen, da der ternäre Op. Overhead erzeugt und schwieriger zu lesen ist; weil aber der Overhead so gering ist, dass er gar nicht auffällt, kann man ihn in solchen Fällen auch gut und gern verwenden. Er hat übrigens einige interessante Eigenschaften, die für "Black C++" genutzt werden können, wens interessiert: http://www.artima.com/cppsource/foreach.html
Gruß DXer |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:15 Titel: |
|
|
DirectXer hat Folgendes geschrieben: | Du kannst das also eigtl so schreiben(wie du afaik auch oben getan hast: CPP: | if( NewKeyMap[i] != OldKeyMap[i] )
ChangedKey = true; |
|
Dann würdest du auch das Loslassen einer Taste als einen Tastendruck interpretieren.
Versuchs einmal so :
CPP: | ChangedKey[i] = ((NewKeyMap[i] == true) && (OldKeyMap[i] == false)); |
|
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:18 Titel: |
|
|
naja, ich hab ja nur das umgesetzt was GreatFlo geschrieben hat. Ich mach das in meiner engine so, dass ich 2 bool-Puffer (char geht auch) mit 256 werten in der keyboard klasse hab; einer heißt keys und einer changed. in keys wird der aktuelle zustand gespeichert und in changed, ob der zustand vom letzten frame auf den laufenden geändert wurde(also gedrückt -> losgelassen und andersrum). Das ist eine Sache der Implemenierung...
Gruß DXer |
|
Nach oben |
|
 |
Asto JLI'ler

Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:23 Titel: |
|
|
Otscho hat Folgendes geschrieben: | DirectXer hat Folgendes geschrieben: | Du kannst das also eigtl so schreiben(wie du afaik auch oben getan hast: CPP: | if( NewKeyMap[i] != OldKeyMap[i] )
ChangedKey = true; |
|
Dann würdest du auch das Loslassen einer Taste als einen Tastendruck interpretieren.
Versuchs einmal so :
CPP: | ChangedKey[i] = ((NewKeyMap[i] == true) && (OldKeyMap[i] == false)); |
|
hmm wenn ich letzteres verwende, ist die wirkung aufgehoben *kopfkratz*
sprich: 1x drücken erzeugt ohne wartezeit gleich wieder 5x den buchstaben. _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:31 Titel: |
|
|
Dann hast du etwas falsch gemacht. Normalerweiße funtzt di Variante mit den 3bool-buffern. OldKey, NewKey (im Sinne von gedrückt sein), ChangesKey (im Sinne von gedrückt werden).
Zeig mal den Codeausschnitt |
|
Nach oben |
|
 |
Asto JLI'ler

Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:34 Titel: |
|
|
aso 3 buffer ^^
ich habe meins halt nach Fallen entwickelt, also 2 Buffer + eine variable die angibt, ob sich was geändert hat
CPP: | // Überprüfe, ob sich ein Tastenstatus geändert hat
bool KeyChanged = false;
for(int i = 0; i < 255; i++)
{
KeyChanged = ((bKeyboardMap[i] == true) && (bKeyboardMapOld[i] == false));
bKeyboardMapOld[i] = bKeyboardMap[i];
} |
wäre es in kombination mit deinem tipp, KeyChanged ist jedoch kein buffer, liegt es daran? ^^
... wobei das ja eigentlich net geht *grübel*
(vollständiger restcode siehe ganz oben auf seite 3) _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 10.06.2007, 16:03 Titel: |
|
|
Also ich meinte schon die Variante mit dem ChangedKey als buffer. CPP: | for(int i = 0; i < 255; i++)
{
KeyChanged[i] = ((bKeyboardMap[i] == true) && (bKeyboardMapOld[i] == false));
bKeyboardMapOld[i] = bKeyboardMap[i];
} |
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|