Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.02.2010, 16:40

Kapitel 4 - Tastatureingaben

Hallöchen zusammen =)

Ich bin heute morgen im Buch and der Stelle angekommen, an der man die Tastatureingaben nichtmehr mit GetAsyncKeyState(), sondern mit einem LPDIRECTINPUTDEVICE8 abfangen soll.

So mein Problem ist es, dass ich an der Stelle:

C-/C++-Quelltext

1
2
3
4
5
6
7
for(int a=0; a < 256; a++)
{
    if(aKey[a] & 0x80)
    {
        sprintf(desc, "%d", a);
    }
}


Immer 255 für a rauskrieg....
wenn ich a < 55 schreibe (zum Test) steht dann halt 55 da.

Ich nutze den Kram NICHT in einer normalen Dialoganwenung mit CALLBACK-Funktion, sondern in einem "Game" (meinetwegen das Programm aus Kapitel 3 mit der Skybox und dem Wasser).

So ich glaube, dass liegt daran, dass man beim g_pKeyboard->SetCooperativeLevel( als ersten Parameter das Window, für das dieses Device gilt angeben muss.... und man bekommt das Handle nirgends her (ich habs mit tbDirect3D::Instance().GetWindow() probiert und es geht nicht).

In dem Bespielprogrammen zum Theme Input aus dem Buch werden dooferweise immer nur normale Anwendungen behandelt und da kriegt man das HWND handle von der CALLBACK-funktion und kanns weiterreichen (wenns daran liegen sollte).

Ich poste noch eben fix den Code und bedanke mich schonma für die Hilfe!!!!!!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tbResult Input::initKeyboard()
{
    if(FAILED(this->pDirectInput->CreateDevice(GUID_SysKeyboard, &this->pKeyboard, NULL)))
        return TB_ERROR;

    if(FAILED(this->pKeyboard->SetDataFormat(&c_dfDIKeyboard)))
        return TB_ERROR;

    if(FAILED(this->pKeyboard->SetCooperativeLevel(tbDirect3D::Instance().GetWindow(),
                                                   DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)))
        return TB_ERROR;

    return TB_OK;
}


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
tbResult Input::updateKeyboardState()
{
    BYTE    aKey[256];  // Array von Tastenwerten

    char    desc[256];  // Text für das Dialogfeld

    HRESULT r;

    // Daten abfragen

    r = pKeyboard->GetDeviceState(256, aKey);
    if(r == DIERR_INPUTLOST)
    {
        // Zugriff verloren - erneut versuchen

        pKeyboard->Acquire();
    }

    if(FAILED(r))
    {
        return TB_ERROR;
    }

    strcpy(desc, "");
    for(int a=0; a < 256; a++)
    {
        if(aKey[a] & 0x80)
        {
            sprintf(desc, "%d", a);
        }

    }

    font->Begin();
//HIER STEHT IMMER 255 -.-

    font->DrawTextA(tbVector2(5.0f, 50.0f), desc);
    font->End();

2

03.02.2010, 17:24

Was erwartest du denn von diesem Code?

C-/C++-Quelltext

1
2
3
4
5
6
7
for(int a=0; a < 256; a++)
{
    if(aKey[a] & 0x80)
    {
        sprintf(desc, "%d", a);
    }
} 


Der macht doch genau das, was er tun soll!?
Den Wert von 'a' (0-255) ausgeben... :roll:

Und irgendein Fenster braucht das "Game" auch.
Also dürfte es kein Problem sein, dessen Handle zu ermitteln oder irgendwo abzulegen.

3

03.02.2010, 17:48

solange a kleiner ist als 256 wenn a aber 256 ist es ja gleich also muss 255 rauskommen
Metal ist keine Musik sondern eine Religion.

4

03.02.2010, 21:39

ja ich hab verstanden, dass der bis 255 zählt und den Wert dann übernimmt, aber im Buch steht halt dass der nur die Werte übernimmt, die man gerade drückt...

Sprich wenn ich A drücke steht da 30 (geraten).
wenn ich A und B drücke steht da 30 31
und da dort immer 255 steht, egal was man drückt muss ja iwas nicht ganz klar sein. Die Bytes im array werden aufs erste Bit geprüft (0x80) und wenn der von 0 - 255 alles übernehmen würde hieße das ja, dass alle Tasten aktiv sind oder hab ich das ganze Beispiel komplett falsch verstanden ?

5

03.02.2010, 21:41

Zitat von »"Simon T"«

ja ich hab verstanden, dass der bis 255 zählt und den Wert dann übernimmt, aber im Buch steht halt dass der nur die Werte übernimmt, die man gerade drückt...

Sprich wenn ich A drücke steht da 30 (geraten).
wenn ich A und B drücke steht da 30 31
und da dort immer 255 steht, egal was man drückt muss ja iwas nicht ganz klar sein. Die Bytes im array werden aufs erste Bit geprüft (0x80) und wenn der von 0 - 255 alles übernehmen würde hieße das ja, dass alle Tasten aktiv sind oder hab ich das ganze Beispiel komplett falsch verstanden ?



UPDATE: achja ich hab überbrigens die Zielen

C-/C++-Quelltext

1
2
if(FAILED(r))
         return TB_ERROR;


auskommentiert, da diese Abfrage immer zutrifft zur Laufzeit, was ich auch nicht ganz verstanden habe

6

04.02.2010, 14:11

Na dann klappt da was nicht. Das kann man nicht einfach ignorieren ;)
Metal ist keine Musik sondern eine Religion.

7

04.02.2010, 15:33

Jou, das schlägt anscheinend schon fehl:

C-/C++-Quelltext

1
r = pKeyboard->GetDeviceState(256, aKey); 


Aquire sollte in der Init-Funktion zuförderst noch aufgerufen werden.

8

05.02.2010, 11:30

Nr 1 .. .jetzt klappts danke dir =)

Werbeanzeige