簡體   English   中英

舞台,視口,相機,縮放比例和Nexus 7

[英]Stage, viewport, camera, scaling, and Nexus 7

我是Android的新手,我也在學習如何使用libgdx。 我發現了一些使用“ DisplayScreen擴展AbstractScreen”編碼技術的教程,並且它們使用Stage和Actor來顯示輸出。 我對這種編碼技術的解釋是,DisplayScreen將使用AbstractScreen中的任何內容,除非它是@Override(如果我錯了,請糾正我)。

因此,如果將代碼放在AbstractScreen resize()中以將顯示縮放到更大的屏幕,但又保持寬高比; DisplayScreen中的舞台應調整其大小以適合更大的屏幕。 主要目的是我只想將游戲開發集中在800x480的環境中,而完全忽略所有不同的尺寸/分辨率。 AbstractScreen中的resize()將完成所有艱巨的工作,以縮放我的游戲並使它適應任何分辨率。

請允許我使用我的測試示例以獲得更好的解釋。 我在手機上顯示800x480黑色背景沒有問題。 但是,在Nexus 7上顯示了相同的背景,但沒有保持其寬高比。

這種花招解決了我上面提到的問題(我選擇在屏幕的兩邊都有兩個黑條)。 但是,將這個解決方案集成到“ DisplayScreen extended AbstractScreen”技術中存在一個小問題。

在此處查看此屏幕截圖。 我的問題是:

  1. 為什么我的黑匣子無法調整大小以適合屏幕,卻在屏幕的兩側留下兩個紅色的條形?
  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();

}

Nexus 7的屏幕分辨率為1280 x 800,但部分高度用於屏幕菜單面板(帶有后退/主頁/菜單按鈕)。

代碼中的罪魁禍首在這里,您嘗試在其中強制執行一個不適合此調整后尺寸的特定寬高比,從而導致側面的那些條形:

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

好像您從另一個stackoverflow帖子中撤消了該resize功能。 我做了同樣的事情,但是當遇到同樣的問題時,我改了一些簡單的方法:

public void resize(int width, int height) {
    stage.setViewport(true, width,height);
    stage.getCamera().setToOrtho(false,width,height);
    ...
}

這段代碼適用於我最新的更新:

OrthographicCamera是cam,這不會進行裁剪,只是更改了視口,因此寬度仍然比實際窗口/設備大“很多”倍

public void resize(int width, int height) {
    int newW = width, newH = height;
    if (cam.viewportWidth > width) {
        float scale = (float) cam.viewportWidth / (float) width;
        newW *= scale;
        newH *= scale;
    }

    // true here to flip the Y-axis
    cam.setToOrtho(true, newW, newH);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM