2017-03-28 4 views
2

J'espère que je peux obtenir des conseils à ce sujet.Retour à l'activité principale sur l'application Android avec la touche retour pour voir le score de l'utilisateur

Mon programme a une image-objet qui, lorsqu'elle est frappée/cliquée, marque un score à l'écran. Quand le jeu est terminé (le temps est écoulé), je veux que l'utilisateur puisse appuyer sur la touche retour de son téléphone pour revenir à l'écran principal/activité de départ où il a commencé le jeu, mais il affichera aussi son score (combien de coups).

J'ai du mal à comprendre comment l'obtenir pour revenir en arrière avec la touche de retour. Je peux trouver le meilleur score à une date ultérieure si nécessaire. Je veux juste revenir à cet écran de démarrage.

MISE À JOUR:

Je pense qu'il peut avoir quelque chose à voir avec mon manifeste pour expliquer pourquoi il ne fonctionne pas. J'ai essayé d'ajouter la classe 'GameView' au manifeste, mais elle ne l'acceptera pas. Il dit qu'il n'a pas de constructeur par défaut. Des idées?

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="cct.mad.lab.MainMenu" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".GameActivity" 
     android:label="@string/app_name" > 
    </activity> 
    <activity 
     android:name=".GameView" 
     android:label="@string/app_name" > 
    </activity> 

Mon code Gameview est ci-dessous:

public class GameView extends SurfaceView implements SurfaceHolder.Callback { 

/* Member (state) fields */ 
private GameLoopThread gameLoopThread; 
private Paint paint; //Reference a paint object 
/** The drawable to use as the background of the animation canvas */ 
private Bitmap mBackgroundImage; 
// For creating the game Sprite 
private Sprite sprite; 
// For recording the number of hits 
private int hitCount; 
// To track if a game is over 
private boolean gameOver; 
// To play sound 
private SoundPlayer sound; 

//int backButtonCount = 0; 

public GameView(Context context) { 
    super(context); 
    // Focus must be on GameView so that events can be handled. 
    this.setFocusable(true); 
    // For intercepting events on the surface. 
    this.getHolder().addCallback(this); 
    // Background image added 
    mBackgroundImage = BitmapFactory.decodeResource(this.getResources(), R.drawable.half_moon); 

    //sound = new SoundPlayer(this); 

} 
/* Called immediately after the surface created */ 
public void surfaceCreated(SurfaceHolder holder) { 
    // We can now safely setup the game start the game loop. 
    ResetGame();//Set up a new game up - could be called by a 'play again option' 
    mBackgroundImage = Bitmap.createScaledBitmap(mBackgroundImage, getWidth(), getHeight(), true); 
    gameLoopThread = new GameLoopThread(this.getHolder(), this); 
    gameLoopThread.running = true; 
    gameLoopThread.start(); 
} 



// For the countdown timer 
private long startTime; // Timer to count down from 
private final long interval = 1 * 1000; // 1 sec interval 
private CountDownTimer countDownTimer; // Reference to the class 
private boolean timerRunning = false; 
private String displayTime; // To display the time on the screen 


//To initialise/reset game 
private void ResetGame(){ 
    /* Set paint details */ 
    paint = new Paint(); 
    paint.setColor(Color.WHITE); 
    paint.setTextSize(20); 
    sprite = new Sprite(this); 
    hitCount = 0; 
    // Set timer 
    startTime = 10; // Start at 10s to count down 
    // Create new object - convert startTime to milliseconds 
    countDownTimer = new MyCountDownTimer(startTime*1000, interval); 
    countDownTimer.start(); // Start the time running 
    timerRunning = true; 
    gameOver = false; 


} 

// Countdown Timer - private class 
private class MyCountDownTimer extends CountDownTimer { 

