|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 8152
|
[J2ME]Gestire eventi pausa/stop applicazione
Sto creando un'applicazione sempliciotta (uno space invaders clone) tramite j2me: il gioco funziona, riesco anche a salvare gli highscore senza richiedere permessi (scrivo sul recordstore).
Il problema è che non mi piace quello che accade alla mia morte! Mi spiego meglio, mostrando una parte del codice: Codice:
public void run()
{
Graphics g = getGraphics();
while(inGioco == true)
{
if (inPausa == false)
{
input();
tick();
render(g);
try{Thread.sleep(sleepTime);
}catch(InterruptedException ie) {}
}
else
{
if (getKeyStates() != 0)
inPausa = false;
}
}
//if (getKeyStates() != 0)
//torna al menù principale
}
Il problema è che spesso mentre vengo colpito sto già premendo un tasto, di conseguenza la pausa non avviene per niente... Ed inoltre non capisco perchè, non riesco a far apparire un messaggio in sovraiscrizione! Vorrei sostituirlo con qualcosa del tipo: Codice:
if (HaiPersoUnaVita == true)
{
//SCRIVI A SCHERMO -> "HAI PERSO UNA VITA!"
//ATTENDI 2 SECONDI
}
Codice:
if (SeiMorto == true)
{
//SCRIVI A SCHERMO -> "GAMEOVER!"
//ATTENDI 2 SECONDI
//TORNA AL MENU
}
Io gestisco il tutto così, ma ovviamente non funziona (non mi scrive a schermo): Codice:
public void stop()
{
Graphics g = getGraphics();
if (fleet.size() > 0 && vite > 0)
{
g.setColor(0xFFFFFF);
g.drawString("HAI PERSO UNA VITA", getWidth()/4, getHeight()/2, 0);
inPausa = true;
}
else if (fleet.size() > 0 && vite <= 0)
{
g.setColor(0xFFFFFF);
g.drawString("HAI PERSO! IL TUO PUNTEGGIO E': " + score, getWidth()/4, getHeight()/2, 0);
high = getHighScore();
if (score > high)
{
g.drawString("COMPLIMENTI! HAI FATTO IL NUOVO HIGHSCORE", getWidth()/4, getHeight()/2, 0);
setHighScore(score);
}
inGioco = false;
}
else if (fleet.size() <= 0 && vite > 0)
{
g.setColor(0xFFFFFF);
g.drawString("HAI VINTO! IL TUO PUNTEGGIO E': " + score, getWidth()/4, getHeight()/2, 0);
high = getHighScore();
if (score > high)
{
g.drawString("COMPLIMENTI! HAI FATTO IL NUOVO HIGHSCORE", getWidth()/4, getHeight()/2, 0);
setHighScore(score);
}
inGioco = false;
}
}
Ultima modifica di Donbabbeo : 19-08-2008 alle 18:09. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
aspè...
ma il getGraphics() lo stai chiamando sulla canvas corretta? E sei sicuro di essere all'interno del thread grafico?
__________________
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 8152
|
Quote:
Codice:
public void run()
{
Graphics g = getGraphics();
while(inGioco == true)
{
if (inPausa == false)
{
input();
tick();
render(g);
try{Thread.sleep(sleepTime);
}catch(InterruptedException ie) {}
}
else
{
g.setColor(0xFFFFFF);
g.drawString("HAI PERSO UNA VITA", getWidth()/4, getHeight()/2, 0);
if (getKeyStates() != 0)
inPausa = false;
}
}
//if (getKeyStates() != 0)
//torna al menù principale
}
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
allora avevo intuito bene.. quel metodo run fa parte di un altro thread diverso dal thread grafico e in java, come in praticamente tutti gli alitri linguaggi esistenti, è assolutamente necessario modificare lo stato degli oggetti grafici dallo stesso thread che gestisce la grafica..Se provi ad eseguire dei cambiamenti sugli oggetti grafici da un thread diverso ottieni degli errori o comunque, nel caso migliore, hai un risultato imprevedibile, come nel tuo caso mi sa Esegui l'aggiornamento dal thread grafico. In J2SE si usa SwinUtilities.invokeLater() per effettuare delle chiamate asincrone da un thread diverso che verrano instradate sull' EDT grafico... con J2ME sinceramente non ho mai fatto una cosa del genere e non so se esiste qualcosa di simile, anche se immagino di si.
__________________
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 8152
|
Grazie!
Finalmente (quasi) funziona! ![]() Ho pure aggiunto un temporizzatore per i messaggi e rimosso il check sulla pressione del tasto, quindi ora funziona esattamente come volevo. Grazie ancora Oggi pomeriggio un pò di pulizia generale del codice, aggiungo qualche commento qua e là ed ho fatto!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:25.





















