Newsgroup: it.comp.lang.c
Titolo: gestione input da tastiera....

Salve a tutti
sono un novizio del c e volevo chiedervi una cosa....:)
Sto facendo un giochino ( grafica BGI ), pong, una specie di "tennis" 
dove ci sono due barre mobili ai lati dello schermo e una pallina che 
rimbalza, dove prendo in input da tastiera la direzione di movimento di 
ogni barra. per farlo catturo l'evento della pressione da tastiera con 
kbhit, poi con un
tasto=getch();
distinguo il tasto schiacciato. Il problema è che non riesco a fare in 
modo che possano muoversi contemporaneamente le due barre; ( esempio 
quando un utente preme un pulsante per muoversi, e l'altro poco dopo fa 
lo stesso, sarà solo il secondo giocatore a muoversi, e il primo si ferma )
Spero che possiate aiutarmi....;))
ciao e grazie.

 ciao e grazie.
Ciao acetone,
scrivi che rilevi la pressione di un tasto con kbhit. Che cos'e' ?
In seguito utilizzi tasto=getch()
non potresti usare getch() e basta? se temi che ti blocchi l'app.,
gestiscila in un thread.
Inoltre la getch da che libreria la prendi? Ncurses o conio ?
In ogni caso qui sei OT (solo ANSI)
Ciao,
Riccardo
-- 
-=Riccardo Galli=-
 _,e.
s~  ``
 ~@.   ideralis Programs
.   ol 
 `**~  
http://www.sideralis.net

 vede se è stato skiacciato un pulsante da tastiera
ma perche' tutti scrivono con le 'k'appa e si sentono fighi?!?
Ti serve una funzione differente!
kbhit() ti dice solo se un tasto e' stato premuto o meno.
getch() ti dice solo l'ultimo carattere premuto.
Queste due funzioni non gestiranno mai in modo appropriato il caso in cui
due tasti della tastiera vengono premuti contemporaneamente.
Su questo NG sei completamente OT!
Posta su di un NG relativo al sistema operativo che usi....
ad esempio se e' windows la soluzione piu' semplice, non la migliore, e'
dare una occhiata a funzioni quali:
GetAsyncKeyState(), GetKeyboardState(), etc....
Ma per questo dovresti chiedere informazioni su it.comp.programmare.win32
Tommy

 cosa vuol dire solo ansi :)??
argh :)
Esiste una libreria standard in C, che ti da' la sicurezza che se alcuni
#include andranno sempre a buon fine.
Per esempio stdio.h fa parte della libreria standard, dove lo standard e'
ANSI.
Quindi programmare in ANSI C significa  programmare utilizzando solo la
libreria standard (il che consente di scrivere programmi portabili)
La funzione getch, per esempio, non e' ANSI. so che c'e' almeno in
ncurses.h e conio.h.
kbhit pure non e' ansi, e non la conosco.
Su che OS stai programmando ?
Puoi scrivere gli include ?
e magari le righe di codice in cui gestisci la ricezione dei caratteri?


 Immaginavo, ma da dove lo tiri fuori?
Con il VC++6 si trova in conio.h di piu' non so dirti!
Tommy

> cosa vuol dire solo ansi :)??
Leggiti il manifesto del gruppo.
--
---------------------------------------------------
There are 10 kinds of people in the world:
those who understand binary, and those who don't
---------------------------------------------------

Guarda riccardo ti posto tutto il codice tanto sn all' inizio + o - . :)
il s.o. è Win98
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <dos.h>
#include <graphics.h>
void prepara()
{
   /*questa funzione prepara la schermata del gioco*/
   cleardevice();
   setcolor(WHITE);
   line(0,0,639,0);
   line(639,0,639,479);
   line(639,479,0,479);
   line(0,479,0,0);
   line(318,0,318,479);
   setfillstyle(SOLID_FILL,BLUE);
   /*le coordinate dei due punti per il disegno dei rettangoli
     sono diverse per problemi di gestione della scheda grafica*/
   bar(620,220,630,260);
   bar(8,220,18,260);
   setbkcolor(GREEN);
}
int movimenti(int tasto,int x,int y)
{                  /*gestisco i vari casi di pressione dei tasti*/
       if(tasto==75 | tasto==97)
	if(y!=5)
	{
	  setfillstyle(SOLID_FILL,GREEN);
	  bar(x,y,x+10,y+40);
	  setfillstyle(SOLID_FILL,BLUE);
	  y=y-5;
	  bar(x,y,x+10,y+40);
	}
       if(tasto==77 | tasto==100)
	if(y!=475-40)
	{
	  setfillstyle(SOLID_FILL,GREEN);
	  bar(x,y,x+10,y+40);
	  setfillstyle(SOLID_FILL,BLUE);
	  y=y+5;
	  bar(x,y,x+10,y+40);
	}
   return y;
}
int inizio()
{
   int a;
   int gdriver=DETECT, gmode;
   initgraph (&gdriver, &gmode,"c:\\tc\\bgi");
   setbkcolor(RED);
   setcolor(YELLOW);
   outtextxy(40,210,"Scrivi 1 per giocare contro il computer, 2 per 
giocare a due giocatori");
   a=0;
   for(;;)
   {
     if(kbhit)
     {
       a=getch();
       if(a==49 | a==50)
	break;
     }
   }
   return a;
}
main()
{
   int tasto;
   int risposta;
   int xa,ya,xb,yb;
   xa=620;
   ya=220;
   xb=8;
   yb=220;
   risposta=inizio();
   prepara();
   for(;;)
   {
     if(kbhit)
     {
       tasto=getch();
       if(tasto<90)
	  ya=movimenti(tasto,xa,ya);
       else if(tasto>90)
	yb=movimenti(tasto,xb,yb);
     }
    /*delay(5);*/
   }
   getch();
   return 0;
} 

 #include <graphics.h>
ok, sei completamente OT.
spostati su
it.comp.os.programmare.win32
consiglio: per recuperare il carattere premuto leggi sempre tutto il
buffer della tastiera


acetone ha scritto:

Qualche anno passato mi si era creata la necessità di poter premere diversi
tasti comtemporaneamente e avevo risolto il problema utilizzando i vari tasti
ctrl e alt ( io dovevo rilevare per quanti ms rimanevano premuti in varie
combinazioni ) e per fare tutto questo mi ero affidato all' assembler, ti
consiglio di dare una occhiata alla lista interrupt di Brown e con pochissime
righe di codice credo risolverai il problema...
P.S il mio discorso vale se stai usando processore 8086 e dos, anche se qualche
post sopra hai specificato di lavorare in win98 ho l'impressione che tu stia
utilizzando il Turbo c per dos...
Salutoni a tutti Dave.

In ogni caso qui sei OT (solo ANSI)
Perņ aiutatemi un attimo a interpretare il manifesto di questo
posto... "qualsiasi dialetto del C, in modo particolare ...". Che si
intende per dialetti?
by LjL
ljl...@tiscalinet.it


Da come ho interpretato io il Manifesto non mi sembra che Acetone sia
OT, anche se :
" Il gruppo trattera` di qualsiasi dialetto del linguaggio C, in modo
particolare del vecchio K&R e di quello specificato dall'istituto
americano ANSI come standard "ANSI X3.159-1989 ",
nel senso che si parlera in particolare di ANSI ma non esclusivamente...
Salutoni a tutti Dave.

 del c sò ben poco...:)
