如果启动画面打开时中断,游戏会崩溃 - LIBGDX
Game crash if interrupted while Splash Screen is on - LIBGDX
我有一个 初始屏幕 和一个 菜单屏幕 class 加载我所有的纹理图集和菜单的皮肤并处理很多东西。如果我将菜单屏幕的构造函数放在 SplashScreen 构造函数 或主游戏 class 的 create() 方法中( MyGame class) 然后它会在 phone 上没有启动画面渲染图像的情况下花费很多时间,而整个内容加载所以我将菜单 class 的加载延迟到第二个帧渲染(在第二帧的 SplashScreen 渲染方法中调用);我只是检查我是否通过了第一帧,然后我在主游戏 class 上调用一个方法来加载菜单。
一切正常,正如预期的那样,但前提是 SplashScreen 加载过程没有中断。如果我接到电话,或者我只是按下手机的主屏幕按钮,然后通过单击主屏幕上的图标重新进入游戏,我会收到 AndroidGraphics 错误:"waiting for pause synchronization took too long: assuming dead lock and killing";这是我在屏幕上看到启动画面大约一秒钟之后;
我试图在主游戏 class 和初始屏幕 class 的 hide() 和 pause() 方法中配置 MyGame,所以如果我按下 HOME 按钮它就会终止但是他们永远不会被叫到。
我该如何解决这个问题?在加载游戏时接听电话并且在您结束通话并尝试重新进入游戏后它崩溃会很烦人。
public class MyGame extends Game{
...
public MainMenu menu;
...
@Override
public void create(){
this.screen_type == SCREEN_TYPE.SPLASH;
splashScreen = new SplashScreen();
setScreen(splashScreen);
}
...
@Override
public void pause(){
//never gets called if I press the HOME button in middle of splash screen
if(this.screen_type == SCREEN_TYPE.SPLASH)
{
this.dispose();
}
}
...
public void LoadMenuTimeConsumingConstructor(){
//load all menus and process data
main_menu = new MainMenu();
loaded_menu = true;
}
}
public class SplashScreen implements InputProcessor, Screen{
public MyGame main_game;
...
public SplashScreen(MyGame game){
this.main_game = game;
}
@Override
public void pause(){
//never gets called if I press the HOME button in middle of splash screen
if(main_game.screen_type == SCREEN_TYPE.SPLASH)
{
main_game.dispose();
}
}
@Override
public void hide(){
//never gets called if I press the HOME button in middle of splash screen
if(main_game.screen_type == SCREEN_TYPE.SPLASH)
{
main_game.dispose();
}
}
@Override
public void render(delta float){
...
//wait 1.5 sec
if(TimeUtils.millis() - startTime > 1500){
{
if(main_game.loaded_menu = true){
main_game.setScreen(main_game.main_menu);
}
}
...
if(is_this_second_frame){ // we start loading menus in the second frame so we already have the splash onscreen
main_game.LoadMenuTimeConsumingConstructor();
}
...
}
}
我不太明白你的问题,但如果你没有使用 AssetManger Class,我认为这篇文章可以帮助你,我希望如此。
如果此回复无效或对您没有用,请告诉我,然后删除
维基 LibGDX
https://github.com/libgdx/libgdx/wiki/Managing-your-assets
YouTube 上的视频
https://www.youtube.com/watch?v=JXThbQir2gU
GitHub中的其他示例
https://github.com/Matsemann/libgdx-loading-screen
NEW 看这个:
Proper way to dispose screens in Libgdx
What's the right place to dispose a libgdx Screen
它可以帮助您决定是否需要调用 dipose,以及如何调用,希望对您有所帮助。
我有一个 初始屏幕 和一个 菜单屏幕 class 加载我所有的纹理图集和菜单的皮肤并处理很多东西。如果我将菜单屏幕的构造函数放在 SplashScreen 构造函数 或主游戏 class 的 create() 方法中( MyGame class) 然后它会在 phone 上没有启动画面渲染图像的情况下花费很多时间,而整个内容加载所以我将菜单 class 的加载延迟到第二个帧渲染(在第二帧的 SplashScreen 渲染方法中调用);我只是检查我是否通过了第一帧,然后我在主游戏 class 上调用一个方法来加载菜单。
一切正常,正如预期的那样,但前提是 SplashScreen 加载过程没有中断。如果我接到电话,或者我只是按下手机的主屏幕按钮,然后通过单击主屏幕上的图标重新进入游戏,我会收到 AndroidGraphics 错误:"waiting for pause synchronization took too long: assuming dead lock and killing";这是我在屏幕上看到启动画面大约一秒钟之后;
我试图在主游戏 class 和初始屏幕 class 的 hide() 和 pause() 方法中配置 MyGame,所以如果我按下 HOME 按钮它就会终止但是他们永远不会被叫到。
我该如何解决这个问题?在加载游戏时接听电话并且在您结束通话并尝试重新进入游戏后它崩溃会很烦人。
public class MyGame extends Game{
...
public MainMenu menu;
...
@Override
public void create(){
this.screen_type == SCREEN_TYPE.SPLASH;
splashScreen = new SplashScreen();
setScreen(splashScreen);
}
...
@Override
public void pause(){
//never gets called if I press the HOME button in middle of splash screen
if(this.screen_type == SCREEN_TYPE.SPLASH)
{
this.dispose();
}
}
...
public void LoadMenuTimeConsumingConstructor(){
//load all menus and process data
main_menu = new MainMenu();
loaded_menu = true;
}
}
public class SplashScreen implements InputProcessor, Screen{
public MyGame main_game;
...
public SplashScreen(MyGame game){
this.main_game = game;
}
@Override
public void pause(){
//never gets called if I press the HOME button in middle of splash screen
if(main_game.screen_type == SCREEN_TYPE.SPLASH)
{
main_game.dispose();
}
}
@Override
public void hide(){
//never gets called if I press the HOME button in middle of splash screen
if(main_game.screen_type == SCREEN_TYPE.SPLASH)
{
main_game.dispose();
}
}
@Override
public void render(delta float){
...
//wait 1.5 sec
if(TimeUtils.millis() - startTime > 1500){
{
if(main_game.loaded_menu = true){
main_game.setScreen(main_game.main_menu);
}
}
...
if(is_this_second_frame){ // we start loading menus in the second frame so we already have the splash onscreen
main_game.LoadMenuTimeConsumingConstructor();
}
...
}
}
我不太明白你的问题,但如果你没有使用 AssetManger Class,我认为这篇文章可以帮助你,我希望如此。
如果此回复无效或对您没有用,请告诉我,然后删除
维基 LibGDX https://github.com/libgdx/libgdx/wiki/Managing-your-assets
YouTube 上的视频 https://www.youtube.com/watch?v=JXThbQir2gU
GitHub中的其他示例 https://github.com/Matsemann/libgdx-loading-screen
NEW 看这个:
Proper way to dispose screens in Libgdx
What's the right place to dispose a libgdx Screen
它可以帮助您决定是否需要调用 dipose,以及如何调用,希望对您有所帮助。