2

私は Android の初心者で、libgdx の使い方も学んでいます。「DisplayScreen extends AbstractScreen」コーディング手法を使用するチュートリアルをいくつか見つけました。これらのチュートリアルでは、出力の表示に Stage と Actor を使用しています。このコーディング手法の私の解釈は、@Override でない限り、DisplayScreen は AbstractScreen で何でも使用するということです (間違っている場合は修正してください)。

したがって、コードを AbstractScreen resize() に配置すると、アスペクト比を維持しながらディスプレイをより大きな画面にスケーリングできます。DisplayScreen のステージは、大きな画面に合わせてサイズを変更する必要があります。主な目的は、ゲーム開発を 800x480 環境に集中させ、さまざまなサイズ/解像度を完全に無視することです。AbstractScreen の resize() は、ゲームを任意の解像度にスケーリングして適合させるためのすべての困難な作業を行います。

より良い説明のために、私のテスト例を使用することを許可してください。携帯電話で 800x480 の黒い背景を表示しても問題ありません。ただし、同じ背景が表示されましたが、Nexus 7 ではアスペクト比が維持されませんでした。

このチュートリアルは、上記の問題を解決しました (画面の両側に 2 つの黒いバーを表示することにしました)。ただし、このソリューションを「DisplayScreen extends AbstractScreen」手法に統合するには、小さな問題があります。

こちらのスクリーンショットをご覧ください。私の問題は次のとおりです。

  1. ブラック ボックスのサイズが画面に合わせて変更されないのに、画面の両側に 2 つの赤いバーが残るのはなぜですか?
  2. Nexus 7 で黒い画像が 766x480 しか表示されない理由がわかりません。

誰かが私を正しい方向に向けることができれば素晴らしいことです.

awesomegame のコード

package com.example.somegame;

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.assets.AssetManager;
import com.example.somegame.screens.DisplayScreen;

public class awesomegame extends Game {

public static AssetManager AssetManager = new AssetManager();

@Override
public void create() {
}

@Override
public void render() {
    super.render();
}

@Override
public void resize(int width, int height) {
    super.resize(width, height);
    setScreen( new DisplayScreen(this) );

}

@Override
public void setScreen(Screen screen) {
    super.setScreen( screen );
}

AbstractScreen のコード

package com.example.somegame.screens;

import com.example.somegame.awesomegame;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.Scaling;

public class AbstractScreen implements Screen{

private awesomegame awesomegame;
private Stage stage;

private BitmapFont font;
    private SpriteBatch batch;
private OrthographicCamera camera;

public AbstractScreen(awesomegame awesomegame) {
    this.awesomegame = awesomegame;

    camera = new OrthographicCamera();
    camera.setToOrtho(false, 800, 480);
    camera.update();

    stage = new Stage(800, 480, false);
}

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

    stage.draw();
}

@Override
public void resize(int width, int height) {
    Vector2 size = Scaling.fit.apply(800, 480, width, height);
    int viewportX = (int)(width - size.x) / 2;
    int viewportY = (int)(height - size.y) / 2;
    int viewportWidth = (int)size.x;
    int viewportHeight = (int)size.y;
    Gdx.gl.glViewport(viewportX, viewportY, viewportWidth, viewportHeight);
    stage.setViewport(800, 480, true);
}

DisplayScreen のコード

package com.example.somegame.screens;

import com.example.somegame.awesomegame;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;

public class DisplayScreen extends AbstractScreen {

private Image loadingBg;

private Stage stage;

float loadingPercent;

public DisplayScreen(awesomegame awesomegame) {
    super (awesomegame);
}

@Override
public void show()
{
    super.show();

    awesomegame.AssetManager.load("img/loading.atlas", TextureAtlas.class);
    awesomegame.AssetManager.finishLoading();

    stage = new Stage();

    TextureAtlas atlas = awesomegame.AssetManager.get("img/loading.atlas", TextureAtlas.class);


    loadingBg = new Image(atlas.findRegion("loadingBg"));

    loadingBg.setSize(800, 480);
    loadingBg.setX(0);
    loadingBg.setY(0);

    stage.addActor(loadingBg);

    // add all asset need to be loaded here. for example
    // awesomegame.AssetManager.load("img/whatever.pack", TextureAtlas.class);

}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor( 1f, 0f, 0f, 1f );
    stage.draw();

}
4

2 に答える 2

1

Nexus 7 の画面解像度は 1280 x 800 ですが、高さの一部は画面上のメニュー パネル (戻る/ホーム/メニュー ボタンを含む) に使用されます。

コードの主な原因はここにあります。この調整された寸法に適合しない特定の縦横比を適用しようとすると、横にバーが表示されます。

public void resize(int width, int height) {
    Vector2 size = Scaling.fit.apply(800, 480, width, height);
    ...
}

resize別のスタックオーバーフローの投稿からその機能を引き出したようです。私は同じことをしましたが、同じ問題に遭遇したとき、より単純なものに切り替えました:

public void resize(int width, int height) {
    stage.setViewport(true, width,height);
    stage.getCamera().setToOrtho(false,width,height);
    ...
}
于 2013-11-25T16:38:30.223 に答える