我有一个我一直在开发的小 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/