Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.87 KB | None | 0 0
  1. (function(window, document) {
  2. var mis = [];
  3. var explosions = [];
  4. var buildings = [];
  5. var canv,ctx;
  6. var rng;
  7. var loopInterval;
  8. var missileInterval;
  9. var keyList = [];
  10. var running = false;
  11. var code = [38, 38, 40, 40, 37, 39, 37, 39, 65, 66];
  12.  
  13. var missileRate = 0.3;
  14. var targetFPS = 30;
  15. var incSpeed = 2;
  16. var outSpeed = 6;
  17. var explodeDuration = 40;
  18. var explodeRadius = 70;
  19.  
  20. function start() {
  21. setupContext();
  22. setupGame();
  23. running = true;
  24. }
  25.  
  26. function setupContext() {
  27. canv = document.createElement('canvas');
  28. ctx = canv.getContext('2d');
  29. canv.setAttribute('style', 'position: fixed; width: 100%; height: 100%; top: 0; bottom: 0; left: 0; right: 0; cursor: crosshair; opacity: 0.75; z-index: 1000;');
  30. document.body.appendChild(canv);
  31. window.addEventListener('resize', handleResize);
  32. handleResize();
  33. }
  34.  
  35. function seed(s) {
  36. return function () {
  37. var x = Math.sin(s++) * 10000;
  38. return x - Math.floor(x);
  39. };
  40. }
  41.  
  42. function handleResize() {
  43. canv.width = window.innerWidth;
  44. canv.height = window.innerHeight;
  45. }
  46.  
  47. function handleKey(evt) {
  48. switch(evt.keyCode) {
  49. case 27:
  50. close();
  51. }
  52. if (!running) {
  53. keyList.push(evt.keyCode);
  54. if (keyList.length > 10) {
  55. keyList.shift();
  56. }
  57. if (codeMatch()) {
  58. start();
  59. }
  60. }
  61. }
  62.  
  63. function codeMatch() {
  64. for (var i = 0; i < 10; i++) {
  65. if (code[i] != keyList[i]) {
  66. return false;
  67. }
  68. }
  69. return true;
  70. }
  71.  
  72. function setupGame() {
  73. rng = seed(Math.floor(Math.random() * 10000));
  74. mis = [];
  75. explosions = [];
  76. buildings = [];
  77.  
  78. missileInterval = setInterval(() => {
  79. mis.push(makeMissile(rng() * canv.width, 0, rng() * canv.width, canv.height, incSpeed, false));
  80. }, 1000 / missileRate);
  81. loopInterval = setInterval(loop, 1000 / targetFPS);
  82.  
  83. canv.addEventListener('click', evt => {
  84. mis.push(makeMissile(canv.width / 2, canv.height, evt.x, evt.y, outSpeed, true));
  85. });
  86.  
  87. for (var i = 0; i < 6; i++) {
  88. buildings.push(makeBuilding(i/6));
  89. }
  90. }
  91.  
  92. function close() {
  93. if (!running) return;
  94. clearInterval(missileInterval);
  95. clearInterval(loopInterval);
  96. document.body.removeChild(canv);
  97. window.removeEventListener('resize', handleResize);
  98. running = false;
  99. }
  100.  
  101. function loop() {
  102. ctx.fillStyle = 'black';
  103. ctx.fillRect(0, 0, canv.width, canv.height);
  104. renderMissiles();
  105. renderBuildings();
  106. renderExplosions();
  107. }
  108.  
  109. function renderMissiles() {
  110. for (var i = 0; i < mis.length; i++) {
  111. var m = mis[i];
  112. m.t++;
  113. var cx = m.sx + m.vx * m.t * m.s;
  114. var cy = m.sy + m.vy * m.t * m.s;
  115. drawLine(m.sx, m.sy, cx, cy, m.color);
  116. if (m.friendly) {
  117. ctx.fillStyle = 'red';
  118. ctx.fillRect(m.tx - 2, m.ty - 2, 4, 4);
  119. }
  120. if (collideCheck(m)) {
  121. explosions.push(makeExplosion(cx, cy, m.friendly));
  122. mis.splice(i--, 1);
  123. }
  124. }
  125. }
  126.  
  127. function renderBuildings() {
  128. for (var i = 0; i < buildings.length; i++) {
  129. var b = buildings[i];
  130. ctx.fillStyle = 'blue';
  131. ctx.fillRect(b.x, canv.height - b.height, b.width, b.height * b.health);
  132. if (buildingCollide(b)) {
  133. buildings.splice(i--, 1);
  134. }
  135. }
  136. }
  137.  
  138. function renderExplosions() {
  139. for (var i = 0; i < explosions.length; i++) {
  140. var exp = explosions[i];
  141. exp.t++;
  142. var r = getExplosionRadius(exp);
  143. if (r < 0) {
  144. explosions.splice(i--, 1);
  145. continue;
  146. }
  147. drawCircle(exp.x, exp.y, r, exp.color);
  148. }
  149. }
  150.  
  151. function collideCheck(m) {
  152. var cx = m.sx + m.vx * m.t * m.s;
  153. var cy = m.sy + m.vy * m.t * m.s;
  154. var d = Math.sqrt(Math.pow(cx - m.tx, 2) + Math.pow(cy - m.ty, 2));
  155. if (cx < 0 || cx > canv.width || cy < 0 || cy > canv.height || d < 10) {
  156. return true;
  157. }
  158. if (!m.friendly) {
  159. for (var i = 0; i < explosions.length; i++) {
  160. var exp = explosions[i];
  161. d = Math.sqrt(Math.pow(cx - exp.x, 2) + Math.pow(cy - exp.y, 2));
  162. var r = getExplosionRadius(exp);
  163. if (d <= r) {
  164. return true;
  165. }
  166. }
  167.  
  168. for (var i = 0; i < buildings.length; i++) {
  169. var b = buildings[i];
  170. if (pointInBuilding(b, cx, cy)) {
  171. return true;
  172. }
  173. }
  174. }
  175. return false;
  176. }
  177.  
  178. function buildingCollide(b) {
  179. var l1x1 = b.x, l1y1 = canv.height - b.height;
  180. var l1x2 = b.x + b.width, l1y2 = canv.height - b.height;
  181. var l2x1 = b.x, l2y1 = canv.height - b.height;
  182. var l2x2 = b.x, l2y2 = canv.height;
  183. var l3x1 = b.x + b.width, l3y1 = canv.height - b.height;
  184. var l3x2 = b.x + b.width, l3y2 = canv.height;
  185.  
  186. for (var i = 0; i < explosions.length; i++) {
  187. var exp = explosions[i];
  188. var r = getExplosionRadius(exp);
  189. if (
  190. lineInCircle(l1x1, l1y1, l1x2, l1y2, exp.x, exp.y, r) ||
  191. lineInCircle(l2x1, l2y1, l2x2, l2y2, exp.x, exp.y, r) ||
  192. lineInCircle(l3x1, l3y1, l3x2, l3y2, exp.x, exp.y, r)
  193. ) {
  194. return true
  195. }
  196. }
  197. return false;
  198. }
  199.  
  200. function makeMissile(sx, sy, tx, ty, s, friendly) {
  201. var mag = Math.sqrt(Math.pow(sx - tx, 2) + Math.pow(sy - ty, 2));
  202. var vx = (tx - sx) / mag;
  203. var vy = (ty - sy) / mag;
  204. var color = friendly ? 'white' : 'yellow';
  205. return {
  206. sx: sx,
  207. sy: sy,
  208. tx: tx,
  209. ty: ty,
  210. vx: vx,
  211. vy: vy,
  212. friendly: friendly,
  213. color: color,
  214. children: [],
  215. s: s,
  216. t: 0
  217. };
  218. }
  219.  
  220. function makeExplosion(x, y, friendly) {
  221. var color = friendly ? 'white' : 'yellow';
  222. return {
  223. x: x,
  224. y: y,
  225. t: 0,
  226. friendly: friendly,
  227. color: color
  228. };
  229. }
  230.  
  231. function makeBuilding(pos) {
  232. var x = pos * canv.width;
  233. x += (rng() - 0.5) * (rng() * (canv.width / 6 - 20));
  234. if (x > canv.width) x -= (canv.width / 12);
  235. if (x < 0) x = 0;
  236. if (x > canv.width / 2 - 50 && x < canv.width / 2) x -= 50;
  237. if (x < canv.width / 2 + 50 && x >= canv.width / 2) x += 50;
  238. return {
  239. x: x,
  240. health: 1,
  241. width: rng() * canv.width / 40 + canv.width / 80,
  242. height: rng() * canv.height / 10 + canv.height / 40
  243. }
  244. }
  245.  
  246. function getExplosionRadius(exp) {
  247. return (-Math.pow(exp.t/explodeDuration - 1, 4) + 1) * explodeRadius;
  248. }
  249.  
  250. function pointInBuilding(b, x, y) {
  251. return x >= b.x && x <= b.x + b.width && y >= canv.height - b.height && y <= canv.height;
  252. }
  253.  
  254. function lineInCircle(x1, y1, x2, y2, cx, cy, r) {
  255. x1 -= cx;
  256. x2 -= cx;
  257. y1 -= cy;
  258. y2 -= cy;
  259. var dx = x2 - x1;
  260. var dy = y2 - y1;
  261. var dr = Math.sqrt(dx*dx + dy*dy);
  262. var D = x1 * y2 - x2 * y1;
  263.  
  264. var c = r * r * dr * dr - D * D;
  265. if (c >= 0) {
  266. var intr = Math.sqrt(r*r*dr*dr - D*D);
  267. var denom = dr*dr;
  268. cx1 = (D * dy + sgn(dy)*dx * intr) / denom;
  269. cx2 = (D * dy - sgn(dy)*dx * intr) / denom;
  270. cy1 = (-D * dx + Math.abs(dy) * intr) / denom;
  271. cy2 = (-D * dx - Math.abs(dy) * intr) / denom;
  272.  
  273. return (cx1 >= x1 && cx1 <= x2 && cy1 >= y1 && cy1 <= y2) || (cx2 >= x1 && cx2 <= x2 && cy2 >= y1 && cy2 <= y2);
  274. }
  275. return false;
  276. }
  277.  
  278. function sgn(x) {
  279. return x < 0 ? -1 : 1;
  280. }
  281.  
  282. function drawLine(sx, sy, tx, ty, color) {
  283. ctx.beginPath();
  284. ctx.moveTo(sx, sy);
  285. ctx.lineTo(tx, ty);
  286. ctx.strokeStyle = color;
  287. ctx.stroke();
  288. }
  289.  
  290. function drawCircle(x, y, r, color) {
  291. ctx.beginPath();
  292. ctx.arc(x, y, r, 0, Math.PI * 2);
  293. ctx.fillStyle = color;
  294. ctx.fill();
  295. }
  296. window.addEventListener('keydown', handleKey);
  297. })(window, document);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement