JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

char an string anhängen + tipppause
Gehe zu Seite Zurück  1, 2, 3
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 10.06.2007, 14:29    Titel: Antworten mit Zitat

Danke Fallen für den Tipp mit der Überprüfung der Keymap-Werte Smile
Ist wohl die einfachste Methode Very Happy
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 Rolling Eyes
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 Very Happy
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.06.2007, 15:04    Titel: Antworten mit Zitat

GreatFlo hat Folgendes geschrieben:

Oder ich hab einfach
CPP:
ChangedKey = NewKeyMap[i]==OldKeyMap[i] ? ChangedKey : true;

falsch interpretiert Rolling Eyes
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 10.06.2007, 15:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.06.2007, 15:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 10.06.2007, 15:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 10.06.2007, 15:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 10.06.2007, 15:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 10.06.2007, 16:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3
Seite 3 von 3

 
Gehe zu:  
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

Impressum