2014-06-08 14 views
5

Zrobiłem wersję alfa mojego RPG i teraz chcę zaimplementować menu z wieloma zakładkami. Kiedy jesteś w grze i naciśnij kartę lub uciec, chcę pokazać interfejs użytkownika, który będzie wyposażony w pasek z trzema przyciskami, takimi jak menu główne, drzewo umiejętności i inwentarz. Problem polega na tym, że po przełączeniu tabulatora muszę przerwać rysowanie poprzednio wybranej karty i wyłączyć aktorów z niej, więc gdy klikniesz coś z bieżącej karty, nie klikniesz przycisku na karcie, która nie jest rysowana, ale to tam ... Jak mogę wyłączyć aktorów, przyciski, aby móc narysować nową kartę bez martwienia się o zachodzenie na poprzednią zakładkę?LibGDX Jak zaimplementować karty menu 2D sceny?

EDYCJA: Chcę uniknąć wykonywania wielu etapów. Chciałbym mieć jeden etap, na którym zdefiniowana jest każda zakładka.

Odpowiedz

11

Niewidzialni aktorzy nie otrzymują zdarzeń dotykowych, co czyni najprostszy sposób na uzyskanie interfejsu z zakładkami, po prostu ustawiając odpowiednią widoczność aktorów zawartości karty.

Oto w jaki sposób zaimplementować interfejs z zakładkami w libgdx:

package com.badlogic.gdx.tests.lwjgl; 

import com.badlogic.gdx.ApplicationAdapter; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.backends.lwjgl.LwjglApplication; 
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; 
import com.badlogic.gdx.scenes.scene2d.Actor; 
import com.badlogic.gdx.scenes.scene2d.InputEvent; 
import com.badlogic.gdx.scenes.scene2d.Stage; 
import com.badlogic.gdx.scenes.scene2d.ui.Button; 
import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup; 
import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup; 
import com.badlogic.gdx.scenes.scene2d.ui.Image; 
import com.badlogic.gdx.scenes.scene2d.ui.Skin; 
import com.badlogic.gdx.scenes.scene2d.ui.Stack; 
import com.badlogic.gdx.scenes.scene2d.ui.Table; 
import com.badlogic.gdx.scenes.scene2d.ui.TextButton; 
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; 
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; 
import com.badlogic.gdx.utils.viewport.ScreenViewport; 

class Game3 extends ApplicationAdapter { 

    Skin skin; 
    Stage stage; 

    @Override 
    public void create() { 
     skin = new Skin(Gdx.files.internal("data/uiskin.json")); 
     stage = new Stage(new ScreenViewport()); 

     Table main = new Table(); 
     main.setFillParent(true); 

     // Create the tab buttons 
     HorizontalGroup group = new HorizontalGroup();  
     final Button tab1 = new TextButton("Tab1", skin, "toggle"); 
     final Button tab2 = new TextButton("Tab2", skin, "toggle"); 
     final Button tab3 = new TextButton("Tab3", skin, "toggle"); 
     group.addActor(tab1); 
     group.addActor(tab2); 
     group.addActor(tab3); 
     main.add(group); 
     main.row(); 

     // Create the tab content. Just using images here for simplicity. 
     Stack content = new Stack(); 
     final Image content1 = new Image(skin.newDrawable("white", 1,0,0,1)); 
     final Image content2 = new Image(skin.newDrawable("white", 0,1,0,1)); 
     final Image content3 = new Image(skin.newDrawable("white", 0,0,1,1)); 
     content.addActor(content1); 
     content.addActor(content2); 
     content.addActor(content3); 

     main.add(content).expand().fill(); 

     // Listen to changes in the tab button checked states 
     // Set visibility of the tab content to match the checked state 
     ChangeListener tab_listener = new ChangeListener(){ 
      @Override 
      public void changed (ChangeEvent event, Actor actor) { 
       content1.setVisible(tab1.isChecked()); 
       content2.setVisible(tab2.isChecked()); 
       content3.setVisible(tab3.isChecked()); 
      } 
     }; 
     tab1.addListener(tab_listener); 
     tab2.addListener(tab_listener); 
     tab3.addListener(tab_listener); 

     // Let only one tab button be checked at a time 
     ButtonGroup tabs = new ButtonGroup(); 
     tabs.setMinCheckCount(1); 
     tabs.setMaxCheckCount(1); 
     tabs.add(tab1); 
     tabs.add(tab2); 
     tabs.add(tab3); 

     stage.addActor(main);  
     Gdx.input.setInputProcessor(stage); 
    } 

    @Override 
    public void render() { 
     stage.act(); 
     stage.draw(); 
    } 

    @Override 
    public void dispose() { 
     stage.dispose(); 
     skin.dispose(); 
    } 

    public static void main (String[] args) { 
     new LwjglApplication(new Game3(), new LwjglApplicationConfiguration()); 
    } 
} 
0
  • Najlepszym podejściem do obsługi menu jest use different Screen.
    1. Łatwy w zarządzaniu. Oddzielne klasy. Rozdzielenie obaw.
    2. Uproszczone zarządzanie cyklem życia. Wstrzymaj jeden ekran, gdy inny jest uruchomiony.
    3. Inny ekran jest ukryty :(

  • Jeśli chcesz zachować ten sam ekran, najprostszym sposobem byłoby różne etapy.
    1. Wystarczy wyłączyć inputlistener do poprzedniego etapu i przestać nazywać aktualizacji na zamarzniętym scenie .
    2. Ręczne zarządzanie :(

  • Jeśli chcesz użyć tego samego etapu, cała logika musi zostać zaimplementowana przez ciebie, ponieważ odmawiasz używania klas zdefiniowanych przez framework.
    1. W pełni konfigurowalny.
    2. Trudne w zarządzaniu. (Wymagane są niepotrzebne testy: biblioteki bibliotek Libgdx są testowane.)
    3. Może zabawa do wdrożenia.

Jak to zrobić:

  • używać różnych dominujących grup najwyższego poziomu dla menu i gier obiektów.
  • Ręczne wyłączanie obsługi zdarzeń dla jednej grupy naraz i zaprzestanie jej aktualizowania.
  • Może wymagać nadpisania kilku metod w klasie Stage. (Niepolecane).

Zazwyczaj HUD i pause menu są realizowane w różnych etapach.

Chcę uniknąć wielu etapów

ten musi pochodzić z „etapy są ciężkie”.

W przeciwieństwie do etapów nie są ciężkie, ale spritebatches są ciężkie.

Jeśli wykonasz wiele etapów , które mają jedną akcję spritebatch, możesz łatwo tworzyć wiele etapów bez większego narzutu.

Mam nadzieję, że to pomoże.
Powodzenia.

+0

Myślałem o użyciu różnych ekranów, ale kiedy wdrożyć drzewo umiejętności muszę połączyć obiekt player więc mogę zaktualizować statystyki od umiejętności i po tym, jak muszę zmienić ekran za każdym razem, gdy chcesz zobaczyć drzewo umiejętności. O używaniu wielu etapów i tej samej partii sprite, która może być dobrym pomysłem, ale jeśli chcę dodać argument wsadowy, muszę również podać argument portu widoku, który nie jest czymś, co chcę ... Dzięki za pomysły . Może spróbuję zaimplementować zarówno jeden etap, jak i wiele etapów i zobaczyć, który z nich jest bardziej odpowiedni dla mojej gry. – Andrew

Powiązane problemy