|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 127
|
[C] getch che non blocca
Salve a tutti, non capisco per quale motivo questa getch sia non bloccante e tutti i valori vadano a finire sul case default. Ora incollo la parte del codice interessata.
Codice:
while (in_esecuzione)
{
//pos_nave.x += SPOSTAMENTO_NAVE; /*sposta a sinistra la nave*/
pos_nave.vita +=1;
/*invia il dato alla funzione controllo i dati che indicano la nuova posizione della nave*/
scrivi_su_buffer(pos_nave);
//fflush(stdin);
/* input da tastiera*/
fflush(stdin);
switch(c = getch())
{
case TASTO_USCITA:
/*scrivi sul buffer (accedendo tramite l'opportuno mutex e verificando se vi
siano posizioni disponibili per la scrittura)relativo alla comunicazione con
controllo i dati che indicano che il giocatore ha scelto di uscire dal
gioco*/
pos_niente.tipo = USCITA;
in_esecuzione = false;/*esci dal ciclo esterno e quindi fai finire il thread*/
break;
/*se si preme la freccia sinistra la nave si sposta a sinistra*/
case SINISTRA:
/*se la nave è in una posizione dello schermo dove può stare*/
if(pos_nave.x > DISTANZA_DAI_LATI)
pos_nave.x -= SPOSTAMENTO_NAVE; /*sposta a sinistra la nave*/
scrivi_su_buffer(pos_nave);
break;
/*se si preme la freccia destra la nave si sposta a destra*/
case DESTRA:
/*se la nave è in una posizione dello schermo dove può stare*/
if(pos_nave.x < MAXX-DISTANZA_DAI_LATI)
pos_nave.x += SPOSTAMENTO_NAVE;/*sposta a destra la nave*/
scrivi_su_buffer(pos_nave);
break;
default:
sleep(1);
pos_nave.x -= SPOSTAMENTO_NAVE;
}
}
__________________
the AUSTRALOPITECI |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Piuttosto le costanti SINISTRA/DESTRA sono per le frecce della tastiera??? I tasti "speciali" (Fxx, frecce, page up/down, ecc...) vengono ottenuti tramite una sequenza di 2 codici, il cui primo valore è 0 oppure 224 e il secondo un codice particolare. Quindi serve una sequenza di 2 getch() per usare tali tasti.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 127
|
si esatto sono le frecce direzionali. Il fatto è che pero' va sempre nel case di default senza premere nessun tasto. Sto debuggando e mi sa proprio che la getch ritorna un -1 quindi c'è un errore ma mi sembra giustissimo il codice...
__________________
the AUSTRALOPITECI |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ripeto che per i tasti speciali c'è una sequenza particolare composta da 2 codici, quindi un modo corretto di gestire tali tasti è il seguente:
Codice:
#include <stdio.h>
#include <conio.h>
int main (void)
{
int ch, end = 0;
while (!end)
{
ch = getch ();
switch (ch)
{
case 0x00:
case 0xE0:
ch = getch ();
switch (ch)
{
case 0x4B:
printf ("Freccia sinistra\n");
break;
case 0x4D:
printf ("Freccia destra\n");
break;
}
break;
case 0x1B: /* ESC */
printf ("ESC\n");
end = 1;
break;
}
}
return 0;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:44.




















