Autore Topic: Game ed interstitial a fine gioco  (Letto 478 volte)

Offline rioan

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 7c
Game ed interstitial a fine gioco
« il: 07 Giugno 2017, 23:40:19 CEST »
0
Salve a tutti,
ho da poco terminato un gioco che ogni tre game over mostra un interstitial admob.
Premessa:
La classe che gestisce gli interstitial estende SurfaceView e
quando compare l'interstitial se lo chiudo si può ricominciare il gioco con tap to replay.
Il problema è questo:
Se compare l'interstitial ed invece di chiuderlo faccio tap su di esso admob reindirizza sulla pubblicità, tasto back e si ritorna all'interstitial
ora se lo chiudo invece di ricominciare il gioco si esce dall'app, io vorrei invece anche in questo caso tornare su tap to replay.
Grazie per ogni eventuale suggerimento su da dove iniziare a cercare la soluzione.

Offline rioan

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 7c
Re:Game ed interstitial a fine gioco
« Risposta #1 il: 13 Giugno 2017, 08:50:58 CEST »
0
Ringrazio chi vorrà dare uno sguardo al codice. Nel programma ho:

public class TDView extends SurfaceView implements SurfaceHolder.Callback

Nel costruttore ho:

public TDView(Context context) {
      super(context);
      this.context = context;
      // TODO Auto-generated constructor stub
      //add the callback to the surfaceholder to intercept events
      getHolder().addCallback(this);
      interstitialAd = new InterstitialAd(context);
      interstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
   
      interstitialAd.setAdListener(new AdListener(){
         public void   onAdClosed(){         
            closedInterstitial = true;
            requestNewInterstitial();         
            }   
         });
      requestNewInterstitial();

Nella classe TDView ho il metodo draw() ,che viene chiamato nel game loop.
Posto il frammento che coinvolge l'interstitial

 //Draw the HUD
             if(!gameEnded){
                        
                paint.setTextAlign(Paint.Align.LEFT);
                paint.setColor(Color.argb(255, 255, 255, 255));
                paint.setTextSize(25);               
                canvas.drawText("Distance: "+ distance /1000 , WIDTH *(1/4.f),HEIGHT -20,paint);
                canvas.drawText("Shell: "+player.getShellStrength(),WIDTH *(3/4.f), HEIGHT-20, paint);
           
             }
             else{
                if(!closedInterstitial && countGameEnd ==3 ){
               
                ((Activity)context).runOnUiThread(new Runnable(){
                   @ Override
                   public void run(){
           
                if(interstitialAd.isLoaded()){
                   interstitialAd.show();
                   countGameEnd = 0;
                  
                   }
                }
                });
                }
Questa è la GameActivity:

public class GameActivity extends Activity {
   private TDView gameView;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
   
      gameView = new TDView(this);
      // Make our gameView the View for the Activity
      setContentView(gameView);
   }

@Override
protected void onPause(){
   super.onPause();
}

@Override
protected void onStop(){
   super.onStop();
   finish();
}
}

Offline rioan

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 7c
Re:Game ed interstitial a fine gioco
« Risposta #2 il: 22 Luglio 2017, 13:55:02 CEST »
0
Buongiorno, forse può interessare a qualcuno la soluzione del problema indicato nel post (magari facendo risparmiare ore di lavoro!).Ho scoperto che il problema è, per così dire, strutturale e dipende dalla disparità di gestione (interna al sistema android), dei metodi surfaceCreated e surfaceDestroyed (di SurfaceView quando implementa SurfaceHolder.Callback) e dei metodi onPause onResume e onStop (dell’Activity).I cicli di vita di questi metodi sono difficilmente compatibili fra loro ed in parte il problema che ho riscontrato aveva a che fare con un noto (ma non a me!)  bug presente in esempi di android game (vedi “Lunar Lander bug”).La soluzione che ho adottato è stata abbastanza drastica: ho  rinunciato alla classe che estende SurfaceView ed implementa SurfaceHolder.Callback ed ho riscritto il tutto con una classe che estende SurfaceView ed implementa runnable...e finalmente sono riuscito a pubblicare il gioco sul playstore.Un saluto ed un augurio di buon lavoro a tutti.