Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Con la quattordicesima generazione Lenovo ridisegna il suo ThinkPad più iconico attorno al nuovo Space Frame e ai processori Intel Core Ultra Series 3. Resta sotto 1Kg, è molto più semplice da riparare e si rivolge al professionista che lavora in mobilità, con un prezzo da prodotto di vertice.
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Le Jabra Evolve3 85 non sono semplicemente cuffie Bluetooth con cancellazione del rumore. Sono un dispositivo professionale pensato per chi trascorre gran parte della giornata in riunione, al telefono o davanti a un assistente basato sull'intelligenza artificiale
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-08-2008, 17:57   #1
Donbabbeo
Senior Member
 
L'Avatar di Donbabbeo
 
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
	}
Questo è il thread in esecuzione, input gestisce i miei movimenti, thick gestisce i movimenti della flotta di alieni e render disegna a schermo. Ad ogni morte vado in pausa fino alla pressione di un nuovo tasto, in modo da avere un attimo di tempo per riorganizzarmi
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
	
}
Seconda domanda: al game over il gioco mi rimane bloccato al punto della morte (ovvio, imposto lo stop del thread)... Io vorrei però che mi tornasse al menù! Tipo:
Codice:
if (SeiMorto == true)
{

	//SCRIVI A SCHERMO -> "GAMEOVER!"
       //ATTENDI 2 SECONDI
       //TORNA AL MENU
}
Qualche consiglio?

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.
Donbabbeo è offline   Rispondi citando il messaggio o parte di esso
Old 19-08-2008, 20:37   #2
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
aspè...
ma il getGraphics() lo stai chiamando sulla canvas corretta?
E sei sicuro di essere all'interno del thread grafico?
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 19-08-2008, 21:38   #3
Donbabbeo
Senior Member
 
L'Avatar di Donbabbeo
 
Iscritto dal: Jul 2006
Messaggi: 8152
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
aspè...
ma il getGraphics() lo stai chiamando sulla canvas corretta?
E sei sicuro di essere all'interno del thread grafico?
volendo potrei metterlo nel thread ma non riesco a visualizzarlo comunque
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
	}
Ad esempio se faccio così mi fa tutto correttamente, va in pausa, ma la scritta non la fa...
Donbabbeo è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2008, 01:11   #4
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
Quote:
Originariamente inviato da Donbabbeo Guarda i messaggi
volendo potrei metterlo nel thread ma non riesco a visualizzarlo comunque
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
	}
Ad esempio se faccio così mi fa tutto correttamente, va in pausa, ma la scritta non la fa...
ecco..
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.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2008, 12:59   #5
Donbabbeo
Senior Member
 
L'Avatar di Donbabbeo
 
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!
Donbabbeo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Claude Code può salvare credenziali in c...
L'algoritmo di TikTok ti intrappola: l'a...
WoW Forever è stato il miglior la...
gputaskman, arriva il Task Manager per G...
Guerra aperta tra le Big Tech e la Calif...
3 chiavette USB Lexar in offerta: c'&egr...
Netflix ha alzato i prezzi in Italia: qu...
Monitor gaming AOC Fast IPS da 24 pollic...
Su Amazon c'è lo Smart TV da 40 p...
Hai una Radeon? Controlla questo process...
Mini aspirapolvere per auto (e non solo)...
Il CEO di NVIDIA Jensen Huang ammette la...
Moon Base: la NASA amplia contratti e mi...
L'italiana Avio fa un passo indietro sul...
SpaceX Starship: Flight 15 punta al prim...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:55.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v