Autore Topic: Gestione Thread in Pausa ???  (Letto 1168 volte)

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Gestione Thread in Pausa ???
« il: 25 Giugno 2012, 22:05:32 CEST »
0
Salve raga sto implementando per il mio gioco una SurfaceView che utilizza un Thread per aggiornarsi, ora il mio problema è fare in modo che appena il gioco inizia, per farlo partire bisogna toccare la view implementando OnTouchListener.

Quindi inizialmente il Thread voglio che sia in pausa cioè che non si aggiorni, inoltre potrà servirmi per inserire il tasto pausa.

questo è il listato della SurfaceView :

Codice (Java): [Seleziona]
package it.petitogennaro.squizzy_test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.graphics.Shader;

public class GameView extends SurfaceView implements OnTouchListener{
        private GameLoopThread gameLoopThread;
        private long lastClick;
        private Bitmap bmp;
        Sprite squizzy;
        PiantaCarnivora p1;
        Moneta m1,m2;
        FiorePartenza fP;
        private boolean drawM1 = true;
        private boolean drawM2 = true;
        private boolean drawSquizzy = true;
        private boolean drawGeneral = false;
        private boolean nessunTocco = true;    
        Foglie f1, f2;

        public GameView(Context context) {
                super(context);
                this.setOnTouchListener(this);
                gameLoopThread = new GameLoopThread(this);
                getHolder().addCallback(new SurfaceHolder.Callback() {

                        public void surfaceDestroyed(SurfaceHolder holder) {
                                boolean retry = true;
                                gameLoopThread.setRunning(false);
                                while (retry) {
                                        try {
                                                gameLoopThread.join();
                                                retry = false;
                                        } catch (InterruptedException e) {}
                                }
                        }


                        public void surfaceCreated(SurfaceHolder holder) {
                               
                                bmp = BitmapFactory.decodeResource(getResources(), R.drawable.fiore_partenza);
                                fP = new FiorePartenza(GameView.this, bmp);
                                bmp = BitmapFactory.decodeResource(getResources(), R.drawable.squizzy);
                                squizzy = new Sprite(GameView.this, bmp);
                                bmp = BitmapFactory.decodeResource(getResources(), R.drawable.carnivora);
                                p1 = new PiantaCarnivora(GameView.this, bmp);
                                bmp = BitmapFactory.decodeResource(getResources(), R.drawable.moneta);
                                m1 = new Moneta(GameView.this, bmp, 700,50);
                                bmp = BitmapFactory.decodeResource(getResources(), R.drawable.moneta);
                                m2 = new Moneta(GameView.this, bmp, 1200,245);
                                bmp = BitmapFactory.decodeResource(getResources(), R.drawable.foglie);
                                f1 = new Foglie(GameView.this, bmp,0);
                                gameLoopThread.setRunning(true);
                                gameLoopThread.start();
                        }


                        public void surfaceChanged(SurfaceHolder holder, int format,
                                        int width, int height) {
                        }
                });
        }  

        @Override
        protected void onDraw(Canvas canvas) {
               
               
                Paint p = new Paint();
            p.setShader(new LinearGradient(0, 0, 0, getHeight()-f1.getH(), Color.parseColor("#62c0f8"), Color.parseColor("#b6f6fe"), Shader.TileMode.MIRROR));
            canvas.drawPaint(p);
                f1.onDraw(canvas);
                fP.onDraw(canvas);
                if(squizzy.isCollition(p1.getX()+20, p1.getY()+20, p1.getW()/8*3, p1.getH()))
                        drawSquizzy = false;   
                if(drawSquizzy)
                        squizzy.onDraw(canvas);        
                p1.onDraw(canvas);             
                if(squizzy.isCollition(m1.getX(), m1.getY(), m1.getW(), m1.getH()))
                        drawM1 = false;
                if(drawM1)
                        m1.onDraw(canvas);      
                if(squizzy.isCollition(m2.getX(), m2.getY(), m2.getW(), m2.getH()))
                        drawM2 = false;
                if(drawM2)
                        m2.onDraw(canvas);     
        }

        public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction() & MotionEvent.ACTION_MASK;

                int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >>
                MotionEvent.ACTION_POINTER_ID_SHIFT;

