Android问题 贪吃蛇程序报错 40C

图片说明

这里调用就报错:

    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;

    }




    下面是代码:

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 ;

}

}

2个回答

只要在run()方法中加入 Looper.prepare()就可以解决问题了,但是出现这种问题的原因是因为Android中不能在子线程中来刷新UI线程。建议是在你的子线程中添加hander来发送消息更新线程。

第二行log 很明显. 意思是在在非UI线程刷新UI需要调用Looper.prepare()方法

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!