2017-05-05 14 views
0

私はLibGDXで単純な2Dゲームを作っています。これが私の最初のプロジェクトです。自分の携帯電話のすべてでリサイズ後にLibGDXレンダリングが呼び出されない

が正常に動作し、(6.0.1)悪いが、他の携帯電話では何も(どんなバージョン)それは動作しません。レンダリングメソッドが機能しないことは明らかですが、理由はわかりません。 super.render();を追加しようとしましたが、赤色になってしまい、動作していないか、間違っていました。

これは最初のメニュー画面です。それは私がそれをもう一度呼び出すよりもうまく動作し、死ぬよりもうまく動作し、クラッシュします。

public class MenuScreen implements Screen { 

private DualisAutosapp game; 
private OrthographicCamera camera; 
... 
    public MenuScreen(DualisAutosapp game) 
    { 
    super(); 
    Gdx.app.log("Menu","Started"); 


    this.game = game; 

    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

    Gdx.app.log("Menu","Camera"); 

    logoTexture = new Texture(Gdx.files.internal("background.png")); 
    logoTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); 
    logo = new Sprite(logoTexture); 
    Gdx.app.log("Menu","Background"); 

    startTexture = new Texture(Gdx.files.internal("start.png")); 
    startTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); 
    start = new Sprite(startTexture); 
    Gdx.app.log("Menu","Start"); 

    carChooseTexture = new Texture(Gdx.files.internal(prefs.getString("playercar", "player/mazda2.png"))); 
    carChooseTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); 
    carChoose = new Sprite(carChooseTexture); 
    Gdx.app.log("Menu","Car"); 

    font = new BitmapFont(Gdx.files.internal("font/joystix_monospace.fnt"), Gdx.files.internal("font/joystix_monospace.png"), false); 


    batch = new SpriteBatch(); 
    Gdx.app.log("Menu","batch"); 

    calculateSpriteLocation(Gdx.graphics.getWidth(),Gdx.graphics.getHeight()); 
    Gdx.app.log("Menu","calculate"); 
    } 

    @Override 
    public void show() { 

    } 

    @Override 
    public void resize(int width, int height) { 
     camera = new OrthographicCamera(); 
     camera.setToOrtho(false,Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

     calculateSpriteLocation(width,height); 
    } 

    @Override 
    public void render (float delta) { 
     Gdx.app.log("Menu","render"); 
     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    ... 
    } 
    @Override 
    public void resume() { 
    Gdx.app.log("Menu","Rizjúm"); 
    carChooseTexture = new Texture(Gdx.files.internal(prefs.getString("playercar", "player/mazda2.png"))); 
    carChooseTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); 
    carChoose = new Sprite(carChooseTexture); 
    } 

    @Override 
    public void hide() { 

    } 

    private void calculateSpriteLocation(int width, int height) 
    { 
     logo.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     logo.setPosition(width/2-logo.getWidth()/2, height/2-logo.getHeight()/2); 

     start.setSize(Gdx.graphics.getWidth()/3.6f, Gdx.graphics.getHeight()/6.4f); 
     start.setPosition(width/2-start.getWidth()/2, height/2-start.getHeight()/2); 

     carChoose.setSize(Gdx.graphics.getWidth()/3.6f, Gdx.graphics.getHeight()/6.4f); 
     carChoose.setPosition(width/2-carChoose.getWidth()/2, height/10-carChoose.getHeight()/2); 
    } 
} 

クラッシュするレンダリングのログまでは問題ありません。

EDIT

ゲームクラス

public class DualisAutosapp extends Game { 

    @Override 
    public void create() { 
     showMenuScreen(); 
    } 

    public void switchScreen(Screen newScreen){ 
     Screen previousScreen = getScreen(); 
     setScreen(newScreen); 

     if (previousScreen != null) 
     { 
      previousScreen.dispose(); 
     } 
    } 

    public void showMenuScreen() 
    { 
     switchScreen(new MenuScreen(this)); 
    } 

    public void showGameScreen() 
    { 
     switchScreen(new GameScreen(this)); 
    } 

    public void showCarChangeScreen() { 
     switchScreen(new CarChange(this)); 
    } 
} 
+0

「ゲーム」クラスを表示してください。なぜあなたは 'resize'メソッドでカメラを作成していますか? – Aryan

+0

ゲームクラスが追加されました。 教授ビデオのシリアルにありました。それはそこから来たものです。 – Szabbi97

+0

クラッシュログを追加しますか? – Aryan

答えて

0

さて、私はあなたが画面のコンストラクタに毎回ゲームのクラスを渡すべきではないと思うし、あなたは画面管理のために、このような何かを試みることができます。

import com.badlogic.gdx.Screen; 

public enum MyScreens { 

    GAME_SCREEN { 
     public Screen getScreenInstance() { 
      return new GameScreen(); 
     } 
    }, 
    MAIN_MENU { 
     public Screen getScreenInstance() { 
      return new MainMenu(); 
     } 
    }, 
    SPLASH_SCREEN { 
     public Screen getScreenInstance() { 
      return new SplashScreen(); 
     } 
    }; 
    public abstract Screen getScreenInstance(); 

} 



import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.utils.IntMap; 

public class ScreenManager { 

    private static ScreenManager instance; 
    private Game game; 
    private IntMap<Screen> screens; 

    private ScreenManager() { 
     screens = new IntMap<Screen>(); 
    } 

    public static ScreenManager getInstance() { 
     if (instance == null) { 
      instance = new ScreenManager(); 
     } 
     return instance; 

    } 

    public void initialize(Game game) { 
     this.game = game; 
    } 

    public void show(MyScreens screen) { 

     if (game == null) { 
      return; 
     } 
     if (!screens.containsKey(screen.ordinal())) { 
      screens.put(screen.ordinal(), screen.getScreenInstance()); 
     } 
     game.setScreen(screens.get(screen.ordinal())); 
    } 

    public void dispose(MyScreens screen) { 
     if (!screens.containsKey(screen.ordinal())) { 
      return; 
     } 
     screens.remove(screen.ordinal()).dispose(); 
    } 

    public void dispose() { 
     for (Screen screen : screens.values()) { 
      screen.dispose(); 
     } 
     screens.clear(); 
     instance = null; 
    } 

} 
1

私はあなたがLibgdxのAPIのGame/ScreenLife cycle方法に従うことをお勧めしますまず第一に。 Gameのライフサイクルメソッドをオーバーライドしない場合は、対応するメソッドScreenを呼び出します。

いつでもオブジェクトを初期化できますが、それは良い方法ではありません。 showメソッド内のすべての画面オブジェクトをScreenインターフェイスで初期化する方がよいでしょう。

は、オブジェクトのゲームのクラス内のすべての画面の一度にを作成し、唯一setScreen(screen)方法でそのオブジェクトを使用します。

@Override 
public void show() { 
    ..//create objects 
} 

使用dispose()方法とあなたがshow()で作成したオブジェクトを破壊します。 メソッドresize()を使用して、カメラのビューポートをデバイスサイズで更新することができます。 音楽の一時停止のような要件に応じてpause()resume()を使用しますが、オブジェクトの初期化は行いません。