2013-08-13 4 views
1

mes exigences:fond Libgdx et de premier plan en une seule étape

  1. fond remplissage écran physique complet (étirement si nécessaire)
  2. rapport d'aspect apanage des actifs de premier plan (travail avec une largeur virtuelle et hauteur)

Pour cela, j'utilise deux étapes dans mon écran comme indiqué dans le code ci-dessous.

public void render(float delta) { 
    backgroundStage.act(delta); 
    backgroundStage.draw(); 
    foregroundStage.act(delta); 
    foregroundStage.draw(); 
    } 

public void resize(int width, int height) { 
    background.setWidth(width); 
    background.setHeight(height); 
    backgroundStage.setViewport(width, height, true); 
    foregroundStage.setViewport(MainGame.WIDTH, MainGame.HEIGHT, true); 
    foregroundStage.getCamera().position.set(-foregroundStage.getGutterWidth(),-foregroundStage.getGutterHeight(),0); 
    } 

Dans tous les tutoriels que j'ai lus, je n'ai vu qu'une seule étape utilisée pour chaque écran. Alors, comment puis-je remplir les deux exigences en une seule étape? Est-ce trop cher d'avoir des étapes séparées? (J'ai lu que les objets SpriteBatch sont lourds!)

Voilà comment je résolu le problème:

Pour se débarrasser de l'étape de fond, je mis à jour mes rendre et redimensionnez fonctionne comme suit. Fondamentalement, j'ai décalé le coin inférieur droit de l'arrière-plan à (-gutterWidth, -gutterHeight) et ajouté deux fois les valeurs de largeur et de hauteur de la gouttière à la largeur de la région et la hauteur de la région de texture. La scène est maintenant disparu :-)

public void render(float delta) { 
    Gdx.gl.glClearColor(0, 1, 0, 0.5f); 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    foregroundStage.getSpriteBatch().begin(); 
    foregroundStage.getSpriteBatch().draw(backgroundImage,-gw,-gh,backgroundImage.getRegionWidth()+2*gw,backgroundImage.getRegionHeight()+2*gh); 
    foregroundStage.getSpriteBatch().end(); 
    foregroundStage.act(delta); 
    foregroundStage.draw(); 


public void resize(int width, int height) { 
    screenW = width; 
    screenH = height; 
    foregroundStage.setViewport(MainGame.WIDTH, MainGame.HEIGHT, true); 
    gw = foregroundStage.getGutterWidth(); 
    gh = foregroundStage.getGutterHeight(); 
    foregroundStage.getCamera().translate(-gw,-gh,0); 
    } 

Répondre

1

Vous pouvez utiliser deux étapes, mais pour votre cas, il serait préférable de résoudre simplement ce problème en créant deux groupes dans une seule étape:

Stage stage = new Stage(); 

Group background = new Group(); 
background.setBounds(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
Group foreground = new Group(); 
foreground.setBounds(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

// Notice the order 
stage.addActor(background); 
stage.addActor(foreground); 

foreground.addActor(new Actor()); 
// Or anything else you want to add like you normally would to the stage. 

background.addActor(new Image()); // your background image here. 

Gdx.input.setInputProcessor(stage); 
+0

Merci . Mais je veux des fenêtres différentes pour le fond et le premier plan comme je l'ai écrit dans mon code ci-dessus. Comment puis-je y parvenir sans calculer moi-même la taille du premier plan? – coolscitist

+0

Vous pouvez définir la fenêtre au premier plan, puis redimensionner les limites de l'image d'arrière-plan pour qu'elles correspondent à la taille souhaitée. Vous pourriez même rendre l'image séparée de la scène en tant que région de texture, ce qui vous permettrait de la restituer comme vous le souhaitez. Il y a quelques options, mais il n'y a aucune raison d'utiliser deux étapes pour le faire. À moins que vous ne projetiez de faire une tonne de choses (en plus de votre image de fond) en arrière-plan, alors deux étapes pourraient avoir plus de sens. – Jyro117

+0

Oui, je l'ai fait. J'ai ajouté décalé l'arrière-plan à (-gutterWidth, -gutterHeight) et ajouté deux fois les valeurs de largeur et hauteur de la gouttière à la largeur de la région et la hauteur de la région de texture. La scène est partie maintenant :-) – coolscitist

Questions connexes