                float x = event.getX();
                float y = event.getY();
                synchronized (getHolder()) {

                        switch (action){
                        case MotionEvent.ACTION_DOWN:
                        case MotionEvent.ACTION_POINTER_DOWN:
                                if((int)event.getX(pointerIndex) < v.getWidth()/2){
                                        //se premi a sinistra
                                }
                                if((int)event.getX(pointerIndex) >= v.getWidth()/2){                                   
                                        squizzy.sali();
                                        System.out.println("sali");
                                }
                                break;
                        case MotionEvent.ACTION_UP:
                        case MotionEvent.ACTION_POINTER_UP:
                        case MotionEvent.ACTION_CANCEL:                
                                if((int)event.getX(pointerIndex) < v.getWidth()/2){
                                        //se alzi il dito a sinistra
                                }
                                if((int)event.getX(pointerIndex) >= v.getWidth()/2){
                                        squizzy.scendi();
                                        System.out.println("scendi");
                                }
                                break;
                        }
                }



                return true;
        }
}

questo è il listato del Thread

Codice (Java): [Seleziona]
package it.petitogennaro.squizzy_test;

import android.graphics.Canvas;

public class GameLoopThread extends Thread {
        static final long FPS = 30;
        private GameView view;
        private boolean running = false;

        public GameLoopThread(GameView view) {
                this.view = view;
        }

        public void setRunning(boolean run) {
                running = run;
        }

        @Override
        public void run() {
                long ticksPS = 1000 / FPS;
                long startTime;
                long sleepTime;
                while (running) {
                        Canvas c = null;
                        startTime = System.currentTimeMillis();
                        try {
                                c = view.getHolder().lockCanvas();
                                synchronized (view.getHolder()) {
                                        view.onDraw(c);
                                }
                        } finally {
                                if (c != null) {
                                        view.getHolder().unlockCanvasAndPost(c);
                                }
                        }
                        sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
                        try {
                                if (sleepTime > 0)
                                        sleep(sleepTime);
                                else
                                        sleep(10);
                        } catch (Exception e) {}
                }
        }
}  


Se provo a fare setRunning(false), riesco a mettere in pausa, ma poi non so cosa utilizzare per farlo ripartire, ho provato setRunning(true) o start() niente....
« Ultima modifica: 25 Giugno 2012, 22:08:05 CEST da GennyAndroid »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestione Thread in Pausa ???
« Risposta #1 il: 25 Giugno 2012, 22:42:34 CEST »
+1
mi sembra che, implementato così, non appena metti running a false, il thread esce dalla run e quindi muore

per farlo ripartire devi crearne uno nuovo, oppure non farlo uscire dalla run
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline andre9004

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Lg Optimus Hub
  • Sistema operativo:
    Windows 7
Re:Gestione Thread in Pausa ???
« Risposta #2 il: 25 Giugno 2012, 22:57:36 CEST »
0
per mettere in pausa un thread puoi optare per due diverse soluzioni:

1)

uso di una variabile booleana e di un loop

Codice (Java): [Seleziona]
public void run(){
   while(abilita){

   }
}

quando la variabile booleana è a true ti esegue le operazioni, quando a false no... se non hai bisogno del loop puoi usare delle condizioni composte.

2)
Codice (Java): [Seleziona]
Thread.sleep(ms);

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:Gestione Thread in Pausa ???
« Risposta #3 il: 25 Giugno 2012, 23:03:08 CEST »
0
intanto vi ringrazio ho messo topic risolto per grazie alle vostre parole mi avete aperto gli occhi ed illustrato il comportamento del Thread

ho risolto chiamando

setRunning(false)

e poi inserendo nel onTouch il link per creare un nuovo Thread

andre9004 mi domando, ma la prima soluzione che mi hai posto non è identica a quello che avevo gia scritto? Lo chiedo per una maggior comprensione delle cose

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestione Thread in Pausa ???
« Risposta #4 il: 26 Giugno 2012, 08:07:27 CEST »
0
andre9004 mi domando, ma la prima soluzione che mi hai posto non è identica a quello che avevo gia scritto? Lo chiedo per una maggior comprensione delle cose

Si è identica. E più che una pausa, quello è un modo per "uscire" dal Thread.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline andre9004

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Lg Optimus Hub
  • Sistema operativo:
    Windows 7
Re:Gestione Thread in Pausa ???
« Risposta #5 il: 26 Giugno 2012, 10:24:35 CEST »
0
si è identica... ma io per usare i thread implemento Runnable e non estendo la classe Thread percui quella sintassi scritta cosi a colpo d'occhio non l'ho riconosciuta  :-[

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:Gestione Thread in Pausa ???
« Risposta #6 il: 26 Giugno 2012, 10:41:40 CEST »
0
ok adesso mi è tutto chiaro, grazie mille...