DirectInput: Ich bekomm die Kriese....
-
so, die funktion soll ein True zurück liefer wenn z.B. die Space taste losgelassen wurde. so lange wie gedrückt wird und net gedrückt wird soll false zurück kommen, aber es soll nur ein true zurück kommen WENN der letzte Frame das letzte mal den selben DIK_CODE hatte wie der davor, aber jetzt nen anderen hat oder gar keinen.
ne OnKeyUp funktion halt so nach dem Prinzip.
-
so, wie du es geschrieben hast, würde das aber nur funktionieren, wenn immer nur eine Taste gedrückt wird -> ich würde da wenn schon, das komplette array speichern.
Ist die Instanz von CInput static oder global?
-
noch global wollte sie aber static machen
-
Achso, der Fehler hätte ja auch bei Dinput liegen können, deshalb die Frage
Du hast nen Denkfehler : Deine Funktion kann nur dann true zurückgeben, wenn die Leertaste (z.B.) runtergedrückt ist. Das geht doch dann gar nicht so wie du es möchtest ....
Edit : ohoh, da war ich aber vieeel zu spät
[ Dieser Beitrag wurde am 23.02.2003 um 14:26 Uhr von Headhunter editiert. ]
-
ich möchte doch nur das sie in dem einen frame wo die Taste losgelassen wird true zurück liefert!
Das muss doch irgendwie gehen! Bei anderen spielen wird das doch 100% auch so gemacht, oder?
-
Du prüfst ja auch nur, wie der vorherige Zustand war, wenn die Taste derzeit gedrückt ist. Du müsstest deine Bedingung aber so formulieren, dass du im Falle, dass die Taste ist nicht gedrückt ist prüfst, ob sie dies im Frame zuvor war
-
ja aber wie macht man das?!?! Könntet ihr mir bitte bitte etwas Psoido-code geben?
Ich bin mit meinem Latein total am ende
-
Bin mir net sicher, aber probiers mal so:
this->m_oldKeyBuffer = m_KeyBuffer; // oder wie kopiert man das komplett? :confused: if (!(this->m_KeyBuffer[DIK_CODE] & 0x80) && (this->m_oldKeyBuffer[DIK_CODE] & 0x80)) { return true; } else return false;
Ist nicht ausprobiert, aber irgendwie so in der Art
-
will net
-
Hast du zum Kopieren des Array mal memcpy probiert?
Ansonsten zum Ausprobieren einfach 2 x GetDeviceState aufrufen
Wie genau sieht denn das "will net" aus?
-
"will net" sieht so aus: es passiert gar nix
memcopy hab ich grad auch ausprobiert, und will auch net
-
Uops, das mit this->m_oldKeyBuffer = m_KeyBuffer; bzw. memcpy muss natürlich hinter dem if-Block stehten, also probier mal das hier:
if (!(this->m_KeyBuffer[DIK_CODE] & 0x80) && (this->m_oldKeyBuffer[DIK_CODE] & 0x80)) { ret_val = true; } else ret_val = false; this->m_oldKeyBuffer = m_KeyBuffer; // oder memcpy, bin grad net sicher return ret_val;
[ Dieser Beitrag wurde am 23.02.2003 um 16:49 Uhr von flenders editiert. ]
-
was ist ret_val?
-
Hi,
ich habs jetzt mal so nach deinem Beispiel gemacht:
bool CInput::IsKeyUp (int DIK_CODE) { CLog *p_Protokoll; p_Protokoll = CLog::getInstance (); if(FAILED(this->m_Keyboard->GetDeviceState(sizeof(this->m_KeyBuffer), (LPVOID)&this->m_KeyBuffer))) { p_Protokoll->writeText ("DirectInput : ERROR : Konnte die Tastatur nicht abfragen.\n"); return (false); } if (!(this->m_KeyBuffer[DIK_CODE] & 0x80) && (this->m_oldKeyBuffer[DIK_CODE] & 0x80)) { return (true); } else { return (false); } // this->m_oldKeyBuffer = m_KeyBuffer; // oder memcpy, bin grad net sicher memcpy (this->m_oldKeyBuffer, this->m_KeyBuffer, 256); return (false); }
funzt net *schnief* :(:(
-
Hab meinen Code von vorhin nochmals korigiert! ret_val ist eine Variable vom Typ bool. Ich habe sie eingeführt, um das Problem vom deinem Code zu lösen: Durch deine return s wird memcpy nie aufgerufen D.h. du musst den Aufruf von memcpy vor return im if-else Block aufrufen, oder eben eine Hilfsvariable einführen
-
[ Dieser Beitrag wurde am 23.02.2003 um 17:12 Uhr von Ikari editiert. ]