我一直在努力解决这个问题,但无济于事。

我在GameView类中使用int hitCount方法内的onTouchEvent获得了一个分数。这很好。我需要做的是将总分传递给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));
                }
            }
        }
    }
}


任何建议,不胜感激。

谢谢

更新:

我添加了“ return hitCount;”到“ GameView”类中的“ getHitCount”方法,现在按回车键会导致应用程序崩溃。在“ MainMenu”类中,我取出了“ onActivityResult”方法的最后一行(tvScore.setText(Integer.toString(scoreFromGame));它不再崩溃,但显然不会传递分数。不知道从这里去哪里。

最佳答案

从意图中获取数据时,您必须使用-

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


而不是试图从演员中获取价值。

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


仅当您将某些价值放入捆绑包中时,才使用附加功能。

10-08 14:57