Android问题我写了个贪吃蛇报这个错误

cuowu

代码:public class GameThread extends Thread {

private GameView view;
private SurfaceHolder holder;
public boolean pauseFlag = false;// 是否暂停

public GameThread(GameView view) {
    this.view = view;
    holder = view.getHolder();
}

@Override
public void run() {

    Canvas canvas;
    while (true) {
        canvas = null;
        if (!pauseFlag) {
            try {
                canvas = holder.lockCanvas();
                synchronized (holder) {
                    view.drawGame(canvas);
                }

            } finally {
                if (canvas != null) {
                    holder.unlockCanvasAndPost(canvas);
                }
            }

        }
        try {
            Thread.sleep(200);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

}

public class MainActivity extends Activity {
private GameView gameView;
private GestureDetector gestureDetector;// 处理手势

public int fx = 0; // 食物的X坐标
public int fy = 0;// 食物的Y坐标
public int size = 16; // 蛇身的大小
public int changdu = 2;// 蛇身长度
public int direction = 3;// 蛇的移动方向,分别使用 0上,1下,2左,3右

public int x = 16; // 移动的X坐标
public int y = 16; // 移动的Y坐标

public int x1 = 0; // 障碍物X坐标
public int y1 = 0; // Y坐标


public ArrayList<int[]> path = new ArrayList<int[]>();// 记录运行的路径
public HashMap<Integer, Integer> roadBlock = new HashMap<Integer, Integer>();// 障碍物

public int screenW; // 屏幕的宽度
public int screenH; // 屏幕的高度

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 初始化视图
    initView();
    // 初始化地图
    initMap();
    // 初始化游戏(手势)
    initGame();
}

private void initGame() {
    gestureDetector = new BuileGesture(this, new BuileGesture.OnGestureResult() {

        @Override
        public void onGestureResult(int direction) {
            // 获取从手势处理类得到的手势方向
            MainActivity.this.direction = direction;
            Toast.makeText(MainActivity.this, "方向:" + direction, Toast.LENGTH_SHORT).show();
        }
    }).Builde();
}

private void initMap() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    screenW = metrics.widthPixels;
    screenH = metrics.heightPixels;

    // 初始化食物
    Random rd = new Random(System.currentTimeMillis());
    int tempX = rd.nextInt(screenW / 16);
    int tempY = rd.nextInt(screenH / 16); // ...

    fx = tempX * 16;
    fy = tempY * 16;

// 初始化障碍物

    x1=screenW/2;
    y1=screenH/2;

}

private void initView() {
    // 去标题栏
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // 设置全屏
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    // 绑定视图
    gameView = new GameView(MainActivity.this);
    setContentView(gameView);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // 将触摸事件和手势处理类绑定到一起
    return gestureDetector.onTouchEvent(event);
}

@Override
public void onResume() {
    super.onResume();
    // 游戏继续或重新开始
    // ... ...
    Toast.makeText(MainActivity.this, "游戏开始", Toast.LENGTH_SHORT).show();
    gameView.gameThread.pauseFlag = false;
}

@Override
protected void onPause() {
    super.onPause();
    // 游戏暂停
    // ... ...
    gameView.gameThread.pauseFlag = true;

}

@Override
public void onStop() {
    super.onStop();
    // 游戏结束
    // ... ...
    Toast.makeText(MainActivity.this, "游戏结束", Toast.LENGTH_SHORT).show();
    gameView.gameThread.pauseFlag = true;
    return ;

}

}

public class GameView extends SurfaceView implements SurfaceHolder.Callback {

public GameThread gameThread;
private Canvas canvas;
private Paint paint;
private MainActivity activity;

public GameView(Context context) {
    super(context);
    activity = (MainActivity) context;

    this.getHolder().addCallback(this);
    gameThread = new GameThread(this);
    paint = new Paint();
    paint.setAntiAlias(true);
}

// 画游戏界面
public void drawGame(Canvas canvas) {
    // 给游戏画背景
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pg3);
    Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    Rect dst = new Rect(0, 0, activity.screenW, activity.screenH);
    canvas.drawBitmap(bitmap, src, dst, paint);

    // 画食物
    paint.setColor(Color.RED);
    canvas.drawRect(activity.fx, activity.fy, activity.fx + activity.size, activity.fy + activity.size, paint);
    // 画标题
    paint.setColor(Color.BLUE);
    paint.setTextSize(50);
    canvas.drawText("经典贪吃蛇", activity.screenW / 2 - 120, 50, paint);

    // 画障碍物
    // 设置top和botom墙面;
    paint.setColor(Color.BLUE);
    canvas.drawRect(0, 0, 0 + activity.size, activity.screenH + activity.size, paint);
    canvas.drawRect(0, 0, activity.screenW + activity.size, 0 + activity.size, paint);
    canvas.drawRect(activity.screenW - 16, activity.screenH, activity.screenW - 16 + activity.size,
            0 + activity.size, paint);
    canvas.drawRect(activity.screenW, activity.screenH - 16, 0 + activity.size,
            activity.screenH - 16 + activity.size, paint);
    // 障碍物
    canvas.drawRect(activity.screenW / 2 - 80, activity.screenH / 2, activity.screenW / 2 + 80 + activity.size,
            activity.screenH / 2 + activity.size, paint);

    // canvas.drawRect(0, activity.y1, 0 + activity.size, activity.y1 +
    // activity.size, paint);

    // 蛇身移动
    switch (activity.direction) {
    case 0:// 上
        activity.y = activity.y - activity.size;
        break;
    case 1:// 下
        activity.y = activity.y + activity.size;
        break;
    case 2:// 左
        activity.x = activity.x - activity.size;
        break;
    case 3:// 右
        activity.x = activity.x + activity.size;
        break;
    }
    // 临界值处理
    if (activity.x > activity.screenW) {
        activity.x = 0;
    }
    if (activity.x < 0) {
        activity.x = activity.screenW / 16 * 16;
    }

    if (activity.y > activity.screenH) {
        activity.y = 0;
    }
    if (activity.y < 0) {
        activity.y = activity.screenH / 16 * 16;
    }
    // 保存路径
    int[] p = new int[2];
    p[0] = activity.x;
    p[1] = activity.y;
    activity.path.add(p);
    // 保持蛇身长度
    if (activity.path.size() > activity.changdu) {
        activity.path.remove(0);
    }
    // 蛇移动,将运行路径画出来
    paint.setColor(Color.GREEN);
    for (int[] m : activity.path) {
        canvas.drawRect(m[0], m[1], m[0] + activity.size, m[1] + activity.size, paint);
    }

    // if(ap[activity.x][activity.y]==Contants.STAR_GREEN){
    // //如果撞到墙或者自己,则死亡;
    //// System.out.println(Contants.currentMap[x][y]);
    // activity.changdu=0;
    //
    //
    // }

    // .碰到了自己
    // Look for collisions with itself
    int snakelength = activity.changdu;
    for (int snakex = 0; snakex < snakelength; snakex++) {

        if (snakex == p[0]) {
            for (int snakey = 0; snakey < snakelength; snakey++) {
                if (snakey == p[1]) {

                    //activity.onStop();
                    return;
                }
            }
        }
    }

    // 撞障碍物

    if ((p[0] >= activity.x1 - 80) && (p[0] <= activity.x1 + 80) && (p[1] >= activity.y1 - 16)
            && (p[1] <=activity.y1 + 16)) {
        activity.onStop();
        return;

    }

    // 撞墙
    if ((p[0] < 16) || (p[1] < 16) || (p[0] > activity.screenW - 16) || (p[1] > activity.screenH - 16)) {

        activity.onStop();

        // activity.onResume();
        return;

    }

    // 吃食物
    if (activity.path.get(activity.path.size() - 1)[0] == activity.fx
            && activity.path.get(activity.path.size() - 1)[1] == activity.fy) {
        activity.changdu++;
        // 重新放置食物

        Random rd = new Random(System.currentTimeMillis());
        int tempX = rd.nextInt(activity.screenW / 16);
        int tempY = rd.nextInt(activity.screenH / 16);
        activity.fx = tempX * 16;
        activity.fy = tempY * 16;
    }

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    gameThread.start();

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // TODO Auto-generated method stub

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

}