canvas流星月亮星星银河

这是页面的特效,首先月亮直接出现,然后星星和银河渐渐的出现(一闪一闪),最后流星划过,留下完美的句点。

所有的动画都是通过帧来实现的。

星星的代码分为2部分,首先是随机生成星星,然后是绘制星星,最后是星星的帧动画。

随机生成星星代码:

	function newStar(num,width,height) {

		var stars = [];
		/// 恒星
		for(var i = 0; i < num; i++) {
			var x = Math.round(Math.random() * width);
			var y = Math.round(Math.random() * height);

			//避开月亮
			if(y > 100 && y <400) {
				if(x > width - 300 && x < width -250) {
				x = x - 100;
				} else if(x > width - 250 && x < width -200) {
					x = x + 100;
				}
			}

			var star = {
				x: x,
				y: y,
				r:Math.round(Math.random()*4),
				alpha:0,//Math.random(),
				valpha:(Math.random()/70)*(Math.random() > .5 ? -1 : 1),//随机+- 星星透明度改变加速度
			}

			stars.push(star);
		}

		return stars;

	}

然后是如何绘制星星:

	function drawStar(cxt, x, y, r, alpha) {
		cxt.beginPath();
		var draw = cxt.createRadialGradient(x, y, 0, x, y, r);
		// x0	渐变的开始圆的 x 坐标
		// y0	渐变的开始圆的 y 坐标
		// r0	开始圆的半径
		// x1	渐变的结束圆的 x 坐标
		// y1	渐变的结束圆的 y 坐标
		// r1	结束圆的半径
		draw.addColorStop(0,'rgba(255,255,255,'+ alpha +')');
		draw.addColorStop(1,'rgba(255,255,255,0)');
		cxt.fillStyle  = draw;
		cxt.arc(x, y,  r, 0, Math.PI*2, true);

		// x	圆的中心的 x 坐标。
		// y	圆的中心的 y 坐标。
		// r	圆的半径。
		// sAngle	起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。
		// eAngle	结束角,以弧度计。
		// counterclockwise	可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。
		cxt.fill();
		cxt.closePath();			

	}

最后是动画(这部分比较简单)

                cxt.clearRect(0,0,w,h);//清空画布

		////绘制星星
		// console.log(self.stars)
		for(var i = 0; i < num; i++) {
			drawStar(cxt, stars[i].x, stars[i].y, stars[i].r, stars[i].alpha);

			///改变星星亮度
			if(stars[i].alpha < 0 || stars[i].alpha > 1) {
				stars[i].valpha = stars[i].valpha * -1;
			}

			stars[i].alpha += stars[i].valpha;

		}                

接下来说的是月亮,月亮比较简单,就是画一个圆形,一个渐变的背景。

function drawMoon(cxt, w, h) {
	var moon = cxt.createRadialGradient(w - 300, 200, 17.5, w - 300, 200, 150);

    //径向渐变
        moon.addColorStop(0, 'rgba(255,255,255,.9)');
        moon.addColorStop(0.01, 'rgba(70,70,80,.9)');
        moon.addColorStop(0.2, 'rgba(40,40,50,.95)');
        moon.addColorStop(0.4, 'rgba(20,20,30,.8)');
        moon.addColorStop(1, 'rgba(0,0,10,0)');

        cxt.beginPath();
        cxt.save()
        cxt.fillStyle = moon;
        cxt.fillRect(0, 0, w, h);
        cxt.restore();
        cxt.fill();
        cxt.closePath();
}

让然后是流星

流星的生成比较简单就是比星星多了一个随机的速度。

流星的绘画就是一个半圆+渐变的超长三角形

function drawlineStar(cxt, x, y, r, len) {

		///半圆
		cxt.beginPath();
		var draw = cxt.createRadialGradient(x, y, 0, x, y, r); 
		draw.addColorStop(0,'rgba(255,255,255,1)');
		draw.addColorStop(1,'rgba(255,255,255,0)');
		cxt.fillStyle  = draw;
		cxt.arc(x, y, 1, Math.PI / 4, 5 * Math.PI / 4);
		cxt.fill();
		cxt.closePath();	

		///三角形
		cxt.beginPath();
		var tra = cxt.createLinearGradient(x - len, y - len, x, y);
		tra.addColorStop(0, 'rgba(0,0,0,0)');
    	        tra.addColorStop(1, 'rgba(255,255,255,1)');
		cxt.strokeStyle = tra;
		cxt.moveTo(x, y);
		cxt.lineTo(x - len, y - len);
		cxt.fill();
		cxt.stroke();
		cxt.closePath();
	
}    

大概就这样子,细节就自己研究吧!!!!

有活要干~~~  

See the Pen Moon by to_Matthew (@to_Matthew) on CodePen.

<----------------------其实下一步是准备做,canvas和鼠标之间的交互-------------------------->

先做一下自我提示,点击事件

canvas.onxxx,等到当前的屏幕的clickX,Y。用canvas.getBoundingClientRect()   (x:x-canvas.getBoundingClientRect().left , y:y-canvas.getBoundingClientRect().top)

得到相对canvas的X,Y值。

然后可以比较canvas点的数据X,Y值。

然后就是做相应的交互啦~~~~~

原文地址:https://www.cnblogs.com/matthew9298-Begin20160224/p/6207710.html