Guarda stasera quando torno a casa butto un occhio sul mio vecchio codice, se lo
trovo,  e magari domani lo posto quì anche se è una fuzione c con dentro qualche riga
di asm, sperando che nessuno si arrabbi per l' OT, comunque datti una occhiata al
servizio 02 dell' int16, quì trovi la porzione di lista che ti serve:
(
http://www-2.cs.cmu.edu/~ralf/interrupt-list/inter61a.zip
), e poi recupera lo stao
dei tasti lshift, rshift, ctrl e alt per spostare le due "racchette"... Ciao a tutti
e scusate se un pochino OT ma non posso postare in privato...
Dave.

 Salutoni a tutti Dave.
mmm,
non so neanch'io per certo cosa si intenda per dialetti, ma non credo che
rientri l'utilizzo di librerie che non appartengono a nessuno standard
Forse per "dialetti" si intendo librerie conformi a, chesso', POSIX ?
Se qualcuno ne sa qualcosa...faccia sapere.


 Sto facendo un giochino ( grafica BGI ), pong, una specie di "tennis"
Prova, invece di utilizzare la grafica BGI, a dare un'occhiata alle librerie
SDL.
http://www.libsdl.org/index.php
Ciao
Vincenzo

 > del c sò ben poco...:)
Rieccomi quì, ciao a tutti, il codice che avevo scritto non lo trovo più :-( ma comunque
a grandi linee ti riporto queste poche righe di codice che dovrebbero permetterti di
premere contemporaneamente i 4 tasti definiti...
#include <stdio.h>
#include <conio.h>
#define SHIFT_DX 1
#define SHIFT_SX 2
#define CTRL     4
#define ALT      8
char GetKeyStat(void);
int main(void)
{
  char vret;
  clrscr();                  //Funzione non ANSI per pulire lo schermo
  while(!kbhit())         // funzione non ANSI controlla se un tasto viene premuto
   {
     vret=GetKeyStat();
     gotoxy(1,1);        // funzione non ANSI che posiziona il cursore
     printf("%d \n",vret & SHIFT_DX);
     printf("%d \n",(vret & SHIFT_SX) >> 1);
     printf("%d \n",(vret & CTRL)  >> 2);
     printf("%d ",(vret & ALT) >> 3);
   }
  return 0;
}
char GetKeyStat(void)
{
  char lb;
  asm {
            mov ah,0x12;
            int 0x16;
            mov lb,al;
        }
  return lb;
}
non ho testato il codice ( dovrebbe stampare degli zeri per i tasti alzati e degli uno se
premuti ) , al massimo ti va in pappa il pc :-), scusate ancora se non proprio IT e spero
che ti possa essere utile... Ciao a Tutti Dave.
P.S Le porzioni di codice segnalate come non ANSI possono essere utilizzate solo con il
compilatore Turbo C della borland e processori della famiglia 8086 di conseguenza il
codice riportato non è portabile...

