Domanda

Sono un po di scrivere un po 'di motore di gioco - semplicemente per capire come funzionano dall'interno. Io attualmente non voglio fare confusione con OpenGL o DirectX, quindi mi attengo a disegnare su un controllo con GDI + e tutta quella roba WinForms.

Ovviamente, ho bisogno di gestire l'input. Più in particolare, gli eventi di tastiera. Questo, tuttavia, pone un problema:

protected override void OnKeyDown(KeyEventArgs e)
{
    Trace.WriteLine(string.Format("KD {0:hh:MM:ss.fff} {1}", 
        DateTime.Now, e.KeyCode));
}

Questo codice (anche con il più breve ritardo di ripetizione impostato nel applet Tastiera nel Pannello di controllo) yeilds seguente:

KD 10:02:18.318 Right
KD 10:02:18.570 Right
KD 10:02:18.598 Right
KD 10:02:18.639 Right
KD 10:02:18.667 Right
KD 10:02:18.701 Right

Come si può vedere, c'è un 0,25 sec. ritardo tra primi due eventi. Questo si traduce in movimenti lenti di oggetti sullo schermo, ovviamente. Prima si sposta leggermente verso destra, poi si ferma per un momento notevole, e quindi continua

Come posso risolvere questo problema? questo può essere fatto in WinForms puri o devo andare DirectInput (o qualsiasi altra cosa è il modo kosher al giorno d'oggi?) percorso?

È stato utile?

Soluzione

Utilizzando messaggi di Windows non è il modo migliore per andare per l'interazione di ingresso.
Non so niente di WinForms, ma suppongo su eventi chiave utilizzano i messaggi.

Ho usato DirectInput (v7) molti anni fa, ed è stato veramente veloce.
Forse GetKeyboardState o GetAsyncKeyState in un ciclo di gioco sono buone alternative.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top