使用SharedPreferences结转最终得分

时间:2016-04-18 21:46:43

标签: java android android-studio layout sharedpreferences

我的Android应用程序在使用SharedPreferences尝试从游戏结束时进行最终分数时崩溃。该应用程序在该行的onTouchEvent内崩溃。

SharedPreferences.Editor editor = mySharedPreferences.edit();

这个想法是当游戏结束时,SVGameView中的最终得分将继续进入SVGameOver类并在那里显示。如果有人能给出一些很棒的建议!

SVGameView:

    public class SVGameView extends SurfaceView implements Runnable {
    private SurfaceHolder holder;
    Thread thread = null;
    volatile boolean running = false;
    static final long FPS = 30;
    private Sprite sprite;
    private long lastClick;

    private Bitmap ball, gameOver;
    //private int x = 200, y = 200;
    private int scorePosX = 100;
    private int scorePosY = 100;
    private int countScore = 0;
    private int life = 1;

    SharedPreferences mySharedPreferences;

    public SVGameView(Context context) {
        super(context);
        thread = new Thread(this);
        holder = getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                running = false;
                while (retry) {
                    try {
                        thread.join();
                        retry = false;
                    } catch (InterruptedException e) {
                    }
                }
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                running = true;
                thread.start();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format,
                                       int width, int height) {
            }
        });

        ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball2);
        gameOver = BitmapFactory.decodeResource(getResources(),R.drawable.endscreen);
        sprite = new Sprite(this, ball);

        context.getSharedPreferences("myPrefsFile",Context.MODE_PRIVATE);
    }

    @Override
    public void run() {
        long ticksPS = 1000 / FPS;
        long startTime;
        long sleepTime;

        while (running) {
            Canvas c = null;
            startTime = System.currentTimeMillis();
            try {
                c = getHolder().lockCanvas();
                synchronized (getHolder()) {
                    update();
                    onDraw(c);
                }
            } finally {
                if (c != null) {
                    getHolder().unlockCanvasAndPost(c);
                }
            }
            sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
            try {
                if (sleepTime > 0)
                    thread.sleep(sleepTime);
                else
                    thread.sleep(10);
            } catch (Exception e) {}

        }
    }

    private void update(){
        sprite.update();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        Paint paint = new Paint();
        canvas.drawPaint(paint);
        paint.setColor(Color.WHITE);
        paint.setTextSize(48);
        canvas.drawText("Score: " + countScore, scorePosX, scorePosY, paint);
        canvas.drawText("Lives: " + life, 500, 100, paint);
        sprite.onDraw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if(System.currentTimeMillis()-lastClick > 300){
            lastClick = System.currentTimeMillis();
        }

        synchronized (getHolder()){
            if(sprite.isHit(event.getX(), event.getY())){
                countScore += 1;
                sprite.increase();
            }else{
                life --;
            }
        }

        if(life == 0) {
            getContext().startActivity(new Intent(getContext(), SVGameOver.class));
            //Intent intent;
            //intent = new Intent(getContext(), SVGameView.class);
            //intent.putExtra("scoreOutput", countScore);

            //Crashes Here
            SharedPreferences.Editor editor = mySharedPreferences.edit();
            editor.putString("cScore", String.valueOf(countScore));
        }
        return super.onTouchEvent(event);
    }
}

SVGameOver类:

 public class SVGameOver extends Activity implements View.OnClickListener{

    Button btnBack;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
        btnBack = (Button)findViewById(R.id.btnBack);
        btnBack.setOnClickListener(this);

        SharedPreferences mySharedPreferences = getSharedPreferences("myPrefsFile", 0);

        String theScore = mySharedPreferences.getString("cScore","");
        TextView textView = (TextView)findViewById(R.id.scoreOutput);
        textView.setText(theScore);

        //intent = getIntent();
        //String uir = intent.getStringExtra("scoreOutput");
    }

    @Override
    public void onClick(View v) {

    }
}

XML布局:

https://gyazo.com/8e49d02c66dde7ff0e7f09a4fa9eacd2

3 个答案:

答案 0 :(得分:0)

你错过了:

mySharedPreferences = context.getSharedPreferences("myPrefsFile", Context.MODE_PRIVATE);
在你的SVGameView中

,所以mySharedPreferences总是为空。

答案 1 :(得分:0)

您错过了将SharedPreferences对象分配给mySharedPreferences中的参考SVGameView(Context context) -

context.getSharedPreferences("myPrefsFile",Context.MODE_PRIVATE);

将其更改为

mySharedPreferences = context.getSharedPreferences("myPrefsFile",Context.MODE_PRIVATE);

答案 2 :(得分:0)

您没有正确初始化SharedPreference对象。 使用this library,可以简化SharedPreferences的使用,让您的生活变得更加简单。

  

Android-SharedPreferences-Helper 简化了默认Android SharedPreferences类的使用。开发人员可以做几行   代码本来需要几个。很简单   理解与默认类相比并且易于使用。

相关问题