Oppure

Loading
25/05/14 17:20
lupodenis
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.
int i = 0;
        private void textBox_KeyPress(object sender, KeyPressEventArgs e)
        {            
            switch (e.KeyChar)
            {
                case (char)119:
                    {
                        i++;
                        e.Handled = true;
                        textBox1.Text = i.ToString();
                    }break;
                case (char)115:
                    {
                        i--;
                        e.Handled = true;
                        textBox1.Text = i.ToString();
                    }break;
                case (char)97:
                    {
                        //
                    }break;
                case (char)100:
                    {
                        //
                    }break;
            }
        }

         private void textBox_KeyUp(object sender, KeyEventArgs e)
        {
            i = 0;
            textBox.Text = "0"; 
        }


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 25/05/14 17:28
aaa
02/06/14 17:59
amreo
Potresti usare le API GetAsyncKeyState(Keys Key)

per usarla devi dichiararla
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Short


poi basta usarla in un if tipo
If (GetAsyncKeyState(Keys.W) {
//.....
}
aaa
03/06/14 9:42
lupodenis
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
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. :)
aaa