2015-04-17 3 views
0

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

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

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

ответ

0

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

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

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

Это ваша проблема в том, что вы не используете 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 extension, что обеспечивает scene2d Utils классов, такие как директор сцены и переходы, которые могут быть полезны для вас, если вы не хотите, чтобы изобрести колесо позже.

+0

спасибо. Этого больше, чем достаточно, чтобы заставить меня идти. Я новый, что я неправильно использовал Scene2d, теперь я знаю почему. Еще раз спасибо!!! – gonnog

+0

Рад помочь :) – Khopa

Смежные вопросы