Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Gestire input da tastiera
Forum - C# / VB.NET - Gestire input da tastiera

Avatar
lupodenis (Normal User)
Newbie


Messaggi: 7
Iscritto: 06/09/2013

Segnala al moderatore
Postato alle 19:20
Domenica, 25/05/2014
Come da titolo il mio problema si riferisce alla gestione degli input da tastiera, prima di porvi la domanda vi spiego qual'è l'obiettivo, a che punto sono arrivato e qual'è il problema.

Obiettivo: Controllare una macchinetta radiocomandata con un programmino scritto in c#, quindi utilizzando i tasti W, S, A, D devo fare in modo che la macchinetta si sposti in avanti o indietro e giri a sinistra o a destra, precisamente il programma deve fare questo: mentre tengo premuto il tasto W la macchinetta deve procedere avanti, quando rilascio il tasto W la macchinetta si deve fermare, stessa cosa per il tasto S tranne che la macchinetta deve procedere indietro. Se invece tengo premuto il tasto A le ruote della macchinetta devono girare verso sinistra e rimanere in quella posizione finchè non rilascio il tasto A, stessa cosa per il tasto D. Ora la parte complicata, MENTRE tengo premuto il tasto W quindi la macchinetta procede avanti, se premo il tasto A o D le ruote devono girare verso la direzione che corrisponde al tasto, quando rilascio A o D le ruote devono tornare nella loro posizione iniziale, in pratica mentre la macchinetta corre deve girare a destra e a sinistra.

Stato attuale del programma: Dopo varie ricerche in rete ho trovato il modo per gestire l'input da tastiera con KeyPress e KeyUp, ecco il codice che ho scritto per provare, in pratica mentre è premuto il tasto W il numero all'interno della textbox vieni incrementato, quando W viene rilasciato li numero torna a 0, quindi se tengo premuto S il numero viene decrementato se rilascio S il numero si azzera, invece se premo A o D nella textbox vengono scritte tante A o D.
Codice sorgente - presumibilmente C++

  1. int i = 0;
  2.         private void textBox_KeyPress(object sender, KeyPressEventArgs e)
  3.         {            
  4.             switch (e.KeyChar)
  5.             {
  6.                 case (char)119:
  7.                     {
  8.                         i++;
  9.                         e.Handled = true;
  10.                         textBox1.Text = i.ToString();
  11.                     }break;
  12.                 case (char)115:
  13.                     {
  14.                         i--;
  15.                         e.Handled = true;
  16.                         textBox1.Text = i.ToString();
  17.                     }break;
  18.                 case (char)97:
  19.                     {
  20.                         //
  21.                     }break;
  22.                 case (char)100:
  23.                     {
  24.                         //
  25.                     }break;
  26.             }
  27.         }
  28.  
  29.          private void textBox_KeyUp(object sender, KeyEventArgs e)
  30.         {
  31.             i = 0;
  32.             textBox.Text = "0";
  33.         }



Problema: Mentre tengo premuto il tasto W, il numero viene incrementato(la macchinetta va avanti) se premo il tasto A o D il numero si ferma e non viene più incrementato e nella textbox vengono scritte le A o D, quando rilascio il tasto premuto A o D ma tengo ancora premuto il tasto W il numero della text box viene azzerato come se nessun tasto sia premuto, in pratica mentre la macchinetta corre avanti quando premo A per girare a sinistra la macchinetta si ferma e le ruote girano a sinistra quindi quando rilascio A le ruote tornano nella posizione iniziale e la macchinetta sta ferma. Capisco che alla fine questo è normale ma sapete se è possibile aggirare questo problema? Nei giochi con le macchine funziona, cioè mentre la macchina corre avanti(tasto W premuto) se premo A la macchina corre e gira, c'è un modo di risolvere il problema con XNA? Non l'ho mai utilizzato e adesso sto effettuando delle ricerche. Grazie per l'attenzione e per la pazienza nel leggere questo poema, spero di esser stato chiaro :-|

Ultima modifica effettuata da lupodenis il 25/05/2014 alle 19:28
PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 19:59
Lunedì, 02/06/2014
Potresti usare le API GetAsyncKeyState(Keys Key)

per usarla devi dichiararla
Codice sorgente - presumibilmente VB.NET

  1. Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Short



poi basta usarla in un if tipo
Codice sorgente - presumibilmente C# / VB.NET

  1. If (GetAsyncKeyState(Keys.W) {
  2. //.....
  3. }


PM Quote
Avatar
lupodenis (Normal User)
Newbie


Messaggi: 7
Iscritto: 06/09/2013

Segnala al moderatore
Postato alle 11:42
Martedì, 03/06/2014
Ciao Amreo, ti ringrazio per la risposta, in realtà ormai ho risolto il problema, prima ho utilizzato XNA e funzionava tutto bene solo che per il lavoro che devo fare il timer di XNA è troppo veloce. Alla fine ho lasciato XNA e ho risolto catturando il valore del tasto premuto con
Codice sorgente - presumibilmente C# / VB.NET

  1. string Tasto = e.KeyData.ToString();

, quindi quando un tasto viene premuto e viene generato l'evento keydown modifico delle variabili boolean a seconda del tasto premuto, in seguito in un timer impostato a 150 ms, a seconda della variabile boolean che è true il programma mi esegue una determinate get HTTP. :)

PM Quote