【问题标题】:Loading time - the GameScreen starts running before being displayed加载时间 - GameScreen 在显示之前开始运行
【发布时间】:2014-12-03 04:15:55
【问题描述】:

我正在使用 libGdx 编写类似 Pong 的游戏。 在 GameScreen 中,我想显示每个玩家的剩余生命。 为此,在 GameScreen 的 create() 中,我有一个包含多个 ImageButtons 的表:

for(int i = 0; i < lifePlayer1; i++){
            lives[i] = new ImageButton(skin, "Life");
            lifeTable.add(lives[i]);
            lives[i].setVisible(true);
            lives[i].setTouchable(Touchable.disabled);
        }

每个 ImageButton 代表一个生命。当玩家失去生命时,失去生命对应的ImageButton被setChecked,imageChecked代表失去的生命

在游戏开始之前,我想显示一条消息“游戏开始!”。消息从左到右穿过屏幕,只有在消息消失后​​游戏才开始。

我遇到的问题是lifeTable的实例化需要时间,而GameScreen在实例化完成之前就开始运行了。我解释一下:

  • 当我禁用 lifeTable 时,一切运行顺利,“游戏开始!”消息从左到右穿过屏幕,游戏开始。
  • 当我启用 lifeTable 时,当我按下 MainMenueScreen 中的“新游戏”按钮时,会出现延迟(比如说 0.5 秒),就像加载时间一样,当最终显示 GameScreen 时,“游戏开始!”消息几乎已经穿过屏幕了。
  • 我有一个 2 人模式,要加载 2 个生命表,更糟糕的是,当 GameScreen 在 2 人模式下显示“游戏开始!”消息已经完成穿过屏幕,游戏已经开始。

我正在使用 AssetManager,并且游戏中使用的每个纹理在到达 MainMenuScreen 之前都已加载。 AssetManager 有助于减少 GameScreen 的加载时间,但仍不能令人满意。

有什么东西可以预加载 lifeTable,就像我们用 AssetManager 预加载纹理一样? 或者,有没有办法让 GameScreen 的 render() 仅在 create() 完成所有对象的实例化时才开始?

感谢您的帮助。

【问题讨论】:

    标签: performance libgdx load


    【解决方案1】:

    可能不是最有效的制作方法,但在阅读您的问题时我想到了,而且很简单

    Variable Class
    private boolean loadForTest = false;
    

    .

    @Override
    public void show() {    
    .//Other Code
    
        image = new Image(YourAssetManager.get("YourImage.png", Texture.class));
    
        image.addAction(Actions.sequence(   
                        Actions.moveTo(Gdx.graphics.getWidth(), 
                        (Gdx.graphics.getHeight()/2), 
                        1f)));
    
        image.setPosition((-100f), Gdx.graphics.getHeight()/2);
    
        YourStage.addActor(image);
    }
    
    @Override
    public void render(float delta) {
    
    .//Other Code
    
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();
    
        if (loadForTest == false){
    
           if (image.getActions().size == 0){
               Gdx.app.log("test" ,"now load table");
    
            for (int i = 0; i <lifePlayer1; i ++) { 
                vidas [i] = new ImageButton (piel, "Life"); 
                lifeTable.add(lives[i]); 
                lives[i].setVisible(true); 
                lives[i].setTouchable(Touchable.disabled); 
            }
               loadForTest = true;
    
           }else{
               Gdx.app.log("test" ,"Your Other Code Play");
           }
        }
    
    }
    

    编辑 加了另一个代码,因为我的英语不是很好,不太清楚你想做什么

    Variable Class
    private boolean loadForTest = false;
    

    .

    @Override
    public void render(float delta) {
    
    .//Other Code
    
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();
    
        if (loadForTest == false){
    
            for (int i = 0; i <lifePlayer1; i ++) { 
                vidas [i] = new ImageButton (piel, "Life"); 
                lifeTable.add(lives[i]); 
                lives[i].setVisible(true); 
                lives[i].setTouchable(Touchable.disabled); 
            }
               loadForTest = true;
    
           }else{
               Gdx.app.log("test" ,"Your Image load, Your Other Code Play");
           }
    
    }
    

    【讨论】:

    • 我会改变答案,因为我的英语不是很好,我想我明白你想要做什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2012-02-16
    • 2019-11-02
    • 2017-02-15
    相关资源
    最近更新 更多