2014-06-08 14 views
5

Ho realizzato una versione alpha del mio rpg e ora voglio implementare un menu con più schede. Quando sei in gioco e premi tab o escape voglio mostrare un'interfaccia utente che avrà una barra in alto con 3 pulsanti come menu principale, albero delle abilità e inventario. Il problema è che quando cambi scheda, devo smettere di disegnare la scheda selezionata in precedenza e disabilitare gli attori da essa, quindi quando fai clic su qualcosa dalla scheda corrente non fa clic su un pulsante in una scheda che non viene disegnata ma è lì ... Come posso disabilitare attori, pulsanti in modo da poter disegnare una nuova scheda senza preoccuparmi di sovrapporre la scheda attuale con quella precedente?LibGDX Come implementare le schede di menu 2D di scene?

MODIFICA: Voglio evitare di fare più fasi. Mi piacerebbe avere una singola fase in cui ogni scheda è definita.

risposta

11

Gli attori invisibili non ricevono eventi di tocco, rendendo il modo più semplice per realizzare un'interfaccia a schede semplicemente impostando la visibilità degli attori di contenuto della scheda in modo appropriato.

Ecco come vorrei implementare un'interfaccia a schede in 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
  • L'approccio migliore per la gestione del menu è use different Screen.
    1. Facile da gestire. Classi separate Separazione degli interessi.
    2. Gestione semplificata del ciclo di vita. Metti in pausa una schermata quando un'altra è in esecuzione.
    3. Altro schermo è nascosto :(

  • Se si desidera mantenere stesso schermo, modo più semplice sarebbe diverse fasi.
    1. inputlistener basta disabilitare per la fase precedente, e smettere di chiamare aggiornamento sul palco congelato .
    2. gestione manuale :(

  • Se si desidera utilizzare lo stesso livello, è necessario implementare tutta la logica mentre si nega l'uso di classi definite dal framework.
    1. Completamente personalizzabile.
    2. Difficile da gestire. (Sono necessari test non necessari. Le classi librerie Libgdx sono testate.)
    3. Forse divertente da implementare.

come farlo:

  • utilizzare parent diversi gruppi di alto livello per i menu e di gioco oggetti.
  • Disabilita manualmente la gestione degli eventi per un gruppo alla volta e interrompe l'aggiornamento.
  • Potrebbe richiedere l'override di alcuni metodi nella classe Stage. (Non consigliato).

solito HUD e pausa menu sono implementati in diverse fasi.

voglio evitare di fare più fasi

Questo deve provenire da "stadi sono pesanti".

Al contrario, stadi non sono pesanti ma spritebatches sono pesanti.

Se si realizzano più stadi che condividono un singolo spritebatch, è possibile creare facilmente più fasi senza troppo sovraccarico.

Spero che questo aiuti.
Buona fortuna.

+0

Stavo pensando di usare diversi schermi, ma poi quando a implementare l'albero delle abilità devo collegare l'oggetto giocatore in modo da poter aggiornare le statistiche dalle abilità e dopo ho anche bisogno di cambiare schermo ogni volta che vuoi vedere l'albero delle abilità. Informazioni sull'utilizzo di più stadi e lo stesso batch sprite potrebbe essere una buona idea, ma se voglio aggiungere un argomento batch devo anche fornire un argomento view-port che non è qualcosa che voglio ... Grazie per le idee comunque . Forse cercherò di implementare sia uno stadio che più fasi e vedere quale è più adatto al mio gioco. – Andrew