java - 正确覆盖 onStop() 和 onRestart() 调用,但不会执行以下代码
问题描述
我目前正在 Android Studio 中开发一款结合了 Java 和 Android 的游戏。
我的问题:当我关闭应用程序时,等待几秒钟并返回应用程序,它仍然在后台运行。这会导致游戏对象继续移动,这显然总是导致游戏结束。
我在我的游戏中实现了一个“暂停”函数/方法,可以通过暂停按钮访问,但在我关闭应用程序时也应该调用它。这应该会在我关闭应用程序时暂停游戏,并在我返回应用程序时暂停。
我还实现了一个“恢复”函数/方法来退出暂停屏幕,当我重新进入我的应用程序时也应该调用它。
当我的活动引发 onStop() 和 onRestart() 方法时,“public void pause()”和“public void resume()”这两种方法都会被正确调用,但它们不会像通过暂停按钮调用时通常所做的那样。
我用一个简单的 System.out.println(""); 这向我表明,当我关闭或重新进入我的应用程序时,我的 pause() 和 resume() 方法会被调用。但他们实际上并没有做他们背后的逻辑(暂停游戏)
我的 MainActivity 类
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
scene = new GameplayScene();
@Override
protected void onStop() {
super.onStop();
scene.pause(); //
System.out.println("stopped"); //testing purposes
}
@Override
protected void onRestart() {
super.onRestart();
scene.resume();
System.out.println("restarted"); //testing purposes
}
}
还有我的 GamePlayScene 类
public void pause() {
System.out.println("Pause Method Called");//works
paused = true;
timeScale = 0; //this freeze all movement (game pause)
pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.resumesymbol);
}
public void resume() {
System.out.println("Resume Method Called");
paused = false;
timeScale = 1; //this unlocks every movement again (game resume)
touchable = true;
pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.pausesymbol);
}
正如我所说:每个必要的方法都被正确调用。
I/System.out:暂停方法调用 I/System.out:停止
I/System.out:恢复方法调用 I/System.out:重新启动
为什么它实际上并没有暂停游戏,而是继续移动对象?
编辑:
我的按钮只是一个矩形,100x100 像素,浮动在右上角。按钮通过 pausebutton.png 的位图显示,我检查按钮是否已被以下内容按下:
public void pause(float touchX, float touchY) {
if (pauseRect.contains((int)touchX,(int) touchY)) {
paused = true;
timeScale = 0;
pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.resumesymbol);
}
}
这是按钮的暂停方法。用户在物理按钮上调用此方法 - 您在上面看到的另一个暂停方法应该通过关闭应用程序来调用(它工作得非常好,但在它关闭的那一刻它不会在方法中执行其他操作)
该方法的详细作用:设置布尔值 paused = true; 设置 int timeScale = 0
gameloop 总是在我的播放器类的每一帧上调用 update(),在这个 update() 方法中,它设置速度 * timeScale,导致在 timeScale = 0 时停止运动。
这一切都适用于我的暂停按钮,但不适用于 onRestart()
解决方案
推荐阅读
- google-cloud-platform - 删除 BigQuery 中数组之间的重复值
- google-cloud-platform - 如何在其区域之外私下共享 Google Cloud SQL
- tsql - SQL 根据 3 个日期范围返回一个值
- vue.js - 为 Vuetify v-file-input 提供初始文件名值
- python - Buttonpress 上的 Kivy Python Recycleview 更新
- javascript - 通过动态生成在屏幕上和屏幕外为 SVG 对象设置动画
- scheduling - 花费无限时间来满足约束并产生输出的问题
- python-3.x - 如何提高多线程生成图像的执行时间
- apache - 到 nextcloud 服务器的 Apache2 反向代理不起作用
- qt - QT QML - 更改 Mapbox 字体大小