Управление Scene2d, libgdx

Я делаю простую игру «укажи и щелкни», используя libGdx и их Scene2d. Теперь, когда я вхожу в локацию, моя сцена очищается и к ней добавляются новые актеры. Это не кажется правильным и неэффективным.

Могу ли я сделать всех Актеров в начале (кроме фонов, я буду загружать их при входе в локацию), добавить их в Сцену и связать с локациями, чтобы Сцена знала, что нужно рисовать?

Моя единственная идея заключалась в том, чтобы проверить это в методах рисования и действия каждого актера, но это означало бы сотни проверок в цикле. Может быть, у Scene2d есть что-то, чтобы помочь мне? Или, может быть, есть другой способ сделать это?


person gonnog    schedule 17.04.2015    source источник


Ответы (1)


Моя единственная идея заключалась в том, чтобы проверить это в методах рисования и действия каждого актера, но это означало бы сотни проверок в цикле.

Да, это будет бесполезно и, прежде всего, ад в обслуживании.

Теперь, когда я вхожу в локацию, моя сцена очищается и к ней добавляются новые актеры.

Вот где ваша проблема, вы не используете 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
comment
Спасибо. Этого более чем достаточно, чтобы заставить меня двигаться. Я понял, что неправильно использовал Scene2d, теперь я знаю, почему. Спасибо еще раз!!! - person gonnog; 17.04.2015