2017-03-07 4 views
-1

J'écris un jeu où vous continuez à appuyer sur l'écran pour faire voler un hélicoptère. Maintenant, lorsque l'hélicoptère entre en collision avec l'écran-frontières (Hight & largeur du dispositif individuel) l'activité se termine paronTouchEvent() provoque "malheureusement l'application s'est arrêtée"

((Activity) context).finish(); 

Il fonctionne parfaitement bien quand le joueur arrête fastly après la collision, mais s'il tient, je reçois l'erreur détestée.

Thant est pourquoi je soupçonne que la onTouchEvent méthode

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // background music 
    mp.start(); 
    mp.setLooping(true); 
    copter.setVolume((float) 0.2, (float) 0.2); 
    if (event.getAction() == MotionEvent.ACTION_DOWN && fuel > 0) { 
     copter.start(); 
     copter.setLooping(true); 
     if (!player.getPlaying()) { 
      player.setPlaying(true); 
      player.setUp(true); 
      fuel--; 
     } else { 
      player.setUp(true); 
      fuel--; 
     } 
     return true; 
    } 
    if (event.getAction() == MotionEvent.ACTION_UP) { 
     copter.pause(); 
     player.setUp(false); 
     return true; 
    } 
    return super.onTouchEvent(event); 
} 

Est-il possible d'ignorer TouchEvents après une collision? Ou l'OnTouchEvent n'est même pas le problème?

+2

Pas besoin de soupçonner quoi que ce soit. Allez voir votre journal d'application. Là, vous verrez exactement où l'accident est arrivé. – Okas

+1

s'il vous plaît partager la trace de la pile d'erreur de logcat – Opiatefuchs

Répondre

0

Vérifiez si l'activité est nulle à l'intérieur onTouchEvent()

Voici le code:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Activity activity = getActivity(); 
    if(activity != null){ 
     // background music 
     mp.start(); 
     mp.setLooping(true); 
     copter.setVolume((float) 0.2, (float) 0.2); 
     if (event.getAction() == MotionEvent.ACTION_DOWN && fuel > 0) { 
      copter.start(); 
      copter.setLooping(true); 
      if (!player.getPlaying()) { 
       player.setPlaying(true); 
       player.setUp(true); 
       fuel--; 
      } else { 
       player.setUp(true); 
       fuel--; 
      } 
      return true; 
     } 
     if (event.getAction() == MotionEvent.ACTION_UP) { 
      copter.pause(); 
      player.setUp(false); 
      return true; 
     } 
     return super.onTouchEvent(event); 
    } 
    //return super.onTouchEvent(event); 
    return false; 
} 

En fonction de votre code, vous devez utiliser:

if(((Activity)context) != null){ 

au lieu de

Activity activity = getActivity(); 
if(activity != null){ 

Si ce n'est pas le problème, ajoutez l'erreur stacktrace.


Mise à jour

Pour envoyer stacktrace par e-mail:

Intent mailIntent = new Intent(Intent.ACTION_SENDTO); 
mailIntent.setData(Uri.parse("mailto:")); 
mailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); 
mailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
mailIntent.putExtra(Intent.EXTRA_TEXT, stacktraceText); 
Intent mailChooserIntent = Intent.createChooser(mailIntent, "Title"); 

context.startActivity(mailChooserIntent); 
+0

La méthode getActivity() est indéfinie pour le type GamePanel, donc j'ai utilisé – Krissini

+0

GamePanel activity = GamePanel.this; au lieu – Krissini

+0

Vous pouvez utiliser le même que vous utilisez pour terminer l'activité que je suppose: ((Activité) contexte) – MarcGV