Grazie Dave, il programma che mi hai postato funziona correttamente....=)
pensi che si potrebbe fare lo stesso con ctrl,shift e 2 freccette?
purtroppo non ho capito bene il codice, ti sarei grato se potessi risp. 
a un paio d domandine :)
1- come lavora qesta funzione, cioè il che valore assume alla fine( poi 
il codice assembly lo guardetò da solo semmai :)
char GetKeyStat(void)
 > {
 >   char lb;
 >   asm {
 >             mov ah,0x12;
 >             int 0x16;
 >             mov lb,al;
 >         }
 >   return lb;
 > }
2- se vret è un char come mai ci metti %d? poi...nn capisco casa 
significa ">> 1".....:(
ultima cosa....dove hai preso SHIFT_DX,CTRL ecc? e come mai fai
vret & CTRL,vret & ALT ecc.?
scusa la mia ignoranza ma a scuola non ci insegnano nulla...;)
ciao e grazie!!!
        printf("%d \n",vret & SHIFT_DX);
 >      printf("%d \n",(vret & SHIFT_SX) >> 1);
 >      printf("%d \n",(vret & CTRL)  >> 2);
 >      printf("%d ",(vret & ALT) >> 3);


  > }
Sto giro mi uccidono per l' OT ;-) vi prego scusatemi..., ti riporto la desrizione del servizio
2 dell' int 16
INT 16 - KEYBOARD - GET SHIFT FLAGS
AH = 02h
Return: AL = shift flags (see #00582)
AH destroyed by many BIOSes
SeeAlso: AH=12h,AH=22h,INT 17/AH=0Dh,INT 18/AH=02h,MEM 0040h:0017h
Bitfields for keyboard shift flags:
Bit(s) Description (Table 00582)
 7 Insert active
 6 CapsLock active
 5 NumLock active
 4 ScrollLock active
 3 Alt key pressed (either Alt on 101/102-key keyboards)
 2 Ctrl key pressed (either Ctrl on 101/102-key keyboards)
 1 left shift key pressed
 0 right shift key pressed
SeeAlso: #00587,#03743,MEM 0040h:0017h,#M0010
praticamente assegno a lb il valore di al nel quale mi ritovo il mio shift flags, poi in
pratica controllo i vari 8 bit di lb e poi vedo la tabella sopra...

 vret & CTRL,vret & ALT ecc.?
datti una occhiata anche all' opeartore & di cui ti riporto la definizione...
& bitwise AND; compares two bits and generates a 1 result if both bits are 1, otherwise it
returns 0
in pratica se vret è uguale a 00000001  e faccio un & con 00000001 avrò come risultato 00000001
se vret è uguale a 00000010 e faccio un & con 00000010 avrò come risultato 00000010 però se ora
stampo vret con lo specificatore %d ottengo 2 ecco il motivo dello >> 1 potendo ottenere
appunto l' 1 ce volevo stampare...
Spero di essere stato sufficientemente chiaro e corretto ( con le spiegazioni sono una chiavica
;-) ), datti una occhiata ai vari servizi messi a disposizione dell' int 16 sicuramente
riuscirai ad implemetare altri tasti, anche se probabilmente non con la stessa precisione e
velocità di questi quattro... Salutoni Dave.
P.S Lascia perdere VB imparati bene il C che in questi casi credo sia molto meglio ;-)
P.P.S Ho dovuto dividere il msg in due parti xche unico mi dava errore all' invio :-(