Autore Topic: Evento indipendente dopo n secondi  (Letto 342 volte)

Offline Zed92

  • Nuovo arrivato
  • *
  • Post: 38
  • It's just a ride!
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2 mini
  • Sistema operativo:
    Windows 8
Evento indipendente dopo n secondi
« il: 09 Luglio 2017, 01:57:13 CEST »
0
Salve ragazzi, sto realizzando un giochino in Java e sono sui primi passi.

Ho un oggetto che fa cadere "nemici", e per adesso sono riuscito a impostarlo in modo tale che ad ogni pressione di un tasto mi crea nuovi nemici.

Vorrei però rendere la creazione di questi nemici indipendente, impostando che questo oggetto aspetti N secondi prima di creare nuovi nemici.

Inizialmente avevo pensato di creare un semplice contatore che incrementa una variabile int, ma è risultato troppo dispendioso.

Ho provato successivamente con le classi Timer e con Thread.sleep ed infine anche mediante l'uso di un while.

Il problema però è che quando imposto al suddetto oggetto di aspettare N secondi per creare mostri, allora tutto il gioco logicamente si blocca in attesa dell'evento.

A questo punto credo che l'unica soluzione possibile sia creare un Thread a parte che si occupi di questa cosa oppure sbaglio?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Evento indipendente dopo n secondi
« Risposta #1 il: 11 Luglio 2017, 12:11:13 CEST »
0
Puoi creare un Thread che attende il tempo necessario poi invia un messaggio al thread principale:

Codice (Java): [Seleziona]
        //Oggetto per la gestione dei messaggi in arrivo
        private final Handler mHandler = new Handler() {
                public void handleMessage(Message msg) {

                        if(msg.what == MyThread.MESSAGE_CODE_REFRESH){
                                //Gestisci l'evento
                                String body = msg.getData().getString(MyThread.MESSAGE_BODY);
                                if(body != null){
                                        //Visualizza il contenuto del messaggio in una TextView
                                        tvStatus.setText(body);
                                }
                        }
                }
        };

        //Definisce il nostro thread
        private class MyThread extends Thread {
                public static final int MESSAGE_CODE_REFRESH = 123;
                public static final String MESSAGE_BODY = "body";
               
                private int count = 0;
                private Handler mHandler = MainActivity.this.mHandler;

                public MyThread(Handler handler) {
                        super();
                        mHandler = handler;
                }

                @Override
                public void run() {
                        while (isAlive()) {

                                try {
                                        //Attende 5 secondi
                                        Thread.sleep(5000);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }

                                if (isAlive()) {
                                        //Prepara il messaggio
                                        Bundle data = new Bundle();
                                        data.putString(MESSAGE_BODY, "Event number " + count++);

                                        Message msg = new Message();
                                        msg.setData(data);
                                        msg.what = MESSAGE_CODE_REFRESH;

                                        //Invia il messaggio
                                        mHandler.sendMessage(msg);
                                }
                        }
                }
        }

A questo punto avvii il thread specificando l'Handler

Codice (Java): [Seleziona]
new MyThread(mHandler).start();
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.