java - 线程在进入下一个 Activity 之前保持更新一段时间,并且冲突已关闭

标签 java android multithreading surfaceview

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

第二个问题,当玩家与重物发生碰撞时,它会进入下一个 Activity (确实如此),但是它会将屏幕上的所有物体猛拉大约一秒钟,然后继续进行下一个 Activity 。对此有什么想法吗?我感觉这与我处理线程或关闭线程的方式有关。查看下面的 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

最佳答案

感谢您的视频;现在我明白了“ SCSS ”的部分。

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

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 表面是双缓冲或三缓冲的。因此,如果您只是继续调用 lock/post 而不绘制任何内容,您将循环浏览最后两三帧。

简单规则:如果锁定表面,则需要绘制。如果您不想在游戏结束时绘制,则需要在锁定 Canvas 之前将“游戏结束”测试放回去。

关于java - 线程在进入下一个 Activity 之前保持更新一段时间,并且冲突已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23250117/

相关文章:

java - 没有找到类 org.json.JSONObject 的序列化器,也没有发现创建 BeanSerializer 的属性

TableView 中的 JavaFX 单元格颜色

android - 从另一个类访问 TextView

android - 在 ListView 的列表项底部添加阴影

C++ pThread 程序未运行完成

Java Swing - 在 JTextPane 中插入组件(JTextArea)的问题

android - 为我的应用程序接收 Intent "android.settings.APPLICATION_DETAILS_SETTINGS"

c++ - 如何要求接口(interface)中参数的线程安全性?

java - 跨线程访问异常: How to implement?

java - 排除 Spring MVC Controller 的请求映射中的某些路径