【问题标题】:Is there a way to avoid letterboxing with canvas scaling?有没有办法通过画布缩放来避免信箱?
【发布时间】:2018-06-18 19:03:00
【问题描述】:

我正在开发一个使用 Javascript 的小项目,使用 Pixi.js 作为渲染引擎。但是,我只发现了几种将画布缩放到全窗口的方法,这些方法似乎最适合当前版本。但是,它确实有一个警告,因为它会根据方向在侧面生成信箱。

是否可以使用 Pixi 完全避免信箱?

这是我目前拥有的代码,因为它与缩放有关:

var application = null;
var GAME_WIDTH = 1060;
var GAME_HEIGHT = 840;
var ratio = 0;
var stage = null;
application = new PIXI.Application(
{
    width: GAME_WIDTH,
    height: GAME_HEIGHT,
    backgroundColor: 0x00b4f7,
    view: document.getElementById("gwin")
});

stage = new PIXI.Container(true);

window.addEventListener("resize", rescaleClient);

function rescaleClient()
{
    ratio = Math.min(window.innerWidth / GAME_WIDTH, window.innerHeight / 
    GAME_HEIGHT);
    stage.scale.x = stage.scale.y = ratio;
    application.renderer.resize(Math.ceil(GAME_WIDTH * ratio), Math.ceil(GAME_HEIGHT * ratio));     
}

我的目标是实现与 Agar.io/Slither.io 类似的全屏/窗口效果,但是我还没有找到一种令人满意的方法来轻松实现它。似乎确实有使用 Pixi 来实现此目的的示例,但代码通常是封闭源代码,而且它们似乎使用了 Ionic 和 Phonegap 等外部工具。

【问题讨论】:

  • 不清楚您的期望是什么...保持纵横比而不裁剪图像会导致信箱。请更准确地解释或添加模拟预期结果的图片。
  • 本质上,我想实现一个“真正的”全窗口效果,由 Agar.io 和 Slither.io 演示。我确实理解这两个似乎是在没有任何公共引擎、渲染或游戏的帮助下编写的,但是,根据我的研究,如果没有外部工具的帮助,这可能是不完全可能的。
  • 那么application.renderer.resize(window.innerWidth, window.innderHeight); 呢?
  • 我确实尝试过,但它似乎使缩放无效并压扁了舞台。
  • @Merlin 更新答案

标签: javascript canvas pixi.js


【解决方案1】:

我终于找到了答案。我接近正确的轨道,但需要应用更多的东西。

application.renderer.view.style.position = "absolute";
application.renderer.view.style.display = "block";
application.renderer.autoResize = true;
application.renderer.resize(window.innerWidth, window.innerHeight);

这在内部设置了一些额外的东西,同时对调整大小脚本进行了微小的修改......

ratio = Math.min(window.innerWidth / GAME_WIDTH, window.innerHeight / GAME_HEIGHT);
stage.scale.x = stage.scale.y = ratio;
renderer.resize(window.innerWidth, window.innerHeight); 

正确配置,因此相关的渲染器窗口现在填满屏幕而不会挤压内容。

这并不容易被发现。很多教程只是把它放在前半部分,并假设这是人们想要做的。

【讨论】:

    【解决方案2】:

    var application;
    //var GAME_WIDTH = window.screen.width-20;
    var GAME_WIDTH = window.innerWidth;
    //var GAME_WIDTH = document.body.clientWidth;
    var GAME_HEIGHT = window.innerHeight;
    var ratiox = 0;
    var ratioy = 0;
    var container;
    application = new PIXI.Application(
    {
        width: GAME_WIDTH,
        height: GAME_HEIGHT,
        backgroundColor: 0x00b4f7,
        view: document.getElementById("gwin")
    });
    //document.body.appendChild(application.view);
    container = new PIXI.Container(true);
    application.stage.addChild(container);
    
    window.addEventListener("resize", rescaleClient);
    
    function rescaleClient()
    {
        //ratiox = Math.min(window.innerWidth / GAME_WIDTH, window.innerHeight /     GAME_HEIGHT);
        application.stage.scale.x = ratiox = window.innerWidth / GAME_WIDTH
    	application.stage.scale.y = ratioy = window.innerHeight / GAME_HEIGHT;
        application.renderer.resize(Math.ceil(GAME_WIDTH * ratiox), Math.ceil(GAME_HEIGHT * ratioy));     
    }
    @viewport{
      width:device-width
    }
    
    body {
    padding :0px;
    margin:0px
    }
    <script src="https://pixijs.download/v4.6.2/pixi.min.js"></script>
    <canvas id="gwin"></canvas>

    【讨论】:

    • 不幸的是,这会产生完全相同的问题。调整大小后,东西被压扁/扭曲 - 甚至添加到未编辑的容器中。更改“渲染器”大小似乎是造成这种情况的直接原因。 i.gyazo.com/646cda234256ac24725e1e55ab157483.png
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2019-05-29
    • 2011-09-13
    • 2021-12-15
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多