2014-05-04 6 views
0

J'ai deux classes, une pour les méthodes principales et l'autre pour les splash. Cependant, basculer entre ces deux ne fonctionne pas. Je voulais dessiner une image dans la classe Splash, mais elle est devenue noire instantanément. Et quand j'ai déplacé le code de l'éclaboussure à la classe principale, l'image est apparue.Réglage d'un nouvel écran dans LibGDX

Classe principale:

public class Main extends Game { 
public static int WIDTH, HEIGHT; 

public void create() { 
    WIDTH = Gdx.graphics.getWidth(); 
    HEIGHT = Gdx.graphics.getHeight(); 
    setScreen(new Splash()); 
} 

public void render() { } 
public void dispose() { super.dispose(); } 
public void pause() { super.pause(); } 
public void resize(int width, int height) { super.resize(width, height); } 
public void resume() { } 
} 

classe Splash:

public class Splash implements Screen { 

private Sprite splash; 
private SpriteBatch sb; 

public void show() { 
    sb = new SpriteBatch(); 
    Texture splashTexture = new Texture(Gdx.files.internal("res/img/splash.png")); 
    splash = new Sprite(splashTexture); 
    splash.setSize(Main.WIDTH, Main.HEIGHT); 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
} 

public void render(float delta) { 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    sb.begin(); 
     splash.draw(sb); 
    sb.end(); 
} 

public void resize(int width, int height) { } 
public void resume() { } 
public void dispose() { } 
public void hide() { } 
public void pause() { } 
} 

Toute idée, ce qui pourrait causer le problème de ne pas rendre l'image en classe Splash?

MISE À JOUR 1: Je l'ai découvert, que la méthode render() dans la classe Splash ne sont même pas appelé (mais la méthode show() fait)

Répondre

1

Vous devez appeler la méthode render de votre classe de jeu . Si vous ne l'appelez pas, personne ne le fera pour vous. Vous ne devriez pas remplacer la méthode de rendu de la classe de jeu que vous faites et vous le faites vide donc il ne vous appellera rien.

Jetons un coup d'œil sur la classe Game. Il implémente toutes les méthodes de l'interface ApplicationListener (et non le create()). Donc, vous n'avez pas besoin de surcharger quoi que ce soit. Il suffit de supprimer votre:

public void render() { } 
public void dispose() { super.dispose(); } 
public void pause() { super.pause(); } 
public void resize(int width, int height) { super.resize(width, height); } 
public void resume() { } 

et cela devrait fonctionner correctement. Même si ce sont des méthodes inutiles. Ils ne font rien que d'appeler la super classe alors pourquoi vous écrivez ceux-ci. Si vous n'avez pas écrit qu'il appelle automatiquement les super méthodes. Mais bon, si vous voulez manipuler le matériel vous-même comme appeler disposer sur un écran ou appeler l'init avant de définir un nouvel écran, vous devez écrire votre propre classe "game" qui implémente l'interface ApplicationListener.

Pour vous donner une idée sur la façon de faire ce post mal un petit exemple que j'utilise pour des tests:

public class MyGameClass implements ApplicationListener { 

    private Screen curScreen; // the current screen 

    @Override 
    public void create(){ 
     Gdx.graphics.getWidth(); 
     Gdx.graphics.getHeight(); 

     Intro temp = new Intro(this);//just an example of the first screen to load up 
     setScreen(temp); 
    } 

    public void setScreen(Screen s) { 
     if (curScreen != null) { 
      curScreen.hide(); 
      curScreen.dispose(); 
     } 
     curScreen = s; 
     curScreen.show(); 
     curScreen.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     s.init(); 
    } 

    @Override 
    public void dispose() { 
     curScreen.dispose(); 
    } 

    @Override 
    public void render() { 
     curScreen.render(Gdx.graphics.getDeltaTime()); //call the rendermethod with the delta time as parameter 
    } 

    @Override 
    public void resize(int width, int height) { 
     curScreen.resize(width, height); 
    } 

    @Override 
    public void pause() { 
     curScreen.pause(); 
    } 

    @Override 
    public void resume() { 
     curScreen.resume(); 
    } 
} 
+1

Merci pour le conseil, mais je l'ai déjà compris. Je n'ai pas appelé le super.render() dans la classe principale. Donc, le mettre là-dedans l'a résolu. Quoi qu'il en soit, votre solution semble fonctionner aussi bien .. – ViliX64

Questions connexes