2013-04-08 89 views
0

嗨我想在我的android遊戲中實現一個'圖像得分計數器',但它不能很好地工作。但是它編譯良好,但很快,當球到達屏幕邊緣應用程序將返回錯誤:如何在android遊戲中添加分數計數器?

04-08 10:07:31.639: E/AndroidRuntime(8599): FATAL EXCEPTION: Thread-1176 
04-08 
10:07:31.639: E/AndroidRuntime(8599): java.lang.NullPointerException 
04-08 10:07:31.639: E/AndroidRuntime(8599):at com.Pong.GameState.update(GameState.java:154) 
04-08 10:07:31.639: E/AndroidRuntime(8599):at com.Pong.GameThread.run(GameThread.java:41) 

我有3個文件是三陪遊戲: GameState.java GameView.java GameThread.java:

的錯誤是在:

GameState.java:

TopCounter.setImageResource(myImageList[i+1]); 

石榴石hread.java:

_state.update(); 

這是GameThread.java的樣子:

package com.Pong; 

import.... 

    class GameThread extends Thread { 
     private SurfaceHolder surfaceHolder; 
     private GameView gameView; 
     private Paint _paint; 
     private GameState _state; 
     private boolean run = false; 
     public GameThread(SurfaceHolder surfaceHolder, GameView gameView, Context context, Handler handler) { 
      this.surfaceHolder = surfaceHolder; 
      this.gameView = gameView; 
      _paint = new Paint(); 
      _state = new GameState(); 
     } 

     public void setRunning(boolean run) { 
      this.run = run; 
     } 

     public SurfaceHolder getSurfaceHolder() { 
      return surfaceHolder; 
     } 

     @Override 
     public void run() { 
      Canvas c; 
      while (run) { 
       c = null; 

       try { 
        c = surfaceHolder.lockCanvas(null); 

        synchronized (surfaceHolder) { 
         gameView.onDraw(c); 
         _state.update(); //here is the error 
         _state.draw(c, _paint); 
        } 
       } finally { 
        if (c != null) { 
         surfaceHolder.unlockCanvasAndPost(c); 
        } 
       } 
      } 
     } 


public GameState getGameState() 
{ 
return _state; 
} 
} 

這是GameState.java的樣子(我削減不必要的線路):

package com.Pong; 

Import ... 

