在进行下一个活动并且冲突关闭之前,线程会持续更新一段时间

时间:2014-04-23 16:23:55

标签: java android multithreading surfaceview

我有一个小小的Android游戏,我一直在努力,并且还基于代码here实现了一些像素完美碰撞检查(我说基于,我唯一改变的是类名) 。这曾经在几个月前工作正常,但我停止了一段时间的开发,回来后不得不重建包括那些的很多代码。现在,当我实施碰撞时,看起来非常可怕。如果较大的重量在玩家的左侧,那么距离很远,但仍然算作碰撞。我也注意到玩家可以通过一些较小的重量,但不能完全通过。 我知道玩家有一些不透明的白色像素并没有帮助,但我尝试使用透明的小图像并且发生了同样的事情。我编辑了播放器图像以删除白色像素,但我仍然得到奇怪的碰撞检测。有什么想法吗?

第二个问题,当玩家与一个重量发生碰撞时,它会转到下一个活动(它会这样做)但是它会在屏幕上猛拉所有对象大约一秒钟,然后进入下一个活动。有什么想法吗?我有一种感觉,我处理线程的方式,或我关闭它的方式。检查下面的GitHub链接,找到GameThread类,它处理表面线程上的主要操作。

碰撞代码可以在上面的链接中找到,我的课程调用可以在下面找到:

// handles game over circumstances
                if (CollisionUtil.isCollisionDetected(player.getBitmap(), player.getX(), player.getY(), weight.getBitmap(), weight.getX(), weight.getY())) {
                    Intent gameOverIntent = new Intent(this.getContext(), GameOverActivity.class);
                    player.setTouched(false);
                    this.getContext().startActivity(gameOverIntent);
                    ((Activity) this.getContext()).finish();
                    save(score, time);
                    try {
                        gameTimers.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    gameOver = true;
                }

其他类和我的所有其他代码可以在这里找到:https://github.com/addrum/Francois/tree/master/src/com

提前感谢您的帮助。

编辑:忘记提及如果您需要测试它(您可能会看到我正在谈论的内容),您可以在此处下载:https://play.google.com/store/apps/details?id=com.main.francois

编辑:我现在在YouTube上上传了一段简短的录音,以便更容易看到我在谈论的内容:http://youtu.be/vCjKmTmhabY

1 个答案:

答案 0 :(得分:2)

感谢您的视频;现在我明白了" jerk"一部分。

对此的解释很简单:您的代码正在执行此操作(简化):

while (running) {
    canvas = this.surfaceHolder.lockCanvas();
    this.gameLogic.update();
    this.gameLogic.render(canvas);
    surfaceHolder.unlockCanvasAndPost(canvas);
}

public void render(Canvas canvas) {
    if (!gameOver) {
        ...draw...
    }
}

如果gameOver为真,则render()函数不会绘制任何内容,因此您可以获得缓冲区的先前内容。

您可能希望这显示从此帧之前的帧中提取的内容。但是,SurfaceView表面是双缓冲或三缓冲。因此,如果您只是在不绘制任何内容的情况下继续调用锁定/发布,那么您将在最后两到三帧中循环。

简单规则:如果锁定曲面,则需要绘制。如果你不想在游戏结束时画画,你需要把你的游戏放在"在锁定画布之前测试一下。