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

Kasenoru

Frischling

Beiträge: 79

Beruf: Softwareentwickler

  • Private Nachricht senden

11

08.04.2009, 20:13

Es ließe sich auch wie folgt lösen:

Header

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class st_input
{
public:
    ~st_input(); 

    void update(); 

    int is_pressed(int key) const; 
        
    static st_input& get_instance()
    {
        static st_input in;
        return in;
    }
private:
    st_input();
private:
    unsigned char _keys[256];
};


Source

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
st_input::st_input()
{
    memset(_keys, 0, 256);
}

st_input::~st_input()
{
}

void st_input::update()
{
    GetKeyboardState(_keys);
}

int st_input::is_pressed(int key) const
{
    return _keys[key] & 0x80;
}


Das sollte fehlerfrei funktionieren. Teste mal ob der Fehler jetzt noch immer auftritt. Was du übrigens nie vergessen darfst ist, das dein Spiel sehr schnell läuft und das, selbst wenn du eine Taste nur kurz antippst, das mehrere Tastendrücke auslöst. Eine gute Input-Klasse bietet deswegen viel mehr Methoden als die hier gezeigte, eine Methode, an.

Das ganze ließe sich natürlich noch um Mausunterstützung erweitern. Es ist dermaßen einfach gehalten, das ich auf Kommentare verzichtet habe. GetKeyboardState speichert den Status aller Tasten im übergebenen Speicherbereich. Die st_input::update Methode sollte einmal pro Frame aufgerufen werden.

Anwendungsbeispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// Innerhalb der Hauptschleife ...

st_input::get_instance().update();

if(st_input::get_instance().is_pressed(VK_SPACE))
{
    // TODO: Was immer auch passieren soll.

}

// ...


Mit freundlichen Grüßen

Kasenoru

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

12

08.04.2009, 22:05

Danke für deine Antwort, das ist mit Sicherheit eine funktionierende Alternative, aber es gibt leider keine ähnliche Möglichkeit, den Zustand des Mausrads abzufragen. Und da ich dafür also sowieso auf Nachrichten reagieren muss, wollte ich das der Einheitlichkeit wegen mit den anderen Ereignissen (Tastatur usw.) genau so regeln.

Vielleicht weiß Patrick oder jemand anderes ja noch einen Rat, um das Ganze doch über Fensternachrichten zu realisieren, ansonsten werde ich wohl auf deine Version oder sogar DirectInput zurückgreifen müssen.
;)