HTML5画布动画和旋转 [英] HTML5 canvas animation and rotation

查看:123
本文介绍了HTML5画布动画和旋转的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个围绕中心点旋转的五个圆形的新画布动画(类似于太阳系)。所以我创建了五个圆圈并尝试旋转画布:

I'm trying to create a new canvas animation of five circles revolving around a center point (similar to the solar system). So I've created the five circles and trying to rotate the canvas:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
		<script type="text/javascript">


	var num=5, balls = [] ;

	function Ball() {
		this.r = 20;
		this.x =Math.random()*200;
		this.y = Math.random()*150;
		
	}
	
	function init() {
		
	canvas = document.getElementById("testCanvas");
		context = canvas.getContext("2d");
			
		context.clearRect(0,0,context.width,context.height);	
		context.fillStyle= "lightblue";
		
		context.save();
		context.translate(300,300);
		for(i=0; i<num ;i++){ balls[i] = new Ball() }
		setInterval(draw,50);
			
 }
		//function blank() {
				//context.fillStyle="white";
				//context.fillRect(0,0,context.canvas.width, context.canvas.height);
		//	}
		
		function draw(){
			
			context.clearRect(0,0,canvas.width,canvas.height);
			for(i=0 ; i< num ; i++){
				var Ball = balls[i];
				context.beginPath();
				context.arc(Ball.x, Ball.y, Ball.r,0,2*Math.PI, false);
				//context.stroke();
				context.fill();
						}
			context.rotate(0.08);
			context.translate(0,0);
			context.beginPath();
			context.arc(0,0,240,0,Math.PI*2,false); 
			context.lineWidth = 8;
  			context.stroke();
			}
</script>
</head>
<body onload="init()">
		<canvas id="testCanvas" width="600" height="600">
			Canvas not supported
		</canvas>
</body>
</html>

问题是 clearRect 调用似乎没有效果;有时我可以从一个或多个圆圈看到踪迹:

The issue is that the clearRect call doesn't seem to effective; sometimes I can see "trails" from one or more circles:

推荐答案

这里有几个问题:


  • 主要原因:在翻译画布时使用clearRect。这意味着它无法清除整个画布。始终清除未转换

  • 保存()永远不会恢复() - 它可能稍后用于翻译

  • 使用requestAnimationFrame进行动画处理 - 这是效率更高。而是更改旋转速率。

  • 如果颜色相同,您还可以将所有弧添加到路径并填充一次。这将加快绘图速度。

  • Main reason: clearRect is used while the canvas is translated. This means it won't be able to clear the whole canvas. Always clear untransformed
  • a save() is never restored() - it was probably intended for translation later on
  • Use requestAnimationFrame to animate - this is much more efficient. Instead change the rotation rate.
  • You can also add all arcs to the path and fill once provided the color is the same. This will speed up the drawing.

我在下面做了一些更改 -

I made some changes below -

var num = 5,
  rotation = 0,
  balls = [];

function Ball() {
  this.r = 20;
  this.x = Math.random() * 200;
  this.y = Math.random() * 150;

}

(function init() {

  canvas = document.getElementById("testCanvas");
  context = canvas.getContext("2d");

  context.clearRect(0, 0, context.width, context.height);
  context.fillStyle = "lightblue";

  for (i = 0; i < num; i++) {
    balls[i] = new Ball()
  }
  requestAnimationFrame(draw);

})();

function draw() {

  // reset transforms before clearing
  context.setTransform(1, 0, 0, 1, 0, 0);
  context.clearRect(0, 0, canvas.width, canvas.height);

  // tramslate and rotate an absolute rotation value
  context.translate(300, 300);
  context.rotate(rotation);

  // draw arcs
  for (i = 0; i < num; i++) {
    var Ball = balls[i];
    context.beginPath();
    context.arc(Ball.x, Ball.y, Ball.r, 0, 2 * Math.PI, false);
    //context.stroke();
    context.fill();
  }
  context.beginPath();
  context.arc(0, 0, 240, 0, Math.PI * 2, false);
  context.lineWidth = 8;
  context.stroke();

  // update rotation value and request new frame
  rotation += 0.04;
  requestAnimationFrame(draw)
}

<canvas id="testCanvas" width="600" height="600">
  Canvas not supported
</canvas>

这篇关于HTML5画布动画和旋转的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