管理 Scene2d,libgdx
Managing Scene2d, libgdx
我正在使用 libGdx 和他们的 Scene2d 制作一个简单的点击游戏。现在,当我进入一个位置时,我的舞台被清空并且新的演员正在被附加。它感觉不对而且效率不高。
能不能一开始就让所有的Actor(背景除外,我会在进入位置时加载它们),将它们添加到Stage并将它们与位置相关联,以便Stage知道绘制?
我唯一的想法是检查每个演员的绘图和动作方法,但这意味着要在一个循环中进行大量检查。也许 Scene2d 有什么可以帮助我的?或者也许还有其他方法可以做到这一点?
My only idea was to check that in draw and act methods of every actor, but that would mean houndreds of checks in a loop.
是的,那将是无能的,最重要的是,维护起来很麻烦。
Now, when I enter a location my Stage is cleared and new Actors are beeing attached.
这就是您的问题所在,您没有使用 scene2D,因为它应该是恕我直言。我希望您准备好进行密集的架构和代码重构 session。
进入 new 位置时,您应该进入 new 阶段。
所以首先,你应该有几个阶段:
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
然后在您的应用程序侦听器中,您应该实现一种方法来更改正在呈现的当前阶段。从概念上讲,这通常称为 "scene/stage director"。一些 scene-based 框架,例如 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 extension,它提供了 scene2d 实用程序 类,例如场景导演,以及可能对您有用的过渡(如果您不这样做)以后不想重新发明轮子了。
我正在使用 libGdx 和他们的 Scene2d 制作一个简单的点击游戏。现在,当我进入一个位置时,我的舞台被清空并且新的演员正在被附加。它感觉不对而且效率不高。
能不能一开始就让所有的Actor(背景除外,我会在进入位置时加载它们),将它们添加到Stage并将它们与位置相关联,以便Stage知道绘制?
我唯一的想法是检查每个演员的绘图和动作方法,但这意味着要在一个循环中进行大量检查。也许 Scene2d 有什么可以帮助我的?或者也许还有其他方法可以做到这一点?
My only idea was to check that in draw and act methods of every actor, but that would mean houndreds of checks in a loop.
是的,那将是无能的,最重要的是,维护起来很麻烦。
Now, when I enter a location my Stage is cleared and new Actors are beeing attached.
这就是您的问题所在,您没有使用 scene2D,因为它应该是恕我直言。我希望您准备好进行密集的架构和代码重构 session。
进入 new 位置时,您应该进入 new 阶段。 所以首先,你应该有几个阶段:
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
然后在您的应用程序侦听器中,您应该实现一种方法来更改正在呈现的当前阶段。从概念上讲,这通常称为 "scene/stage director"。一些 scene-based 框架,例如 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 extension,它提供了 scene2d 实用程序 类,例如场景导演,以及可能对您有用的过渡(如果您不这样做)以后不想重新发明轮子了。