Newsgroup: it.comp.java
Titolo: [J2ME] Rilevazione tasti

Salve a tutti,
sto scrivendo un'applicazione j2me cercando di renderla il più
portabile possibile.
Ad un certo punto dell'implementazione sono posto davanti a un
problema:
in una classe erede di GameCanvas devo rilevare la pressione dei tasti.
Il manuale di MIDP2.0 illustra come utilizzare il metodo getKeyStates()
con l'esempio:
int keyState = getKeyStates();
      if ((keyState & LEFT_PRESSED) != 0) {
          sprite.move(-1, 0);
      }
LEFT RIGHT UP DOWN etc sono presenti e funzionano ottimamente. Dovendo
utilizzare anche i tasti 1, 3, 7 e 9, dato che GameCanvas eredita da
Canvas, ho tentato:
 if ((keyState & Canvas.KEY_NUM1) != 0) {
          sprite.move(-1, 0);
      }
senza però successo.
Al che, mosso da rabbia funesta, stampo tutti i keycode dei tasti a me
utili e li mappo a mano:
int keyState = getKeyStates();
if( keyState == 512 )
    System.out.print("Tasto 1");
e così via, per rendermi solo dopo conto che cambiando architettura la
storia non funziona.
Ho compilato con ktoolbar. A run su ktoolbar, mpowerplayer sia per mac
che x86
Any ideas?

Dimenticavo...
l'override di keyPressed ha lo stesso effetto delle altre prove:
niente.
Il metodo keyPressed viene richiamato unicamente quando premo 0 * #...

akyra ha scritto:

Ciao. Hai provato ad usare il metodo Canvas.keyPressed(int keyCode) [e i 
correlati keyReleased ecc..]? Viene chiamato in automatico ad ogni 
pressione di tasto, ma ricorda che questa feature (che fastidio quando 
non mi vengono le parole in italiano) viene abilitata tramite il 
costruttore di GameCanvas(boolean suppressKeyEvents). Significa che devi 
costruire GameCanvas passando un false. So che in questo modo 
l'applicazione e' un po' piu' "pesante", la differenza rispetto al modo 
getKeyState su alcuni dispositivi si fa notare, ma se hai detto che con 
altri modi non hai avuto fortuna puoi considerare questo. Quindi, 
dall'interno del metodo keyPressed, fai uno switch su keyCode:
switch(keyCode) {
	case Canvas.KEY_NUM1:
//ecc...
Se il tasto e' anche una GameAction puoi richiamare 
getGameAction(keyCode) e utilizzare quindi GameCanvas.LEFT e gli altri.
Gia' che siamo in tema, ti pongo invece il mio quesito. Su alcuni 
dispositivi Motorola, ho riscontrato che la funzione di ripetizione 
tasti non funziona. Significa cioe' che se tengo premuto un qualunque 
tasto, il metodo keyPressed viene comunque chiamato una volta. Questo 
non e' un male, in quanto preferisco di gran lunga appunto usare il 
metodo senza keyPressed, ma in casi dove pero' questo venisse comodo 
come ad esempio lo spostamento in punti discreti (dove cioe' l'effetto 
"pressione continua" risulterebbe fastidioso) mi domandavo come fare 
senza usare una soluzione ibrida come questa che ho trovato. E cioe':
quando ho bisogno dello "spostamente continuo" uso un metodo chiamato 
all'inizio della draw che mi prende lo stato dei tasti (e qui la cosa 
fica e' che posso anche premere piu' tasti contemporaneamente, per 
esempio per una rotazione su piu' assi), quando invece ho bisogno dello 
spostamento discreto, con un boolean bypasso questo controllo e utilizzo 
la keyPressed che viene chiamata senza appunto l'effetto ripetizione 
(non solo sui motorola, su altri dispositivi anche qui c'e' l'effetto 
ripetizione ma solo dopo un po di attessa accettabile). Piu' che una 
domanda e' una curiosita' dato che il mio problema l'ho risolto ma mi 
chiedevo se ci fossero modi migliori.
Ciao
Corrado

MA che sei telepatico? Metre scrivevo hai vanificato la mia risposta :)

 MA che sei telepatico? Metre scrivevo hai vanificato la mia risposta :)
No solo sfigato :)
Risolto dopo avere cercato pure nelle pagine in polacco.
La soluzione era semplice quanto nascosta nella documentazione di MIDP
2.0
protected GameCanvas(boolean suppressKeyEvents)
          Creates a new instance of a GameCanvas.
dando un occhio al parametro del costruttore dice "suppressKeyEvents"
per dare posto ai GameEvents come up down fire etc.
Settandolo a false e implementando con logica event-driven "mixata" si
riesce a ottenere l'utilizzo di tutti e gli otto tasti direzionali.
STRANEZZA: il metodo keyPressed(int keyCode) era già presente nei miei
archivi e quindi per riutilizzare il codice ne ho fatto copia e
incolla.
Nella prima riga si leggeva:
		super.keyPressed(keyCode);
alla quale non avevo neanche fatto caso. Fatto sta che con questa
chiamata il tasto 4 e il tasto 2 avevano la stessa mappatura. Provato
su varie piattaforme hardware e software.
Commentata la suddetta riga è tornato apposto. MAH!!!

 Commentata la suddetta riga č tornato apposto. MAH!!!
Beh strano davvero, perche mai la super, che dovrebbe eseguire un metodo 
vuoto, compie questa strana cosa?