ニジカもんすたぁ!! トップ・ページ https://nizika.monster
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.
 
 
 
 

178 lines
3.5 KiB

  1. const canvas = document.getElementById ('canvas');
  2. const ctx = canvas.getContext ('2d');
  3. const bg = (
  4. function ()
  5. {
  6. const _ = document.createElement('canvas');
  7. const img = new Image ();
  8. _.width = 1920;
  9. _.height = 1080;
  10. const ctx = _.getContext ('2d');
  11. img.onload = (
  12. function ()
  13. {
  14. ctx.drawImage (img, 0, 0);
  15. });
  16. img.src = './assets/bg.jpg';
  17. return _;
  18. }) ();
  19. const nizikaList = Array (24).fill ().map (
  20. function (__, i)
  21. {
  22. const _ = document.createElement('canvas');
  23. const img = new Image ();
  24. _.width = 300;
  25. _.height = 300;
  26. const ctx = _.getContext ('2d');
  27. img.onload = (
  28. function ()
  29. {
  30. ctx.drawImage (img, 0, 0);
  31. replaceColorWithTransparent (_);
  32. });
  33. img.src = `./assets/nizika/${String (i + 1).padStart (3, '0')}.png`;
  34. return _;
  35. });
  36. const kitaList = Array (40).fill ().map (
  37. function (__, i)
  38. {
  39. const _ = document.createElement('canvas');
  40. const img = new Image ();
  41. _.width = 428;
  42. _.height = 240;
  43. const ctx = _.getContext ('2d');
  44. img.onload = (
  45. function ()
  46. {
  47. ctx.drawImage (img, 0, 0);
  48. });
  49. img.src = `./assets/kita/${String (i + 41).padStart (3, '0')}.png`;
  50. return _;
  51. });
  52. const runawayGuitar = new Audio ('./assets/kita.wav');
  53. let canvasX;
  54. let canvasY;
  55. let frame = 0;
  56. let nizikaData = [];
  57. let kitaData = [];
  58. const nizikaVel = 0.1;
  59. let runawayFlag = false;
  60. let runawayFrame = 0;
  61. preprocess ();
  62. window.setInterval (() => reDraw (), 16);
  63. function
  64. preprocess ()
  65. {
  66. canvas.addEventListener ('click',
  67. function f (e)
  68. {
  69. this.removeEventListener ('click', f);
  70. kitaData.push ({x: e.clientX - 214,
  71. y: e.clientY - 120});
  72. runawayFlag = true;
  73. runawayFrame = frame;
  74. runawayGuitar.play ();
  75. });
  76. reDraw ();
  77. }
  78. function
  79. reDraw ()
  80. {
  81. canvasX = window.innerWidth;
  82. canvasY = window.innerHeight;
  83. canvas.width = canvasX;
  84. canvas.height = canvasY;
  85. ctx.drawImage (bg, 0, 0, canvasX, canvasY);
  86. if (!(runawayFlag))
  87. {
  88. nizikaData.push ({x: Math.random () * canvasX - 150,
  89. y: Math.random () * canvasY - 150});
  90. }
  91. if (nizikaData.length > 100)
  92. nizikaData.shift ();
  93. kitaData.forEach (
  94. function (kita)
  95. {
  96. ctx.drawImage (kitaList[frame % 40], kita.x, kita.y);
  97. });
  98. nizikaData.forEach (
  99. function (nizika)
  100. {
  101. ctx.drawImage (nizikaList[frame % 24], nizika.x, nizika.y);
  102. if (runawayFlag)
  103. {
  104. const l = Math.sqrt (Math.pow (kitaData[0].x - nizika.x, 2)
  105. + Math.pow (kitaData[0].y - nizika.y, 2));
  106. const t = Math.atan2 (kitaData[0].y - nizika.y,
  107. kitaData[0].x - nizika.x);
  108. nizika.x += nizikaVel * cos (t);
  109. nizika.y += nizikaVel * sin (t);
  110. }
  111. });
  112. ++frame;
  113. }
  114. function
  115. replaceColorWithTransparent (canvas)
  116. {
  117. const context = canvas.getContext ('2d');
  118. const imageData = context.getImageData (0, 0, canvas.width, canvas.height);
  119. const pixels = imageData.data;
  120. for (let i = 0; i < pixels.length; i += 4)
  121. {
  122. const r = pixels[i];
  123. const g = pixels[i + 1];
  124. const b = pixels[i + 2];
  125. if (r < 64 && g >= 96 && b < 96)
  126. pixels[i + 3] = 0;
  127. }
  128. context.putImageData (imageData, 0, 0);
  129. }