|
34 | 34 |
|
35 | 35 | (function() { |
36 | 36 | var canvas = document.createElement('canvas'); |
37 | | - var context = canvas.getContext && canvas.getContext('2d'); |
| 37 | + var context = canvas.getContext('2d'); |
38 | 38 | var settleCanvas = document.createElement('canvas'); |
39 | 39 | var settleContext = context && settleCanvas.getContext('2d'); |
40 | 40 | var canvasStyle = canvas.style; |
|
44 | 44 | var snowflakesPerPixelPerSecond = 0.02; |
45 | 45 | var PIx2 = Math.PI*2; |
46 | 46 | var assumedFps = 60; |
47 | | - |
| 47 | + var settlePoint; |
| 48 | + |
48 | 49 | function resizeCanvas() { |
| 50 | + settlePoint = Array(html.clientWidth); |
49 | 51 | settleCanvas.width = canvas.width = html.clientWidth; |
50 | 52 | settleCanvas.height = canvas.height = html.clientHeight; |
51 | 53 | } |
| 54 | + |
| 55 | + function updateSettlePoints(flake) { |
| 56 | + var size = flake.size * 0.8; // reduce coral effect |
| 57 | + var xStart = Math.floor(flake.x - size); |
| 58 | + var range = size * 2; |
| 59 | + var newY; |
| 60 | + |
| 61 | + if (xStart < 0) { |
| 62 | + range += xStart; |
| 63 | + xStart = 0; |
| 64 | + } |
| 65 | + else if (xStart + range > settlePoint.length) { |
| 66 | + range -= xStart + range - settlePoint.length; |
| 67 | + } |
| 68 | + |
| 69 | + for (var i = 0; i < range; i++) { |
| 70 | + newY = flake.y - (size * Math.cos( (i/range) * Math.PI - (Math.PI/2) )); |
| 71 | + settlePoint[i + xStart] = Math.min(settlePoint[i + xStart] || Infinity, newY); |
| 72 | + } |
| 73 | + } |
52 | 74 |
|
53 | 75 | var flakesToCreate = 0; |
54 | 76 | function frame() { |
|
79 | 101 | flake.tick(); |
80 | 102 |
|
81 | 103 | // splice flake if it's now out of rendering zone |
82 | | - if (flake.y > canvas.height || settleContext.getImageData(flake.x, flake.y, 1, 1).data[3] > 200) { |
| 104 | + if (flake.y >= canvas.height || flake.y >= settlePoint[Math.floor(flake.x)]) { |
83 | 105 | activeFlakes.splice(i, 1); |
| 106 | + // this flake effects our settle points |
| 107 | + if (flake.alpha > 0.8) { |
| 108 | + updateSettlePoints(flake); |
| 109 | + } |
84 | 110 | settleContext.fillStyle='rgba(255, 255, 255, ' + flake.alpha + ')'; |
85 | 111 | settleContext.beginPath(); |
86 | 112 | settleContext.arc(flake.x, flake.y, flake.size, 0, PIx2, true); |
|
0 commit comments