Моя единственная идея заключалась в том, чтобы проверить это в методах рисования и действия каждого актера, но это означало бы сотни проверок в цикле.
Да, это будет бесполезно и, прежде всего, ад в обслуживании.
Теперь, когда я вхожу в локацию, моя сцена очищается и к ней добавляются новые актеры.
Вот где ваша проблема, вы не используете 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))
Кроме того, вы также можете изучить это расширение libgdx, которое предоставляет классы утилит scene2d, такие как режиссер сцены, и переходы, которые могут быть вам полезны, если вы не хотите потом изобретать велосипед.
person
Khopa
schedule
17.04.2015