使用Android的宽高比和视口:需要解释

时间:2017-02-21 17:14:06

标签: java android libgdx

首先我知道这个主题已经有很多主题,但我仍然不明白。

我正在尝试为Android制作游戏(可在Play商店下载),但我有一个问题可以阻止我每次,我怎样才能制作一款可以在每部手机上播放相同宽高比的游戏?< / p>

例如: 我想制作一个游戏,其中一些物体随机地从屏幕顶部掉落在玩家的背景上。

如何在每部手机上打印背景图像,播放器图像和掉落的物体图像?

首先,我要打印bakcground图像 这是我现在拥有的:

public class MyAwesomeGame extends Game {
    public SpriteBatch batch;

    @Override
    public void create () {
        batch = new SpriteBatch();
        setScreen(new MenuScreen(this));
    }

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

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

并且:

public class MenuScreen implements Screen {

    private MyAwesomeGame game;

    public MenuScreen(MyAwesomeGame game){
        this.game = game;
    }

    @Override
    public void show() {}

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        game.batch.begin();
        game.batch.end();
    }

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

    @Override
    public void pause() {}

    @Override
    public void resume() {}

    @Override
    public void hide() {}

    @Override
    public void dispose() {}
}

请有人向我解释我应该做些什么或给我一些代码吗?

2 个答案:

答案 0 :(得分:1)

viewport实际上就是你所需要的。如果您想要使用x = array(744750545472, 705911706019); foreach ($x as $value) { $params = array( "Service" => "AWSECommerceService", "Operation" => "ItemLookup", "AWSAccessKeyId" => "ACCESSKEY", "AssociateTag" => "eledesmaj@example.com", "ItemId" => $x, "IdType" => "UPC", "ResponseGroup" => "ItemAttributes,OfferFull,Offers,SalesRank", "SearchIndex" => "All" ); // Set current timestamp if not set if (!isset($params["Timestamp"])) { $params["Timestamp"] = gmdate('Y-m-d\TH:i:s\Z'); } // Sort the parameters by key ksort($params); $pairs = array(); foreach ($params as $key => $value) { array_push($pairs, rawurlencode($key)."=".rawurlencode($value)); } // Generate the canonical query $canonical_query_string = join("&", $pairs); // Generate the string to be signed $string_to_sign = "GET\n".$endpoint."\n".$uri."\n".$canonical_query_string; // Generate the signature required by the Product Advertising API $signature = base64_encode(hash_hmac("sha256", $string_to_sign, List item aws_secret_key, true)); // Generate the signed URL $request_url = 'http://'.$endpoint.$uri.'?'.$canonical_query_string.'&Signature='.rawurlencode($signature); $data = simplexml_load_file($request_url); echo $data->Items->Item->ASIN; 的每个设备具有相同宽高比的图像,这将根据设备纵横比自动缩小/缩小图像,但会降低图像质量。

如果您不希望破坏图像质量,请使用FillViewport,它还保持虚拟屏幕大小的宽高比​​,但与FitViewport相比,它将始终填满整个屏幕,这可能会导致部分视口被切断。

如果您希望背景图像占据整个屏幕,请执行以下操作:

StretchViewport

点击此link了解有关int width = Gdx.graphics.getWidth(); \\ get the width of the device int height = Gdx.graphics.getHeight(); \\ get the height of the device Texture backgroundImage = new Texture(pathName); Image image = new Image(backgroundImage); image.setSize(width,height); \\ background image will fill up your whole screen Image player = new Image(new Texture(pathname)); \\ it's the same as what we did above Stage stage = new Stage(new StretchViewport(width,height)); stage.addActor(player); \\ add your player and background image to stage stage.addActor(image); 的更多信息 Stage中的两个参数将根据设备的纵横比拉伸宽度和高度。

现在,您的渲染方法会更新并渲染您的图像。

StretchViewport

我希望这有帮助!

答案 1 :(得分:0)

这正是Viewports的用途。

视口将处理不同的分辨率。 See the Viewport wiki用于不同类型的视口以及它们之间的差异。

还有一些教程可以帮助您开始使用视口。 GameFromScratch有一个,但视口上还有更多。