Java 管理场景2d,libgdx

Java 管理场景2d,libgdx,java,libgdx,scene2d,Java,Libgdx,Scene2d,我正在用libGdx和他们的Scene2d制作一个简单的点击游戏。现在,当我进入一个地点时,我的舞台被清理干净,新的演员也加入进来。它感觉不对劲,效率也不高 我可以在开始时让所有演员(除了背景,我会在进入一个位置时加载他们),将他们添加到舞台上,并将他们与位置关联起来,这样舞台就知道该画什么了吗 我唯一的想法是在每个演员的绘画和表演方法中检查这一点,但这将意味着在一个循环中进行大量检查。也许Scene2d有什么可以帮我的?或者也许还有别的方法 我唯一的想法是在每个演员的绘画和表演方法中检查这一点

我正在用libGdx和他们的Scene2d制作一个简单的点击游戏。现在,当我进入一个地点时,我的舞台被清理干净,新的演员也加入进来。它感觉不对劲,效率也不高

我可以在开始时让所有演员(除了背景,我会在进入一个位置时加载他们),将他们添加到舞台上,并将他们与位置关联起来,这样舞台就知道该画什么了吗

我唯一的想法是在每个演员的绘画和表演方法中检查这一点,但这将意味着在一个循环中进行大量检查。也许Scene2d有什么可以帮我的?或者也许还有别的方法

我唯一的想法是在每个演员的绘画和表演方法中检查这一点,但这将意味着在一个循环中进行大量检查

是的,那将是不够的,而且最重要的是,要维持一个地狱

现在,当我进入一个地点时,我的舞台被清理干净,新的演员也加入进来

这就是你的问题所在,你没有使用scene2D,因为它应该是IMHO。我希望您能参加一个紧张的架构和代码重构会议

当进入一个新的位置时,你应该进入一个新的阶段。 因此,首先,您应该有几个阶段:

class MainMenu extends Stage {
    public MainMenu(){
        // Add buttons to play or quit the game
    }
}

class PointNClickStage extends Stage {
    // Add stuff common to all point'n click stages such as an inventory display
}

class Island extends PointNClickStage {
    public Island (){
        // Add some palm trees and an hidden chest
    }
}

class PirateShip extends PointNClickStage {
    public PirateShip(){
        // Add some pirates and their ship
    }
} 

... etc
然后在应用程序侦听器中,您应该实现一种方法来更改当前呈现的阶段。从概念上讲,这通常被称为“场景/舞台导演”。一些基于场景的框架,如Cocos2D,提供了自己的场景控制器,但libgdx目前没有。因此,您必须自己实现此机制,下面是一个非常基本的示例,帮助您了解其要点:

public MyApp extends ApplicationAdapter { 

    private Stage currentStage;

    private static MyApp instance;

    // ...

    @Override
    public void create () {
        instance = this;
        MyApp.setStage(new MainMenu()); // The game begins in the main menu
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(0.15f, 0.1f, 0.15f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        currentStage.act();
        currentStage.draw();
    }

    public static void setStage(Stage stage){
        instance.currentStage = stage;
        Gdx.input.setInputProcessor(stage); // Important ;)
    }

    // ...

}
因此,要更改位置(当前阶段),您只需执行以下操作:

MyApp.setStage(new PirateShip())
然后,如果您不想每次更改位置时都重新创建一个新阶段,您可以初始化并在某个位置保留对它们的引用,这样您就可以像这样更改位置

MyApp.setStage(some_list_containing_initialized_stage.get(id))



或者,您也可以研究这个libgdx,它提供场景2D UTIL类(如场景控制器)和过渡,如果您以后不想重新发明轮子,这些过渡可能对您很有用。

谢谢。这对我来说已经足够了。我知道我使用Scene2d是错误的,现在我知道原因了。再次感谢!!!