|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Altrimenti come posso risolvere il problema senza mettere un thread per il tasto?
|
![]() |
![]() |
![]() |
#22 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Puoi usare un Thread a parte che esegue un ciclo continuo di consumazione su una coda degli eventi da te creata. Ad ogni keyPressed aggiugeresti a quella coda un marcatore, tipo un intero MOVE_LEFT, che causerebbe l'invocazione da parte del Thread della sequenza di operazioni che prima avevi nel keyPressed.
In questo non avresti più il problema dell'accumulo di Thread. Bisognerebbe comunque vedere l'architettura generale del tuo motore di gioco per capire quanto sarebbe problematica una soluzione del genere. A me sembra che tu abbia scelto un'architettura parallela che va benissimo ma richiede una certa cura negli interventi altrimenti si accumulano dei comportamenti bizzarri.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#23 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Forse non ho capito bene..dovrei fare l'intera classe keypres(è la classe che gestisce gli eventi da tastiera) di tipo thread? però gli altri tipi di tasti che ho messo tipo escape oppure il tasto a funzionano senza bisogno di niente..
|
![]() |
![]() |
![]() |
#24 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Vorrei dire non è che magari mettendo l'intera classe di tipo thread mi crea problemi pure con gli altri tasti?
|
![]() |
![]() |
![]() |
#25 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il problema che avevi era che il thread che esegue il metodo keyPressed è lo stesso che deve disegnare. Il disegno viene fatto con repaint() ma repaint non disegna subito: aspetta che l'EDT termini di eseguire il compito attuale poi disegna.
Così se nel tuo keyPressed scrivi: per cinque volte scambia l'immagine, repaint(), sleep l'EDT per cinque volte scambia l'immagine, per cinque volte va in pausa POI ridisegna per cinque volte. Se usi un Thread diverso ottieni invece l'interposizione tra il disegno e lo scambio delle immagini con pausa successiva. Non è priva di problemi neppure questa soluzione ma non causa errori fatali del programma, semmai può capitare che la sostituzione delle immagini non risulti esattamente sequenziale. E' critico invece il problema che deriva dalla creazione di un Thread ad ogni keyPressed. Relativamente, perchè puoi tranquillamente creare diverse centinaia di Thread prima che la JVM entri in crisi, il tuo utente dovrebbe star lì col dito spiaccicato sul tasto per parecchi secondi di fila prima che tutto vada a schifìo. Il Thread ad hoc per la gestione dell'input sarebbe una cosa di questo genere: Codice:
public class LaMiaClasse extends KeyAdapter { private static final Integer MOVE_LEFT = 0; private static final Integer FIRE = 1; private final ConcurrentBlockingQueue<Integer> INPUT_QUEUE = new ConcurrentBlockingQueue<Integer>(); private final Thread INPUT_PARSER = new Thread() { public void run() { //ciclo di gestione dell'input while(true) { try { Integer action = INPUT_QUEUE.take(); if(action == MOVE_LEFT) { p.sec = 1; for(int i = 1; i<=6;i++) { p.muoviASinistra(); try { Thread.sleep(40); } catch(InterruptedException ex) { return; } } } else if(action == FIRE) { } } catch(InterruptedException ex) { return; } } } }; public LaMiaClasse() { INPUT_PARSER.setDaemon(true); } public void keyPressed(KeyEvent e) { if(!INPUT_PARSER.isAlive()) { INPUT_PARSER.start(); } if(e.getKeyCode() == KeyEvent.VK_LEFT) { INPUT_QUEUE.offer(MOVE_LEFT); } } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#26 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Grazie mille..ho creato un nuovo thread e funziona..in effetti almeno cosi..non causa errori fatali..qst videogioco lo sto preparando per un esame
![]() |
![]() |
![]() |
![]() |
#27 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
E se voglio inserire nella mia classe Keypres..qst codice:
Codice:
if(e.getKeyCode()==KeyEvent.VK_A) { if(!Fu.stato){ Fu.Ricevi(pal,pal2,pal3); Thread t=new Thread(Fu); t.start(); SoundT player = new SoundT("Suoni/pang3-079.wav"); player.start(); } La classe Fuoco è un thread che al suo avvio fa partire un metodo che verifica se lo sparo colpisce gli oggetti.. Ora se io in KeyPres aggiungo un metodo del genere..non genera interferenze con il Thread creato per la pressione dei tasti in keypres? pur volendo aggiungerlo nella coda bloccante come faccio poi non posso creare un altro thread ,che mi avvi la classe fuoco, all'interno di un altro.. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:34.