Oppure

Loading
03/01/12 16:33
GrG
Ciao a tutti,
oggi innauguro la sezione android con il mio primo problema :D

Allora, sto cercando di creare un gioco per android, ma ho già alcuni problemi.

Si tratta del multithread.

Ci sono degli sprites che si muovono sullo schermo al momento seguendo una linea retta.

Per muovere un singolo sprites, è abbastanza semplice, infatti creo un oggetto Timer e aumento di 1 la coordinata x per farlo muovere verso destra (oppure lo decremento x di 1 per farlo andare verso sinistra).

Il problema è quando devo gestire più di uno sprites. In teoria infatti potrebbero essere decine di sprites che si muovono tutti insieme, quindi al posto di creare 10 timer diversi devo usarne solo uno usando il multithread.
Il problema è che non capisco come fare.

Allora, ecco il codice che uso per creare e gestire il timer:
public class myActivity extends Activity {

	private Timer myTimer;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		setContentView(R.layout.main);

		myTimer = new Timer();
		myTimer.schedule(new TimerTask() {
			@Override
			public void run() {
				TimerMethod();
			}

		}, 0, 1000); //Intervallo di 1 secondo
	}

	private void TimerMethod()
	{
		//This method is called directly by the timer
		//and runs in the same thread as the timer.

		//We call the method that will work with the UI
		//through the runOnUiThread method.
		this.runOnUiThread(Timer_Tick);
	}

	private Runnable Timer_Tick = new Runnable() {
		public void run() {

		//This method runs in the same thread as the UI.    	       

		//Do something to the UI thread here

/* QUI HO INSERITO IL CODICE PER MUOVERE LO SPRITES */
		}
	};
}

Questo esempio l'ho preso da: steve.odyfamily.com/

Il timer funziona bene e fino a qua non ci sono problemi.

Riguardo al multithreading consultavo questa pagina:
developer.android.com/resources/articles/…

Eppure non riesco a implementarlo infatti mi da errore di run-time e devo forzare la chiusura dell'app.

Comunque ecco io come ho fatto:
Nell'onCreate ho messo:
       new Thread(new Runnable() {
    	    public void run() {
    	     runG();
    	    }
    	  }).start();


quindi richiamo il metodo runG()
	public void runG() {
		//Codice eseguito da thread.start()
		Looper.prepare(); /*Questo metodo l'ho messo perchè nel log c'era scritto che mancava */

/* Altro codice.. */
	}
	}


il problema è che appena si apre il programma mi da errore di run-time, infatti il LogCat quando apro il programma mi dice:

...
01-03 16:26:25.871: W/dalvikvm(2697): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
01-03 16:26:25.871: E/AndroidRuntime(2697): FATAL EXCEPTION: Thread-8
01-03 16:26:25.871: E/AndroidRuntime(2697): java.lang.NullPointerException
...


dove sbaglio?
Comunque tra l'altro non capisco come richiamare il timer sfruttando il multithread.. :(

qualcuno è in grado di darmi una mano? :-|

EDIT:
ok, ho risolto capendo come funziona il multithread. Mi sono basato su quest'esempio:
public class Prova {

        static int k = 0;
        static Object obj = new Object();

        public static void main(String[] args) {
                new Thread(new MyRunnable("primo")).start();
                new Thread(new MyRunnable("secondo")).start();
        }

        static class MyRunnable implements Runnable {

                String name;

                public MyRunnable(String name) {
                        this.name = name;
                }

                @Override
                public void run() {

                        while (k < 100) {
                                synchronized (obj) {
                                        k++;
                                        for (int i = 0; i < 20; i++) {
                                                System.out
                                                                .format("Thread: %s k: %d i:%d\n", name, k, i);

                                        }
                                }
                        }
                }
        }

}
Ultima modifica effettuata da GrG 08/01/12 20:39
aaa