2016-08-16 2 views
1

私のゲームをより速くするためにゲームが呼び出されるたびに呼び出される回数を減らそうとしていますが、私はすべての画面で同じ計算をしています。私はこれを避けることができますか?Libgdxがコールを減らしてゲームを最適化する

私は(下)私のgameclassで上記を実装し、一度だけ、それを呼び出すことができGameClass..Howを持って

public class ****Screen implements Screen { 
    @Override 
    public void show() { 

    float screenWidth = Gdx.graphics.getWidth(); 
    float screenHeight = Gdx.graphics.getHeight(); 
    float gameWidth = 360; 
    float gameHeight = screenHeight/(screenWidth/gameWidth); 
    midPointY = (int) (gameHeight/2); 
    cam = new OrthographicCamera(); 
    cam.setToOrtho(true, gameWidth, gameHeight); 
    viewport = new FitViewport(gameWidth, gameHeight, cam); 
    viewport.apply(); 
    stage = new Stage(viewport); 
    Gdx.input.setInputProcessor(stage); 

まだ実質的にすべての画面でこれを行う?...

public class Start extends Game { 
    @Override 
    public void create() { 
    float screenWidth = Gdx.graphics.getWidth(); 
    float screenHeight = Gdx.graphics.getHeight(); 
    float gameWidth = 360; 
    float gameHeight = screenHeight/(screenWidth/gameWidth); 

    assets = new AssetLoader(); 
    assetManager = new AssetManager(); 
    camera = new OrthographicCamera(); 
    camera.setToOrtho(true, gameWidth, gameHeight); 

    //initialize screens here 
    mainMenu = new MenuScreen(this); 
    loadingScreen = new LoadingScreen(this); 
    gameScreen = new GameScreen(this); 

    ....... 

    //call assets 
    AssetLoader.load(); 

    //start mainmenu... 
    this.setScreen(mainMenu); 
} 

答えて

1

まず、あなたのゲームのスピードを上げてください。 20秒ごとに画面を変更すると、ゲームでは1200フレームごとに1つのフレームが計算されます。 しかし、私はあなたのように同じであり、ゲームをしている最中に最も最適な方法を探しています。

私はこの場合の解決策を見つけました。 ゲームクラスからスクリーンクラスまで、すべての画面で使用するオブジェクトを渡すことができます。

Screenクラス

public class MainMenuScreen implements Screen { 

    public MainMenuScreen(OrthographicCamera camera) { 
     this.camera=camera; 
    } 

//...Rest of class omitted for succinctness. 
} 

ゲームクラス

public class Starts extends Game { 

OrthographicCamera camera; 
    public void create() { 
     camera=new OrthographicCamera(); 
     camera.setToOrtho(false, 800, 480); 
     this.setScreen(new MainMenuScreen(camera));// change screen and pass camera to new screen. 
    } 

} 

それともあなたも、このようなゲーム全体のクラスを渡すことができます。

public class MainMenuScreen implements Screen { 

final Starts game; 
public MainMenuScreen(final Starts game) { 
    this.game = game; 

} 

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(0, 0, 0.2f, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    game.camera.update(); 
    game.batch.setProjectionMatrix(game.camera.combined); 

    game.batch.begin(); 
    game.font.draw(...); 
    game.font.draw(...); 
    game.batch.end(); 

    if (Gdx.input.isTouched()) { 
     game.setScreen(new AnotherScreen(game)); 
     dispose(); 
    } 
} 

} 

このようにゲームクラスで呼び出す必要があります。ゲームのステージバッチフォントなどをすべての画面で使用できます。

this.setScreen(new MainMenuScreen(this)); 
+0

ありがとう..私は今度はGameクラス全体を呼び出していて、画面幅とスクリーン高さを実装するとは考えていませんでした。 – Bmbariah

0

画面を切り替えるときに発生する小さな問題を短縮したいと思っています。 (ゲームのフレームレートはこれの影響を受けません)

簡単な方法:showのコードを各画面クラスのコンストラクタに移動します。

しかし、重いオブジェクトである3つの別々のSpriteBatchesを本質的にインスタンス化しているため、SpriteBatchを渡すことなく各スクリーンに対して新しいステージを作成するのは無駄です(メッシュデータの配列が大きく、 GPU上でメッシュを作成し、シェーダをコンパイルする必要があります)。

あなたはあなたのゲームのクラスで共有オブジェクトをインスタンス化し、このようなあなたの画面のコンストラクタにそれらを渡すことができます。それに応じて画面のコンストラクタを更新し、ステージコンストラクタにスプライトバッチを渡す

public class Start extends Game { 
    SpriteBatch spriteBatch; 

    @Override 
    public void create() { 
     //... 

     //initialize screens here 

     spriteBatch = new SpriteBatch(); //must be disposed in dispose() 

     mainMenu = new MenuScreen(this, spriteBatch); 
     loadingScreen = new LoadingScreen(this, spriteBatch); 
     gameScreen = new GameScreen(this, spriteBatch); 

     //... 
    } 
} 

。ビューポートとカメラは軽量なので、コードをもっとメンテナンスできるようにしない限り、Gameクラスに移動することは気にしません。

ところで、あなたはアスペクト比をあらかじめ計算することによってFitViewportを乱用しているのです。ビューポートのポイントは、セットアップ時に何も計算する必要がないということです。計算なしで同じことをするには、new ExtendViewport(360, 1, cam)を使用してください。 resize()で更新していることを確認してください。

+0

gameHeightを1に設定しても、ゲーム全体が1の高さに移動しました。何か? – Bmbariah

+0

FitViewportではなく、ExtendViewport。また、サイズ変更時に必ず更新してください。 – Tenfour04

+0

これは大変申し訳ありません。現在、アプリでgameHeightのすべてのインスタンスを1に置き換えていますか?例えば、labels、images、button.setPosition().e.t.c – Bmbariah

関連する問題