2016-04-18 10 views
0

SharedPreferencesを使用してゲームが終了したときに最終スコアを上げようとすると、アンドロイドアプリがクラッシュします。アプリはonTouchEventの内部でクラッシュします。ゲームはそれSVGameOverクラスに持ち越さ、そこに表示するSVGameView内にある最終スコア終了時SharedPreferencesを使用して最終スコアを引き継ぐときにクラッシュする

SharedPreferences.Editor editor = mySharedPreferences.edit(); 

アイデアがあります。もし誰かがアドバイスをくれれば素晴らしいだろう!

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

+0

logcatのクラッシュログを投稿してください。 –

+3

'mySharedPreferences'は、使用しようとしているクラスで初期化することはありません。 – codeMagic

+0

簡単にコピー&ペーストできるコードのスクリーンショットを使用しないでください。書式設定について心配しないで、誰かがそれを修正することができます。 –

答えて

0

あなたが不足している:

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

があるので、mySharedPreferencesは常にnullです。

0

あなたはmySharedPreferencesSVGameView(Context context)でご参考にSharedPreferencesオブジェクトを割り当てる逃した - あなたはSharedPreferenceオブジェクトを右に初期化されていません

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

@Shadab Ansariありがとう、これはクラッシュを停止しました。私はまだ画面上でゲームの上で最終スコアを渡すことができません。何か案は? – user3353568

+0

apply()を使用して値をコミットします。 - editor.putString( "cScore"、String.valueOf(countScore))。apply(); –

0

に変更し、それを

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

this libraryを使用すると、 SharedPreferencesの使用が簡単になり、より簡単に使用できます。

アンドロイド-SharedPreferencesヘルパーデフォルトのAndroid SharedPreferencesクラスの使用を簡素化します。開発者はいくつかの行で行うことができます。 のコードが必要です。 にシンプルで、使いやすいデフォルトのクラスと比べて理解しています。

関連する問題