-
Notifications
You must be signed in to change notification settings - Fork 0
/
snow.js
154 lines (136 loc) · 4.93 KB
/
snow.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
let _snowCanvas = function( obj ){
/**obj = {
* //el must be given, the property with "?" ahead means that this property is alternative
* el: element,
* ?snowColor: ,//color of snow, default:"#a6a6a6"
* ?backgroundColor: ,//background color, default:"black"
* ?maxSpeed: float number, //max speed of snow, default: 3.5
* ?minSpeed: float number, //min speed of snow, default: 0.3
* ?amount: number, //amount of snow, 150 default
* ?rMax: number ,// max radius of snow, default: 4
* ?rMin: number, //min radius of snow, default: 1
* ?width: number, // width of canvas, default: window.innerWidth
* ?height: number, //height of canvas, default: window.innerHeight
* }
**/
// check if given the right canvas element
var canvas = obj.el || document.getElementById("snowCanvas");
if ( !canvas ){
console.log( "please set the canvas element");
return;
}
if( canvas.tagName.toLowerCase() !== "canvas" ){
console.log( "please use this function on canvas element");
return;
}
canvas.style.backgroundColor = obj.background || "transparent"; //set background color
var fillStyle = obj.snowColor || "#a6a6a6";//color of snow
//check if given the right color config
if( !_check( _isColor, [canvas.style.backgroundColor, fillStyle], [ "background color", "snow color"])){
return;
}
var ctx = canvas.getContext("2d");
var maxSpeed = obj.maxSpeed || 3.5,
minSpeed = obj.minSpeed || 0.3,
count = obj.amount || 150, //count of snow
rMax = obj.rMax || 4, //max radius of snow
rMin = obj.rMin || 1,
W, H; //height and width of canvas;
setHeightWidth( ); //initial height and width of canvas;
//check if given the right number
if( !_check( _isNumber,
[ maxSpeed, minSpeed, count, rMax, rMin, W, H],
[ "max speed 'maxSpeed'", "min speed 'minSpeed'", "amount", "max radius of snow 'rMax'", "min radius of snow 'rMin'", "width", "height"])){
return;
}
function setHeightWidth( ){
W = obj.width || window.innerWidth;
H = obj.height || window.innerHeight;
canvas.width = W;
canvas.height = H;
}
window.onresize = setHeightWidth;
var snowGroup = [];
var i;
for (i = 0; i< count; i++){
snowGroup.push( initialEverySnow() );
}
function initialEverySnow(){
return {
x: Math.random()*W - rMax,
y: Math.random()*H - rMax,
r: Math.random()*( rMax - rMin ) + rMin,
s: Math.random()*( maxSpeed - minSpeed) + minSpeed,
xChangeRate: Math.random()*1.6 -0.8
};
}
function draw(){
ctx.clearRect(0, 0, W, H);
ctx.beginPath();
var p;
for ( var i = 0; i< snowGroup.length; i++){
p = snowGroup[i];
ctx.fillStyle = fillStyle;
ctx.moveTo(p.x, p.y);
ctx.arc( p.x, p.y, p.r, 0, 2*Math.PI);
}
ctx.fill();
update();
}
var delta = 0;
function update(){
//update position of every snow
delta += 0.01;
var p;
for (var i = 0; i< snowGroup.length; i++){
p = snowGroup[i];
p.y += p.s;
p.x += Math.sin(delta + p.xChangeRate)* p.xChangeRate;
if( p.x> W + p.r || p.y > H + p.r || p.x < -p.r){
snowGroup[i] = initialEverySnow();
var randomStartPostion = Math.ceil( Math.random()*3 );
switch(randomStartPostion){
case 1:
//drop from top
snowGroup[i].x = Math.random()*W;
snowGroup[i].y = -rMax;
break;
case 2:
//start from left
snowGroup[i].x = -rMax;
snowGroup[i].y = Math.random()*H;
break;
case 3:
//start from right
snowGroup[i].x = W+ rMax;
snowGroup[i].y = Math.random()*H;
break;
}
}
}
}
setInterval(draw, 1000/60);
}
let _isColor = function ( color )
{
var color2="";
var el = document.createElement("i");
el.style.background="";
el.style.background=color;
color2= el.style.background;
if ( color2.length === 0 ){ return false;}
el.style.borderColor="";
return true;
}
let _check = ( checkFunc, checkItemArr, warningStringArr ) =>{
for ( let i = 0; i < checkItemArr.length; i++ ){
if ( !checkFunc( checkItemArr[i] )){
console.log( "_snowCanvas: please set the right "+ warningStringArr[ i ] + ".");
return false;
}
}
return true;
}
let _isNumber = ( n ) =>{
return !isNaN(parseFloat(n)) && isFinite(n);
}