|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
[C++] Cerco funzione simile a getch()
Ciao, ho bisogno di una funzione che mi catturi un carattere da tastiera come getch(), ma non deve mettere in pausa il computer:
Io tengo la funzione in ascolto per x tempo e se non è stato premuto niente va avanti. Cosa posso usare? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non esiste nelle funzioni standard del C e del C++
Devi usare le librerie del sistema operativo (le funzioni per la console delle Win32 API, o delle system call di Linux o qualche libreria portabile come ncurses). |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Un piccolo accenno?
Sono abbastanza niubbo, nel programma ho incluso conio2, windows, stdlib e iostream. Cosa dovrei aggiungere e che funzione uso? |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non so cosa sia questa conio2...lì non c'è ?
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Lasciando da parte conio2 (che comunque è la versione aggiornata del conio.h) come posso fare per utilizzare una funzione simile a getch()?
#include <...> while (gli uccelli cantano) { a=funzione; } ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Bisogna un po' lavorarci, non è una cosa così immediata.
Prova a vedere se hai curses.h...ti dovrebbe includere già una funzione chiamata getch. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Comunque leggendo il tuo primo post...getch mette in "pausa" il computer...è kbhit della conio.h che controlla se un tasto è o meno disponibile.
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Comunque curses.h non ce l'ho... |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 384
|
NO L'INCUBO CONTINUA!!!!!!!!!!!!!!!!
scusate non ho resistito ![]() mi sono trovato anche io in questa situazione solo che io non dovevo fare lo snake ma un gioco di nuova concezione elaborato dal nostro prof di laboratorio dopo anni di meditazione spirituale e purificazione, per dover di cronaca il gioco era il tiro al bersaglio ![]() Codice:
do { do { //operazioni da eseguire e da stoppare quando si preme il tasto } while (kbhit() == 0); //ciclo che termina quando si preme UN tasto tasto=getch(); //che tatso si è premuto? } while (tasto != <codice ascii tasto>); Ultima modifica di xblitz : 20-01-2008 alle 13:33. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma kbhit l'hai preso dalla conio.h
![]() Andare a leggere lo stato del buffer di input con le API Win32 non è una cosa semplice ![]() Ultima modifica di cionci : 20-01-2008 alle 13:58. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Ci va vicino, ma mi serve all'incontrario:
Questo esegue le operazioni e poi controlla la pressione di un tasto. Ma con uno sleep in mezzo dovrei tenerlo premuto. A me serve che è sempre in ascolto tranne che per un breve momento in cui termina il ciclo, esegue le operazioni e ricomincia il ciclo. Per ora l'ho lasciato senza movimento automatico (il serpente si sposta solo se pigi i tasti). |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
while(1) { If(kbhit()) c = getch(); sleep(300); //valore per regolare la velocità if(ho_perso) break; } |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 384
|
Andare a leggere lo stato del buffer di input con le API Wind2 non è una cosa semplice
![]() non metto in dubbio che sia una cosa complicata, io per semplice intendevo qualcosa del tipo "una funzione da mettere al volo e via"... |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
kbhit() cosa fa?
Una mezza specie di getch()? |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
MITTICU!!!
Ho risolto così: Codice:
#include <time.h> int ms=1000, delay; delay= ms + clock(); do { if (kbhit()) c=getch(); } while (delay > clock()); |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No...assolutamente no, non fa quello che dici.
Se anche un tasto viene premuto per 1 ms kbhit lo mette in coda e ritorna 1. Non puoi gestire il tempo in cui il tasto resta premuto se non con metodi molto più complessi. |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Oo a me funziona...
Considerando che il ciclo do-while si ripete ogni ciclo di clock del processore (nanosecondi) tu premi un tasto per almeno 50ms, quindi esegui qualche migliaio di volte il ciclo, in quei momenti c assume il valore del tasto premuto. Il ciclo continua a funzionare anche dopo che hai premuto il tasto finchè delay non è == a clock(). A quel punto esce dal ciclo ed esegue il resto. |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non funziona perché non ti misura per quanto tempo è premuto il tasto...se in quel secondo premo 20 tasti lui li legge tutti.
Il ciclo corretto per dimensionare la ripetizione dei tasti in un gioco del genere è questo: Codice:
while(1) { If(kbhit()) c = getch(); while(kbhit()) getch(); //scarta tutti i tasti premuti oltre al primo sleep(300); //valore per regolare la velocità if(ho_perso) break; } |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:05.