Newsgroup: it.comp.programmare
Titolo: rilevare pressione delle frecce della tastiera

Ciao!
Devo rilevare la pressione delle 4 frecce direzionali della tastiere
per un gioco sotto DOS!
Uso borland C++ builder X e penso che la "conio" sia al caso mio! Ma la
documentazione è veramente scarsa..
Vi ringrazio anticipatamente
Patrizio

 Ma la documentazione è veramente scarsa..
Documentazione scarsa? Boh... se ti serve qualcosa basato su 
conio.h prova questo:
int main(int argc, char* argv[])
{
    int esci = 0;
    char ch;
    while (!esci)
    {
        if (kbhit())
        {
            ch = getch();
            if (ch == 0x1B)
                esci = 1;
            else if (ch == 0x00)
            {
                ch = getch();
                switch(ch)
                {
                    case 'K':
                        printf("Sinistra\n");
                        break;
                    case 'H':
                        printf("Alto\n");
                        break;
                    case 'P':
                        printf("Basso\n");
                        break;
                    case 'M':
                        printf("Destra\n");
                        break;
                    default:
                        printf("Non gestito\n");
                        break;
                }
            }
        }
    }
    return 0;
}
HTH,
Steve. 

Ciao!
Il codice che mi hai mandato compila ed è funzionante! Ti ringrazio
della disponibilità! L'unico problema è che volevo intercettare la
pressione delle 4 frecce direzionali della tastiera e la getch() non è
adatta allo scopo perchè non riesce a memorizzare il codice di
scansione (ma solo quello ascii che rimane 0 per tutti i tasti non
mappati). Forse non devo usare una variabile di tipo char?
Gasperi Patrizio
ps. Invece la kbhit() si accorge della pressione delle frecce
Steve Aletto ha scritto:


             }
Steve. 

Quel "pezzo" non rileva certo la pressione delle frecce! Certo che l'
ho provato! Sia con "visual c++" che con "borland cbuilderX". Non
riesce neanche a rilevare la pressione dei tasti che hai specificato
nei case del costrutto switch dato che ci entri solo se ch == 0! E se
premi una delle 4 letter (K, H, P, M) sicuramente la variabile "ch" non
varrà 0 (lo salta il costrutto switch)!! Hai debuggato no?
Comunque grazie dell'aiuto..
Gasperi Patrizio
P.s che ambiente di sviluppo usi?
Steve Aletto ha scritto:


 varrà 0 (lo salta il costrutto switch)!!
Non hai capito proprio come funziona... mi verrebbe voglia di 
inviarti l'eseguibile...
Per curiosità, stai premendo le frecce sul tastierino numerico?
Steve. 

No, le frecce normali!  ...e non funziona :( spegami meglio

> No, le frecce normali!  ...e non funziona :( spegami meglio
C'č cosě poco da spiegare... quando si preme una "freccia"
l'applicazione legge due tasti: il primo con valore 0 ed il
secondo che dipende dalla freccia. Le lettere che ho utilizzato
io corrispondono proprio, guarda caso, alle quattro frecce.
Secondo me non stai utilizzando esattamente e solo il codice che
ho postato io.
Steve.
P.S.: il quoting per favore! 

 ho postato io.
Si invece , forse usiamo librerie diverse?
Patrizio

 Compilo con visual c++ ed includo la "conio.h" e la "stdio.h"
Da una breve ricerca sembra sia un problema noto di VisualC++: 
http://support.microsoft.com/kb/q168912/
.
Comunque, con due minuti di debug avresti scoperto tu stesso che 
la riga
            else if (ch == 0x00)
va cambiata con
            else if ((ch == 0x00) || (ch == -32))
oppure con
            else if ((ch == 0x00) || (ch == (char)0xE0))
e dovrebbe funzionare.
Steve. 

 e dovrebbe funzionare.
Grandioso! Grazie mille!
Avevo notato che la getch() restituiva -32 ma ero dubbioso sul
costrutto switch che si basava su quei 4 caratteri (che se ho ben
capito corrispondono al codice di scansione delle 4 frecce).
Ora funziona!
Quello che non ho capito è come fà la getch() (che viene praticamente
chiamata 2 volte) a rilevare prima il valore -32 e poi successivamente
uno dei 4 caratteri..
Patrzio

 uno dei 4 caratteri..
Beh, quello è per design, non credo ci siano molte spiegazioni e 
non mi porrei il problema. Comunque è abbastanza semplice 
intuirne il motivo, 256 valori non bastano per definire tutte le 
combinazioni di tasti, quindi c'è questo sistema per verificare 
anche combinazioni "extended". Dai un'occhiata qui, poi se vuoi 
approfondisci tu il discorso:
http://support.microsoft.com/default.aspx?scid=kb;en-us;57888
Steve.