Newsgroup: it.comp.lang.c
Titolo: AIUTO: rilascio di tasti

Come faccio a gestire piu' di un giocatore su una tastira senza incorrere
nel problema dei tasti premuti?
mi spiego meglio:
PULSANTI DEI GIOCATORI
pl1      pl2
 w        i
asd      jkl
il pl1 tiene premuto w per andare avanti, ma il pl2 preme i per avanzare
anche lui ma cosi' facendo interrompe l'azione del pl1...
un modo per evitarlo l'ho escogitato:
ABBASSA w e l'azione inizia
RILASCIA w l'azione finisce, ma in c come faccio a sapere quando un
giocatore rilascia il pulsante w sulla tastira?
GRAZIE
P.S.
Scusatemi, ma sono alle prime armi e mi serve aiuto, puo' darsi che la mia
domanda sia cretina e priva di senso...ma non uccidetemi.
PLEASE postatemi alla mia e-mail.
 
MANIAK.

nel problema dei tasti premuti?
Questa e' una cosa che e' stata richiesta diverse volte e tutte le
volte si torna a dire che e' una questione dipendente
dall'implementazione.
Il C "puro" non possiede alcun controllo diretto dei tasti premuti,
ne' di qualsiasi altra operazione di basso livello con la tastiera.
Si ricorre, per queste applicazioni particolari, alle estensioni dei
diversi compilatori. L'esempio che ti riporto di seguito e' scritto
per il DJGPP e testa la pressione singola o contemporanea dei tasti
"W" ed "E". Il funzionamento si basa sulla lettura del valore della
porta 0x60 del PC, che restituisce il codice del carattere premuto o
rilasciato. Il bit piu' significativo vale 1 se il tasto e' stato
rilasciato e 0 se e' premuto. I restanti 7 bit identificano il
carattere premuto o rilasciato. L'utilizzo dell'array keycode[] e'
essenziale per determinare se un tasto e' stato appena rilasciato, in
quanto memorizza lo stato di tutti i tasti.
/* TASTI.C - per DJGPP */
/* Andrea Laforgia     */
#include <stdio.h>
#include <conio.h>
#include <pc.h>
#define W  17
#define E  18
main()
{
    int c ;
    unsigned char b ;
    static unsigned char keycode[128] ;
    do
    {
        b = inportb( 0x60 ) ;
        keycode[ b & 127 ] = ( ( b & 128 ) == 0 ) ;
        if ( keycode[W] ) printf( " W " ) ;
        if ( keycode[E] ) printf( " E " ) ;
        printf( "\n" ) ;
        if ( kbhit() )
           if ( ( c = getch() ) == 0 ) c = getch() ;
    } while ( c != 0x1B ) ;
}
p.s. : possibile che al Centro di Calcolo del Dipartimento di
Informatica nessuno ti sappia aiutare ? ;))
--
Andrea Laforgia
andrea_...@bigfoot.com

 ne' di qualsiasi altra operazione di basso livello con la tastiera.
Avendoci sbattuto la testa più volte, posso tranquillamente dire che dipende
in larga misura anche dall'HW in questione. Siccome l'implementazione fisica
della tastiera è realizzata con un numero ridotto di fili, non è possibile
intercettare un numero qualsiasi di tasti che siano premuti
contemporaneamente. Per fare ciò, bisognerebbe che sia l'implementazione
"fisica" che a livello di trasmissione tastiera-pc avvenisse a 102-105 bit
(o anche più, dipendente dalla tastiera), mentre in realtà non è così.
Per ovviare (pazialmente) al problema, l'unica possibilità che conosco è di
verificare personalmente quali combinazioni di tasti siano rilevabili in
contemporanea e quali no. Ciò, però, può implicare la scrittura di un
proprio driver per la gestione della tastiera con la lettura diretta delle
porte HW dedicate, in quanto molti SO non forniscono questa possibilità.
--
Alessandro Monti

 contemporaneamente. 
[...]
Se non ricordo male, il limite fisico della tastiera consiste nel poter
rilevare correttamente al piu' 3 tasti premuti comtemporaneamente sulla
stessa riga; non so pero' su piu' righe...
-- 
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it