2013-04-13 62 views
0

我剛剛回到android java中,並且正在製作一個快速遊戲, 。當試圖定義我的「畫布」Holder.lockCanvas();正在返回一個「空值」(我認爲命令本身可能會失敗)。我已經檢查,如果表面是通過執行以下操作有效:當使用「canvas = Holder.lockCanvas();」時,canvas爲空; Android Java

if (!ourHolder.getSurface().isValid()) 
       continue; 

代碼的其餘部分是下面如果需要的話,這個問題是在底部附近,在課堂上運行。

package creo.novus.tetris; 

import java.util.Random; 
import creo.novus.tetris.R; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class Main_game extends Activity implements OnTouchListener { 

float touch_x, touch_y, screen_height, screen_width, game_height; 
boolean once = true; 

Bitmap left_pressed, left_unpressed, right_pressed, right_unpressed, 
     rotate_pressed, rotate_unpressed; 

Canvas canvas; 
Random generator = new Random(); 

GameView TetView; 

int score; 
float left_x; 
float left_y; 
float right_y; 
float right_x; 
float rotate_y; 
float rotate_x; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    TetView = new GameView(this); 
    TetView.setOnTouchListener(this); 

    left_unpressed = BitmapFactory.decodeResource(getResources(), 
      R.drawable.left_unpressed); 
    left_pressed = BitmapFactory.decodeResource(getResources(), 
      R.drawable.left_pressed); 
    right_unpressed = BitmapFactory.decodeResource(getResources(), 
      R.drawable.right_unpressed); 
    right_pressed = BitmapFactory.decodeResource(getResources(), 
      R.drawable.right_pressed); 
    rotate_unpressed = BitmapFactory.decodeResource(getResources(), 
      R.drawable.rotate_unpressed); 
    rotate_pressed = BitmapFactory.decodeResource(getResources(), 
      R.drawable.rotate_pressed); 

    setContentView(TetView); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    TetView.resume(); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    TetView.pause(); 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 

    touch_x = event.getX(); 
    touch_y = event.getY(); 

    return true; 
} 

public class GameView extends SurfaceView implements Runnable { 

    SurfaceHolder ourHolder; 
    Thread gameThread = null; 
    boolean isRunning = false; 
    Thread tetThread = null; 

    public GameView(Context context) { 
     super(context); 

     gameThread = new Thread(this); 
     tetThread = new Thread(this); 
     ourHolder = getHolder(); 
    } 

    public void pause() { 
     isRunning = false; 
     while (true) { 
      try { 
       gameThread.join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      break; 
     } 
     gameThread = null; 
     tetThread = null; 
    } 

    public void resume() { 

     gameThread.start(); 
     tetThread.start(); 
     isRunning = true; 
    } 

    public void run() { 

     // TODO Auto-generated method stub 

     while (isRunning) { 
      if (!ourHolder.getSurface().isValid()) 
       continue; 

      canvas = ourHolder.lockCanvas(); 
      canvas.drawRGB(137, 137, 137); 

      if (once) { 
       // Initialization 
       Paint myPaint = new Paint(); 
       myPaint.setColor(Color.BLACK); 
       myPaint.setStyle(Paint.Style.FILL); 
       myPaint.setTextSize(12); 

       screen_height = canvas.getHeight(); 
       screen_width = canvas.getWidth(); 

       game_height = (screen_height/6) * 5; 

       int button_height = (int) (screen_height - game_height); 

       rotate_x = (screen_width/4); 
       rotate_y = ((screen_height/6) * 5); 

       right_x = (screen_width/4) * 3; 
       right_y = rotate_y; 

       left_x = 0; 
       left_y = rotate_y; 

       Bitmap.createScaledBitmap(left_pressed, 
         (int) (screen_width/4), button_height, true); 
       Bitmap.createScaledBitmap(left_unpressed, 
         (int) (screen_width/4), button_height, true); 
       Bitmap.createScaledBitmap(right_pressed, 
         (int) (screen_width/4), button_height, true); 
       Bitmap.createScaledBitmap(right_unpressed, 
         (int) (screen_width/4), button_height, true); 
       Bitmap.createScaledBitmap(rotate_pressed, 
         (int) (screen_width/2), button_height, true); 
       Bitmap.createScaledBitmap(rotate_unpressed, 
         (int) (screen_width/2), button_height, true); 

       once = false; 
      } 

      if (touch_y >= rotate_y) { 
       if (touch_x < rotate_x) { 

        canvas.drawBitmap(left_pressed, left_x, left_y, null); 

        canvas.drawBitmap(rotate_unpressed, rotate_x, rotate_y, null); 

        canvas.drawBitmap(right_unpressed, right_x, right_y, null); 

       }else if(touch_x < right_x){ 

        canvas.drawBitmap(left_unpressed, left_x, left_y, null); 

        canvas.drawBitmap(rotate_pressed, rotate_x, rotate_y, null); 

        canvas.drawBitmap(right_unpressed, right_x, right_y, null); 

       }else{ 

        canvas.drawBitmap(left_unpressed, left_x, left_y, null); 

        canvas.drawBitmap(rotate_unpressed, rotate_x, rotate_y, null); 

        canvas.drawBitmap(right_pressed, right_x, right_y, null); 

       } 

      } 

     } 
    } 

} 

} 

任何幫助都將不勝感激,謝謝你的時間。

回答

1

我發現了錯誤,程序沒有在第一個週期失敗,它在第二個週期失敗。原因是我沒有在週期結束時解鎖畫布(我還沒有到那個部分)。對於所有出現同樣問題的人,解鎖的命令是nameofholder.unlockCanvasAndPost(nameofcanvas);