0

私はこれを解決することを試みてきましたが、役に立たなかった。Androidアプリで1つのアクティビティから別のアクティビティにスコアを取る

私は、onTouchEventメソッド内のint hitCountを使用してGameViewクラスで得られたスコアを持っています。これはうまく計算されています。私がする必要があるのは、合計得点をMainMenuクラスに渡し、「ヒット数の合計」です。

私はGameActivityクラスでは、この '完了' の方法があります:

public void finish(){ 
    Intent returnIntent=new Intent(); 
    returnIntent.putExtra("GAME_SCORE",gameView.getHitCount()); 
    setResult(RESULT_OK,returnIntent); 
    super.finish(); 
} 

GameViewクラス:

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) { 
    } 
} 

のMainMenuクラス:

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)); 
       } 
      } 
     } 
    } 
} 
を3210

アドバイスをいただければ幸いです。

おかげ

UPDATE:私が追加した

'HITCOUNTを返します;' 'GameView'クラスの 'getHitCount'メソッドに追加すると、これでバックキーを押したときにアプリケーションがクラッシュするだけです。 1つは 'MainMenu'クラスで、私は 'onActivityResult'メソッド(tvScore.setText(Integer.toString(scoreFromGame))の最後の行を取り出しました;そしてそれはもはやクラッシュしませんが、明らかにスコアを通過しません。ここからどこへ行く」がtは知っている

+1

何が問題なの?コードに誤りがありますか? – miljon

+0

'' '' 'returnIntent.putExtra(" GAME_SCORE "、gameView.getHitCount());を実行している' tvScore.setText(scoreFromGame + ""); ' –

+0

を試してください。 '' 'しかし、getHiCountの戻り値の型はvoidです。理由を説明できますか? – dsharew

答えて

2

意図からデータをフェッチしている間に、あなたが使用する必要があります - 。。

int scoreFromGame = retIntent.getIntExtra("GAME_SCORE", -1); 
// -1 is a default value, use accordingly. 

を代わりにエキストラから値を取得しようとしているの

retIntent.getExtras().getInt("GAME_SCORE"); 

使用エキストラた場合にのみあなたは束の中にいくつかの値を入れます。

+0

私はちょっとあなたが置いたもので混乱しています。私はあなたの「MainMenu」クラスで述べた2行目を持っています。私はこれを最初の行に置き換えなければならないと言っていますか? –

+0

MainMenuのonActivityResultにあります。 – Rahul

+0

私は、「GAME_SCORE」を強調表示し、文字列に適用できないと述べています。 –

関連する問題