The version of vichan running on lainchan.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.9KB

  1. /*
  2. Script: Floating Hearts using Canvas and native JS
  3. Author: Abhinav Rastogi
  4. Date: Feb 14, 2013
  5. Sample Usage:
  6. floatingLove({
  7. 'minSpeed': 1.5, //Minimum vertical speed
  8. 'maxSpeed': 2, //Maximum vertical speed
  9. 'minAmplitude': 0.5, //Minimum amplitude (>0)
  10. 'maxAmplitude': 1.5, //Maximum amplitude (>0)
  11. 'minFrequency': 0.08, //Maximum Frequency (>0)
  12. 'maxFrequency': 0.1, //Maximum Frequency (>0)
  13. 'minAlpha': 0.7, //Minimum opacity (0-1)
  14. 'maxAlpha': 0.8, //Maximum opacity (0-1)
  15. 'minScale': 0.2, //Minimum size multiplier (0-1)
  16. 'maxScale': 0.8, //Maximum size multiplier (0-1)
  17. 'interval': 1000, //Time gap between each heart
  18. 'delay': 1000 //Starting delay from initialization
  19. }).init();
  20. */
  21. var floatingLove = function(settings) {
  22. var canvas, context;
  23. var res_heart, body;
  24. var pool = new Array();
  25. var arr_hearts = new Array();
  26. window.requestAnimFrame = (function(callback) {
  27. return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
  28. function(callback) {
  29. window.setTimeout(callback, 1000/60);
  30. };
  31. })();
  32. var generateRandomHeart = function() {
  33. var obj_heart;
  34. if(pool.length>0) {
  35. obj_heart=pool.pop();
  36. } else {
  37. obj_heart={};
  38. obj_heart.image=res_heart;
  39. }
  40. obj_heart.x = (window.innerWidth-100)*Math.random();
  41. obj_heart.y = window.innerHeight;
  42. obj_heart.speed = settings.minSpeed + (settings.maxSpeed-settings.minSpeed)*Math.random();
  43. obj_heart.amplitude = settings.minAmplitude + (settings.maxAmplitude - settings.minAmplitude) * Math.random();
  44. obj_heart.frequency = settings.minFrequency + (settings.maxFrequency - settings.minFrequency) * Math.random();
  45. obj_heart.alpha = settings.minAlpha + (settings.maxAlpha - settings.minAlpha)*Math.random();
  46. obj_heart.size = (res_heart.height * settings.minScale) + (res_heart.height*(settings.maxScale - settings.minScale)) * Math.random();
  47. obj_heart.width = res_heart.width;
  48. obj_heart.height = res_heart.height;
  49. arr_hearts.push(obj_heart);
  50. setTimeout(generateRandomHeart, settings.interval);
  51. };
  52. var animate = function() {
  53. requestAnimFrame(function() {
  54. animate();
  55. });
  56. context.clearRect(0,0,canvas.width,canvas.height);
  57. var heart;
  58. for(var i=0; i<arr_hearts.length; i++) {
  59. heart = arr_hearts[i];
  60. context.globalAlpha = heart.alpha;
  61. context.drawImage(heart.image, heart.x, heart.y, heart.size, heart.size * heart.height/heart.width);
  62. heart.y-=heart.speed;
  63. heart.x = heart.x + heart.amplitude*Math.sin(heart.y*heart.frequency);
  64. }
  65. for(var i=0; i<arr_hearts.length; i++) {
  66. if(arr_hearts[i].y<-100) {
  67. pool.push(arr_hearts.splice(i,1)[0]);
  68. break;
  69. }
  70. }
  71. };
  72. var init = function() {
  73. canvas = document.createElement('canvas');
  74. canvas.height = window.innerHeight || html.clientHeight;
  75. canvas.width = window.innerWidth || html.clientWidth;
  76. var canvasStyle = canvas.style;
  77. canvasStyle.position = 'fixed';
  78. canvasStyle.top = 0;
  79. canvasStyle.left = 0;
  80. canvasStyle.zIndex = 1138;
  81. canvasStyle['pointerEvents'] = 'none';
  82. body = document.getElementsByTagName('body')[0];
  83. body.appendChild(canvas);
  84. res_heart = new Image();
  85. res_heart.onload = function() {
  86. animate();
  87. };
  88. res_heart.src="/static/3rdbdayballoon2_75.png";
  89. setTimeout(generateRandomHeart, settings.delay);
  90. context = canvas.getContext('2d');
  91. };
  92. return ({
  93. 'init': init
  94. });
  95. };