加载时间 - GameScreen在显示之前开始运行

时间:2014-12-03 04:15:55

标签: performance libgdx load

我正在使用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将被设置为CheckChecked,而imageChecked则代表失去的生命

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

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

  • 当我禁用lifeTable时,一切运行顺利,“游戏开始!”消息从左到右穿过屏幕,游戏开始。
  • 当我启用lifeTable时,当我按下MainMenueScreen中的“New Game”按钮时,有一个延迟(假设为0.5秒),就像加载时间一样,当GameScreen最终显示时,“游戏”一开始!“消息几乎已经完成了屏幕。
  • 我有2个玩家模式,加载了2个lifeTable,更糟糕的是,当GameScreen在2个玩家模式中显示时,“游戏开始!”消息已经完成越过屏幕并且游戏已经开始。

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

是否有预加载lifeTable的东西,就像我们使用AssetManager预加载纹理一样? 或者,有没有办法让gameScreen的render()仅在create()完成对象的实例化时启动?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

可能不是最有效的制作方式,但在阅读你的问题时发生了这种情况,而且很简单

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");
       }

}