HTML5画布的高度和宽度100%扭曲了游戏动画

时间:2015-11-06 11:01:37

标签: javascript html5 canvas phaser-framework

我不确定,我怎么能更具体,但我正在努力解释它。我正在努力理解,我应该寻找什么更具体,所以这就是我所拥有的一切此刻。

我正在探索HTML5 JavaScript游戏,我注意到,使画布高度和宽度100%扭曲了内部的动画。 我从a simple example得到的here。 如果我将画布大小更改为100%(在我提供的示例中),则会破坏游戏的动画(例如小行星)。

我想知道,HTML5的哪个属性负责此行为,我应该寻找什么才能让HTML5动画适合整个屏幕大小?

修改
我尝试运行cordova将游戏构建到本机平台,但我遇到的第一个问题是画布不适合屏幕尺寸。 (这就是为什么我希望它完全适合浏览器屏幕,但是当使用cordova将用于浏览器屏幕的画布渲染到本机时,我看到完全不合适)。 我探讨了phaser,他们是如何解决这个问题的,found this game正在使用一种叫做ScalingManager的东西。
所以,我的问题是
1。什么是缩放游戏?
2。移相器的缩放管理器如何工作
3。在不使用缩放管理器的情况下,即使正确提到画布高度和宽度,为什么游戏不适合moile屏幕尺寸?
4。是否有一个小实验(不使用任何移相器或类似的JavaScript游戏框架),我可以做到了解简单的HTML5 javasctipt和cordova缩放的需要?

2 个答案:

答案 0 :(得分:2)

画布具有两个不同尺寸:

  • 页面上元素的大小
  • 画布的像素大小

为避免失真并获得像素完美的图形,您需要确保它们最终相等...例如:

function redraw() {
    canvas.width = canvas.offsetWidth;
    canvas.height = canvas.offsetHeight;
    ...
}

对于您只想在画布中绘制所有内容的单页HTML游戏,一个简单的方法是:

<!DOCTYPE html>
<html>
  <head>
    <style type='text/css'>
       * {
          margin: 0;
          padding: 0;
          border: none;
       }

       body,html {
          height: 100%;
          width: 100%;
       }

    </style>
  </head>
  <body>
    <script>
        var canvas = document.createElement('canvas');
        canvas.style.position = 'absolute';
        var body = document.body;
        body.insertBefore(canvas, body.firstChild);
        var context = canvas.getContext('2d');

        var devicePixelRatio = window.devicePixelRatio || 1;
        var backingStoreRatio = context.webkitBackingStorePixelRatio
            || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio
            || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1;
         var ratio = devicePixelRatio / backingStoreRatio;

        redraw();
        window.addEventListener('resize', redraw, false);
        window.addEventListener('orientationchange', redraw, false);
        function redraw() {
            width = (window.innerWidth > 0 ? window.innerWidth : screen.width);
            height = (window.innerHeight > 0 ? window.innerHeight : screen.height);
            canvas.style.width = width + 'px';
            canvas.style.height = height + 'px';
            width *= ratio;
            height *= ratio;

            if (canvas.width === width && canvas.height === height) {
              return;
            }

            canvas.width = width;
            canvas.height = height;
        }
        //draw things
    </script>
  </body>
</html>

如果您的应用程序包含您正在等待用户交互的部分(而不是在调用innerWidth时循环播放),则还需要检查innerHeight / redraw中的更改。而是用户调整浏览器窗口的大小或倾斜手机/标签。

答案 1 :(得分:0)

使用 Phaser 3,我成功地将 window.innerWidthwindow.innerHeight 添加到我的配置中的 Scale 对象:

config: Phaser.Types.Core.GameConfig = {
type: Phaser.AUTO,
scale: {
  mode: Phaser.Scale.FIT,
  parent: 'phaser-game',
  autoCenter: Phaser.Scale.CENTER_BOTH,
  width: window.innerWidth,
  height: window.innerHeight
},
scene: [MainScene],
parent: 'gameContainer',
physics: {
  default: 'arcade',
  arcade: {
    gravity: {y: 0}
  }
}
};

目前我没有看到任何问题,它成功了。