baidu_34964056 2016-05-29 08:35 采纳率: 50%
浏览 1183
已结题

Android问题 贪吃蛇程序报错

图片说明

这里调用就报错:

    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条回答

  • jian_cheng_90 2016-05-29 15:15
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示