public class GameState extends Activity implements View.OnTouchListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gamestate); 
     TopCounter = (ImageView) findViewById(R.id.counterT); 
     BottomCounter = (ImageView) findViewById(R.id.counterB); 

} 
    int _screenWidth = 270; 
    int _screenHeight = 395; 
    int _ballSize = 10; 
    int _ballX = 100; 
    int _ballY = 100; 
    int _ballVelocityX = 3; 
    int _ballVelocityY = 3; 
    int _batLength = 75; 
    int _batHeight = 10; 
    int _topBatX = (_screenWidth/2+25) - (_batLength/2); 
    int _topBatY = 54; 
    int _bottomBatX = (_screenWidth/2+25) - (_batLength/2); 
    int _bottomBatY = 392; 
    int i=0; 
    // under is matrix that contains images to my counter. 
    int[] myImageList = new int[]{ 
      R.drawable.counter00, 
      R.drawable.counter01, 
      R.drawable.counter02, 
      R.drawable.counter03, 
      R.drawable.counter04, 
      R.drawable.counter05, 
      R.drawable.counter06, 
      R.drawable.counter07, 
      R.drawable.counter08, 
      R.drawable.counter09 
      }; 
    ImageView TopCounter; 
    ImageView BottomCounter; 

    public GameState() 
    {} 

    public void update() { 

     _ballX += _ballVelocityX; 
     _ballY += _ballVelocityY; 


    if(_ballY > _screenHeight){ 
      _ballX = _screenWidth/2; 
      _ballY = _screenHeight/2; 
      TopCounter.setImageResource(myImageList[i+1]); //here is the error 
      _toppoint=_toppoint+1; 
      _topBatX =_screenWidth/2-10; 
      _bottomBatX =_screenWidth/2-10; 
      }  

     if(_ballY < 50){ 
      _ballX = _screenWidth/2; 
      _ballY = _screenHeight/2; 
      BottomCounter.setImageResource(myImageList[i+1]); 
      _bottompoint=_bottompoint+1; 
      _topBatX =_screenWidth/2-10; 
      _bottomBatX =_screenWidth/2-10; 
      } 
     if (_toppoint==9){ 

     } 
     else if (_bottompoint==9) { 

     } 

     if(_ballX > _screenWidth || _ballX <= 40){ 
      _ballVelocityX *= -1; 
      } 
     if(_ballX > _topBatX && _ballX < _topBatX+_batLength && _ballY < _topBatY){ 
      _ballVelocityY *= -1; 
     } 
     if(_ballX > _bottomBatX && _ballX < _bottomBatX+_batLength && _ballY > _bottomBatY){ 
      _ballVelocityY *= -1; 
     } 
     if (_ballX == 40+_batLength) { 
      _topBatX=40; 
      } else if (_ballX > 40+_batLength && _ballX <= _screenWidth){ 
       _topBatX=_ballX-_batLength+6; 
       } 
     if (_bottomBatX < 46) { 
      _bottomBatX=46; 
     } else if (_bottomBatX+_batLength > _screenWidth){ 
      _bottomBatX=_screenWidth-_batLength+6; 
     } 
     } 
    public void draw(Canvas c, Paint paint) { 
    paint.setARGB(255, 234, 222, 199); 
    c.drawRect(new Rect(_ballX,_ballY,_ballX + _ballSize,_ballY + _ballSize), paint); 
    c.drawRect(new Rect(_topBatX, _topBatY, _topBatX + _batLength, _topBatY + _batHeight), paint); //top bat 
    c.drawRect(new Rect(_bottomBatX, _bottomBatY, _bottomBatX + _batLength, _bottomBatY + _batHeight), paint); //bottom bat 
    } 


} 

在我的XML文件中:

<ImageView 
     android:id="@+id/counterT" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/counter00" 
     android:layout_gravity="left|center_vertical" 
     /> 
     <ImageView 
     android:id="@+id/counterB" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/counter00" /> 

任何人都可以幫忙嗎?

+0

創建應用程序變量 – 2013-04-08 08:26:34

+0

@NiravRanpara請參閱我的編輯答案 – Elior 2013-04-08 10:56:43

回答

0

我認爲這是GameState.java你的問題的文件

// under is matrix that contains images to my counter. 
int[] myImageList = new int[]{ 
     R.drawable.counter00, 
     R.drawable.counter01, 
     R.drawable.counter02, 
     R.drawable.counter03, 
     R.drawable.counter04, 
     R.drawable.counter05, 
     R.drawable.counter06, 
     R.drawable.counter07, 
     R.drawable.counter08, 
     R.drawable.counter09 
     }; 

這不是你如何聲明一個矩陣!你想要一個整數數組 嘗試聲明爲:

int[] myImageList = { 
    R.drawable.counter00, 
    R.drawable.counter01, 
    R.drawable.counter02, 
    R.drawable.counter03, 
    R.drawable.counter04, 
    R.drawable.counter05, 
    R.drawable.counter06, 
    R.drawable.counter07, 
    R.drawable.counter08, 
    R.drawable.counter09 
    }; 

編輯:

if (TopCounter != null){ 
     TopCounter.setImageResource(myImageList[i]); 
     i++; 
    } 

你也不會增加你列出指標,它總是等於0,而不是說 初始化索引爲1,然後當您將圖像源增量更改爲1 但您還需要檢查索引是否不超過列表大小

+0

我改變了,但同樣的錯誤發生。 – NightKn8 2013-04-08 10:10:13

+0

嘗試添加一個if語句來檢查TopCounter是否爲空並進行調試..看到我編輯的答案 – Elior 2013-04-08 10:54:08

+0

相同:(我認爲這是關於線程和state.update()的失敗。 – NightKn8 2013-04-08 12:46:30