javascript - HTML5 Canvas 游戏优化

标签 javascript html canvas

以下是我编写的示例代码,只是为了展示我在游戏中处理某些事情:

https://jsfiddle.net/qk7ayx7n/25/

<canvas id = "canvas"></canvas>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

JS:

var canvas = document.getElementById("canvas");
var ctx=canvas.getContext("2d");
canvas.width = 750; //keeping ratio
canvas.height = 587; //keeping ratio

$('#canvas').css("height", window.innerHeight);
$('#canvas').css("width",  window.innerHeight * 1.277); //keeping the ratio
//and also resizing according to the window(not to overflow)

var board = new Image();
board.src = "https://s21.postimg.org/ko999yaaf/circ.png";
var circle = new Image();
circle.src = "https://s21.postimg.org/4zigxdh7r/circ.png";
ctx.drawImage(board, 0, 0);

var x = 10, y = 10;
ctx.drawImage(circle, x, y);
startMoving();

function startMoving(){
      if(y > 310) return;
    y+=3;
    ctx.clearRect(0,0,750,587);
    ctx.drawImage(board, 0, 0);
      ctx.drawImage(circle, x, y);
    setTimeout(function(){startMoving()}, 30);
}

一点说明:这是一个简单的棋盘游戏。首先将 Canvas 设置为棋盘尺寸本身,以便正确获取坐标 X Y(这在这里没有用,但在我的实际游戏中是有用的)。

然后根据播放器的窗口,相对于原始棋盘图像的实际比例调整大小。保持比例对于图像质量很重要。 现在,运动是通过函数中的简单计时器完成的,一旦到达某个 X 和 Y,运动就会停止。

在某些浏览器和设备(如cordova应用程序)中,我很难让圆圈的移动没有​​中断/滞后,尽管它通常工作正常。我知道滞后是由我处理事情的方式造成的,但为什么呢? 另外,我很难保持移动速度恒定 - +3 在每个浏览器中的移动速度似乎并不相同。

最佳答案

在大多数情况下,您应该对基于 JavaScript 的动画使用 requestAnimationFrame 以避免出现断断续续的情况。使用这种技术,位置是时间的函数,而不是发生了多少个执行帧。这样,快速的计算机将比慢速的计算机拥有更多的动画帧,但您仍然会感知到相同的动画速度。例如:

var x = 10, y = 10;

var startPos = 10;
var destPos = 310;
var startTime = Date.now();
var velocity = 0.1; // pixels per millisecond
var distance = destPos - startPos;
var duration = Math.abs(distance) / velocity;

requestAnimationFrame(startMoving);

function startMoving(now) {
  var elapsedTime = Math.min(now - startTime, duration);
  y = startPos + (elapsedTime * velocity);
  ctx.clearRect(0,0,750,587);
  ctx.drawImage(board, 0, 0);
  ctx.drawImage(circle, x, y);

  if (elapsedTime < duration)
    requestAnimationFrame(startMoving);
}

关于javascript - HTML5 Canvas 游戏优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731937/

相关文章:

javascript - ArcGIS:将 where 子句添加到新要素图层

javascript - 如何调试 iPad 上 Web View 中运行的 Javascript?

html - 如何在 vuetify 的布局中居中元素?

java - 在 HTML 和 Java 中对没有分隔符的值列表求和

html - FabricJs canvas 到 dataurl 图像大小问题

javascript - Canvas 上的圆和线

javascript - 如何在不需要发送 HTML 代码的情况下共享 AngularJS 指令

javascript - 使用 gmail api javascript 发送 gmail

html - 右侧带有标题和 2 个按钮的 Ionic 标题

php - 使用 PHP 将图像拆分为像素 div