我正在使用libGdx和他们的Scene2d制作一个简单的点和点击游戏。现在,当我进入一个位置时,我的舞台被清除,新的演员正在附加。它感觉不对,效率不高。
我可以在开始时制作所有演员(背景除外,我会在进入某个位置时加载它们),将它们添加到舞台并将它们与位置相关联,这样舞台会知道要画画吗?
我唯一的想法是检查每个演员的绘制和动作方法,但这意味着循环中的houndreds检查。也许Scene2d得到了一些帮助我的东西?或者也许有另一种方法可以做到这一点?
答案 0 :(得分:0)
我唯一的想法是检查每个演员的绘制和动作方法,但这意味着循环中的houndreds检查。
是的,这将是无益的,最重要的是,这是一个难以维持的地方。
现在,当我进入一个位置时,我的舞台被清除,新的演员正在附加。
这就是你的问题所在,你不应该使用scene2D,因为它应该是恕我直言。我希望你能拥有一个强烈的建筑和建筑。代码重构会话。
输入新位置时,您应该进入新阶段。 首先,您应该有几个阶段:
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))
或者,您也可以查看提供scene2d utils类的libgdx extension,例如场景导演,以及如果您不希望以后重新发明轮子,可能对您有用的过渡。