    public MyCountDownTimer (long startTime, long interval) { 
     super(startTime, interval); 
    } 
    public void onFinish() { 
     //displayTime = "Time is up!"; 
     timerRunning = false; 
     countDownTimer.cancel(); 
     gameOver = true; 
    } 
    public void onTick (long millisUntilFinished) { 
     displayTime = " " + millisUntilFinished/1000; 
    } 
} 


//This class updates and manages the assets prior to drawing - called from the Thread 
public void update(){ 

    sprite.update(); 

} 
/** 
* To draw the game to the screen 
* This is called from Thread, so synchronisation can be done 
*/ 
public void doDraw(Canvas canvas) { 
    //Draw all the objects on the canvas 
    canvas.drawBitmap(mBackgroundImage, 0, 0, null); 

    if (!gameOver) { 
     sprite.draw(canvas); 
     canvas.drawText("Time Remaining: " + displayTime, 35, 50, paint); 
     canvas.drawText("Number of hits: " + hitCount, 250, 50, paint); 
    } else 
     canvas.drawText("Game Over!", 185, 100, paint); 
     canvas.drawText("To go back to the main menu, press the 'back' key", 15, 150, paint); 


} 

//To be used if we need to find where screen was touched 
public boolean onTouchEvent(MotionEvent event) { 
     if (sprite.wasItTouched(event.getX(), event.getY())) { 
      // This just renews the sprite for now 
      sprite = new Sprite(this); 
      //sound.playZapSound(); 
      hitCount++; 

     } 
    return true; 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    gameLoopThread.running = false; 

    // Shut down the game loop thread cleanly. 
    boolean retry = true; 
    while(retry) { 
     try { 
      gameLoopThread.join(); 
      retry = false; 
     } catch (InterruptedException e) {} 
    } 
} 

public void getHitCount() { 



} 

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

} 

} 

Mon MainActivity est ci-dessous:

public class MainMenu extends Activity { 

private static final int SCORE_REQUEST_CODE = 1;// The request code for the intent 

TextView tvScore; 
String score; 
Intent gameIntent; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game_start); 
} 

public void startGame(View v){ 
    gameIntent = new Intent(this,GameActivity.class); 
    startActivityForResult(gameIntent, SCORE_REQUEST_CODE); 
} 
/* Create Options Menu */ 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main_menu, menu); 
    return true; 
} 

// Respond to item selected on OPTIONS MENU 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
    //put data in Intent 
    case R.id.easy: 
     Toast.makeText(this, "Easy chosen", Toast.LENGTH_SHORT).show(); 
     return true; 
    case R.id.medium: 
     Toast.makeText(this, "Medium chosen", Toast.LENGTH_SHORT).show(); 
     return true; 
    case R.id.hard: 
     Toast.makeText(this, "Hard chosen", Toast.LENGTH_SHORT).show(); 
     return true; 
    case R.id.other: 
     Toast.makeText(this, "Other chosen", Toast.LENGTH_SHORT).show(); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent retIntent) { 
    // Check which request we're responding to 
    if (requestCode == SCORE_REQUEST_CODE) { 
     // Make sure the request was successful 
     if (resultCode == RESULT_OK) { 
      if (retIntent.hasExtra("GAME_SCORE")) { 
       int scoreFromGame = retIntent.getExtras().getInt("GAME_SCORE"); 
       tvScore.setText(Integer.toString(scoreFromGame)); 
      } 
     } 
    } 

} 


} 

Comme toujours, toute aide grandement appréciée.

Merci

+0

essayez de surcharger l'onBackPressed() d'activité et démarrez l'activité avec l'aide de l'intention qui peut vous donner l'effet désiré, aussi commentez le super.onBackPressed() de onBackPressed() –

Répondre

0

utilisation onBackPressed.

@Override 
public void onBackPressed() { 
    Intent i= new Intent(your_present_activity.this,the_activity_you_want_to_jump_to.class); 
    startActivity(i); 
    finish(); 
} 

Vous pouvez prendre votre score Main.class en utilisant newintent.putExtra (nom, "clé");

+0

Y at-il quelque part en particulier que je devrais mettre cette comme le remplacement est à venir avec une erreur - 'Méthode ne remplace pas la méthode de sa superclasse' –

+0

Appelez super.onBackPressed(); ne supprimez pas @override. – qwerty421

+0

Ajout de cela donne l'erreur - 'Impossible de résoudre la méthode' onBackPressed() '' –

0

Il semblerait que mon problème avec le bouton de retour ne fonctionne pas était tout à mon autre instruction dans la méthode doDraw n'ayant pas d'accolades autour des deux déclarations. Ajouté ceux et cela fonctionne bien. La méthode surfaceDestroyed est appelée automatiquement lorsque le bouton Précédent est enfoncé car cela arrête la classe gameLoopThread.

Merci à tous ceux qui essaient de m'aider.