Получение оценки от одного действия к другому в приложении для Android

Я пытался решить это, но безрезультатно.

У меня есть оценка, полученная в классе 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));
                }
            }
        }
    }
}

Любые советы очень ценятся.

Спасибо

ОБНОВИТЬ:

Я добавил «вернуть hitCount»; к методу «getHitCount» в классе «GameView», и теперь это просто приводит к сбою приложения, когда я нажимаю клавишу «Назад». В классе «MainMenu» я удалил последнюю строку в методе «onActivityResult» (tvScore.setText(Integer.toString(scoreFromGame)); и он больше не дает сбоев, но, очевидно, не передает счет. не знаю, куда идти отсюда.


person Phil Adams    schedule 29.03.2017    source источник
comment
что случилось? Ошибка в коде?   -  person miljon    schedule 29.03.2017
comment
Попробуйте tvScore.setText(scoreFromGame + "");   -  person Yonah Karp    schedule 29.03.2017
comment
вы делаете ``` returnIntent.putExtra(GAME_SCORE, gameView.getHitCount()); ``` но тип возврата getHiCount недействителен, можете ли вы объяснить, почему   -  person dsharew    schedule 29.03.2017


Ответы (1)


При извлечении данных из намерения вы должны использовать -

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

Вместо того, чтобы пытаться получить выгоду от дополнительных услуг.

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

Используйте дополнительные услуги только тогда, когда вы вкладываете какую-то ценность в пакет.

person Rahul    schedule 29.03.2017
comment
Я немного смущен тем, что вы поставили. У меня есть вторая строка, которую вы указали в моем классе «MainMenu». Вы говорите, что я должен заменить это первой строкой? - person Phil Adams; 29.03.2017
comment
Да в onActivityResult MainMenu - person Rahul; 29.03.2017
comment
Когда я это делаю, он выделяет GAME_SCORE и заявляет, что его нельзя применить к строке. - person Phil Adams; 29.03.2017
comment
О, я забыл добавить точку с запятой в конце. Пожалуйста, вставьте его. - person Rahul; 29.03.2017
comment
У меня стоит точка с запятой. это не проблема - person Phil Adams; 29.03.2017
comment
Добавить значение по умолчанию в качестве второго параметра - person Rahul; 29.03.2017
comment
Опять же, не уверен, что вы имеете в виду - person Phil Adams; 29.03.2017
comment
Давайте продолжим обсуждение в чате. - person Rahul; 29.03.2017
comment
На данный момент невозможно. Я пока побреду. Спасибо за ваши старания - person Phil Adams; 29.03.2017
comment
Теперь все в порядке. Я не просил его найти текстовое поле, содержащее оценку (findValueByID) и т. д. - person Phil Adams; 29.03.2017