I am just now getting back into android java, and was making a quick game by following the template of one I had made before (successfully). When trying to define my "canvas" the Holder.lockCanvas(); is returning a "null" value (I think the command itself may be failing). I am already checking if the surface is valid by doing the following:
if (!ourHolder.getSurface().isValid())
continue;
The rest of the code is below if it is needed, the problem is near the bottom, in the class run.
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);
}
}
}
}
}
}
Any help at all would be appreciated, thank you for your time.
I Found the error, the program wasn't failing on the first cycle it was failing on the second. The reason for this is I wasn't unlocking the canvas at the end of the cycle (I hadn't got to that part yet). For all those who had the same problem the command to unlock is nameofholder.unlockCanvasAndPost(nameofcanvas);