Advertisement
Guest User

look a it

a guest
Apr 20th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.37 KB | None | 0 0
  1. (function(w) {
  2. var ctx = document.getElementById("c").getContext("2d");
  3. var scale = w.innerHeight > w.innerWidth ? w.innerWidth : w.innerHeight;
  4. ctx.canvas.width = scale;
  5. ctx.canvas.height = scale;
  6. ctx.canvas.style = "position:fixed; left:25%; overflow:hidden;";
  7.  
  8. var keys = [];
  9. var sprites = [];
  10. var platforms = [];
  11. var lcp = [null, null];
  12. var players = [];
  13. var frameCount = 0;
  14. var start = Date.now();
  15. var timer = 0;
  16. var checkpoints = 0;
  17. var player = {
  18. pos: [0, 0, -3],
  19. respawnPos: [0, 0, -3],
  20. size: [1, 1, 1],
  21. vel: [0, 0, 0],
  22. acc: [0, 0, 0],
  23. rot: 0,
  24. onGround: 0,
  25. oldOnGround: 0,
  26. id: Math.random()
  27. };
  28. var view = {
  29. pos: [0, -60, -3],
  30. rot: 0,
  31. rotX: -0.6
  32. };
  33. var objects = [["checkpoint", -10, -20, 0, false], ["checkpoint", -140, 35, -40, false], ["checkpoint", -140, 95, -40, false], ["checkpoint", 55, 125, -145, false], ["checkpoint", 30, 5, -145, false], ["checkpoint", 285, -5, -168, false], ["checkpoint", 85, -145, -55, false]];
  34. var s = new WebSocket("ws://xtoastx.website:3000");
  35. s.onmessage = function(m) {
  36. s.send(JSON.stringify(player));
  37. players = JSON.parse(m.data).filter((e) => {
  38. return e.id !== player.id;
  39. });
  40. }
  41. function lerpColor(a, b, c) {
  42. var d = "rgba(";
  43. a = a.substring(5).split(",");
  44. b = b.substring(5).split(",");
  45. for (var i = 0; i < 3; i++) {
  46. d += Math.round((lerp(parseInt(a[i]), parseInt(b[i]), c))).toString() + ", ";
  47. }
  48. return d + lerp(parseFloat(a[3]), parseFloat(b[3]), c).toString() + ")";
  49. }
  50. function map(a, b, c, d, f) {
  51. return d + (f - d) * ((a - b) / (c - b));
  52. }
  53. function lerp(a, b, c) {
  54. return (b - a) * c + a;
  55. }
  56. function constrain(a, b, c) {
  57. return a > c ? c : a < b ? b : a;
  58. }
  59. function random(a, b) {
  60. return Math.random() * (b - a) + a;
  61. }
  62. function color(a, b, c, d) {
  63. return "rgba(" + a + ", " + b + ", " + c + ", " + d + ")";
  64. }
  65. function alpha(a) {
  66. return a.split(",")[3];
  67. }
  68. function transform3D(x, y, z) {
  69. x -= view.pos[0];
  70. y -= view.pos[1];
  71. z -= view.pos[2];
  72. var s = Math.sin(view.rot);
  73. var c = Math.cos(view.rot);
  74. var tx = x * c - y * s;
  75. var ty = x * s + y * c;
  76. x = tx;
  77. y = ty;
  78. var s = Math.sin(view.rotX);
  79. var c = Math.cos(view.rotX);
  80. ty = y * c - z * s;
  81. var tz = y * s + z * c;
  82. y = ty;
  83. z = tz;
  84. y += 60;
  85. var d = y < 1 ? 1 : y
  86. var sx = (x / d) * scale + scale / 2;
  87. var sy = (z / d) * scale + scale / 2;
  88. return [sx, sy, x, y, z];
  89. }
  90. function vecCross(a, b) {
  91. return [
  92. a[1] * b[2] - a[2] * b[1],
  93. a[2] * b[0] - a[0] * b[2],
  94. a[0] * b[1] - a[1] * b[0]
  95. ];
  96. }
  97. function vecSub(a, b) {
  98. return [
  99. a[0] - b[0],
  100. a[1] - b[1],
  101. a[2] - b[2]
  102. ];
  103. }
  104. function vecDot(a, b) {
  105. return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
  106. }
  107. function vecNormalize(a) {
  108. var len = Math.hypot(a[0], a[1], a[2]);
  109. return [a[0] / len, a[1] / len, a[2] / len];
  110. }
  111. function quad3D(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4, c) {
  112. var p1 = transform3D(x1, y1, z1);
  113. var p2 = transform3D(x2, y2, z2);
  114. var p3 = transform3D(x3, y3, z3);
  115. var p4 = transform3D(x4, y4, z4);
  116. if (p1[3] < 0.01 && p2[3] < 0.01 && p3[3] < 0.01 && p4[3] < 0.01) return;
  117. var normal = vecNormalize(vecCross(vecSub([p1[2], p1[3], p1[4]], [p2[2], p2[3], p2[4]]),
  118. vecSub([p1[2], p1[3], p1[4]], [p3[2], p3[3], p3[4]])));
  119. var offset = vecNormalize(vecSub([p1[2] + p2[2] + p3[2] + p4[2], p1[3] + p2[3] + p3[3] + p4[3], p1[4] + p2[4] + p3[4] + p4[4]], [0, 0, 0]));
  120. if (vecDot(offset, normal) < 0) return;
  121. var d = (z1 + z2 + z3 + z4) * 0.25;
  122. sprites.push(["quad", d, p1[0], p1[1], p2[0], p2[1], p3[0], p3[1], p4[0], p4[1], c, normal, offset]);
  123. }
  124. var box3D = function(x, y, z, w, h, d, c, rotation) {
  125. var sr = Math.sin(rotation) * 0.5;
  126. var cr = Math.cos(rotation) * 0.5;
  127. var center = [x + w * 0.5, y + h * 0.5, z + d * 0.5];
  128. var wO = [w * cr, -w * sr, 0];
  129. var hO = [h * sr, h * cr, 0];
  130. var dO = [0, 0, d * 0.5];
  131. function vert(wm, hm, dm) {
  132. wm = (wm ? 1 : -1);
  133. hm = (hm ? 1 : -1);
  134. dm = (dm ? 1 : -1);
  135. return [center[0] + wO[0] * wm + hO[0] * hm + dO[0] * dm,
  136. center[1] + wO[1] * wm + hO[1] * hm + dO[1] * dm,
  137. center[2] + wO[2] * wm + hO[2] * hm + dO[2] * dm];
  138. }
  139. function face(wm1, hm1, dm1, wm2, hm2, dm2, wm3, hm3, dm3, wm4, hm4, dm4) {
  140. var v1 = vert(wm1, hm1, dm1);
  141. var v2 = vert(wm2, hm2, dm2);
  142. var v3 = vert(wm3, hm3, dm3);
  143. var v4 = vert(wm4, hm4, dm4);
  144. quad3D(v1[0], v1[1], v1[2], v2[0], v2[1], v2[2], v3[0], v3[1], v3[2], v4[0], v4[1], v4[2], c);
  145. }
  146. face(false, false, false,
  147. false, true, false,
  148. false, true, true,
  149. false, false, true);
  150. face(true, true, false,
  151. true, false, false,
  152. true, false, true,
  153. true, true, true);
  154. face(true, false, false,
  155. false, false, false,
  156. false, false, true,
  157. true, false, true);
  158. face(false, true, false,
  159. true, true, false,
  160. true, true, true,
  161. false, true, true);
  162. face(false, false, true,
  163. false, true, true,
  164. true, true, true,
  165. true, false, true);
  166. face(false, true, false,
  167. false, false, false,
  168. true, false, false,
  169. true, true, false);
  170. }
  171. function collision3D(x1, y1, z1, w1, h1, d1, x2, y2, z2, w2, h2, d2) {
  172. if (x1 < x2 + w2 && x2 < x1 + w1) {
  173. if (y1 < y2 + h2 && y2 < y1 + h1) {
  174. return (z1 < z2 + d2 && z2 < z1 + h1)
  175. }
  176. }
  177. }
  178. function shadow(x, y, z, w, h) {
  179. var cp = null;
  180. var cz = 1000;
  181. for (var i = 0; i < platforms.length; i++) {
  182. var p = platforms[i];
  183. if (collision3D(p[0], p[1], p[2], p[3], p[4], p[5], x, y, z, w, h, 200)) {
  184. var pz = p[2] - 0.1;
  185. if (pz < z) continue;
  186. if (pz < cz) {
  187. cz = pz;
  188. cp = p;
  189. }
  190. }
  191. }
  192. if (cp) {
  193. var s = map(cz, z, z + 40, 0.5, -0.5);
  194. var mx = Math.max(x - s, cp[0]);
  195. var px = Math.min(x + w + s, cp[0] + cp[3]);
  196. var my = Math.max(y - s, cp[1]);
  197. var py = Math.min(y + h + s, cp[1] + cp[4]);
  198. quad3D(mx, my, cz,
  199. px, my, cz,
  200. px, py, cz,
  201. mx, py, cz, color(0, 0, 0, constrain(map(cz, z, z + 200, 0.6, 0)), 0, 1));
  202. }
  203. }
  204. function platform3D(x, y, z, w, h, d, c, px, py, pz) {
  205. box3D(x, y, z, w, h, d, c, 0);
  206. shadow(x, y, z, w, h);
  207. platforms.push([x, y, z, w, h, d, x - px, y - py, z - pz]);
  208. }
  209. function bobbingPlatform3D(x, y, z, w, h, d, c, cycle, offset, amount, axis) {
  210. var a = [x, y, z][axis];
  211. var pa = a + Math.sin(((frameCount - 1) / 100) * cycle + offset) * amount;
  212. a += Math.sin((frameCount / 100) * cycle + offset) * amount;
  213. var ppos = [x, y, z];
  214. ppos[axis] = pa;
  215. var pos = [x, y, z];
  216. pos[axis] = a;
  217. platform3D(pos[0], pos[1], pos[2], w, h, d, c, ppos[0], ppos[1], ppos[2]);
  218. }
  219. function doCollisions(axis, object) {
  220. var collided = false;
  221. object.pos[axis] += object.vel[axis];
  222. var vel = [0, 0, 0];
  223. var cp = null;
  224. var cpi = -1;
  225. for (var i = 0; i < platforms.length; i++) {
  226. var p = platforms[i];
  227. if (collision3D(object.pos[0] - object.size[0],
  228. object.pos[1] - object.size[1],
  229. object.pos[2] - object.size[2],
  230. object.size[0] * 2,
  231. object.size[1] * 2,
  232. object.size[2] * 2,
  233. p[0], p[1], p[2], p[3], p[4], p[5])) {
  234. if ((Math.abs(p[6]) + Math.abs(p[7]) + Math.abs(p[8])) > 0) {
  235. cp = p;
  236. cpi = i;
  237. }
  238. collided = true;
  239. }
  240. }
  241. if (axis === 2) {
  242. lcp.pop();
  243. lcp.unshift([cpi, collided]);
  244. for (var i = 0; i < lcp.length; i++) {
  245. if (lcp[i] !== null && lcp[i][0] !== -1 && lcp[i][1]) {
  246. cp = lcp[i];
  247. break;
  248. }
  249. }
  250. if (cp !== null && cp[0] !== null) {
  251. object.pos[0] += platforms[cp[0]][6];
  252. object.pos[1] += platforms[cp[0]][7];
  253. if (platforms[cp[0]][8] < 0) {
  254. object.pos[2] += platforms[cp[0]][8] * 1.1;
  255. } else {
  256. object.pos[2] += platforms[cp[0]][8] * 0.9;
  257. }
  258. }
  259. }
  260. if (collided) {
  261. object.pos[axis] -= object.vel[axis] * 1.01;
  262. object.vel[axis] = 0;
  263. return true;
  264. }
  265. }
  266. function playerDie() {
  267. player.pos[0] = player.respawnPos[0];
  268. player.pos[1] = player.respawnPos[1];
  269. player.pos[2] = player.respawnPos[2];
  270. player.vel = [0, 0, 0];
  271. }
  272. function draw() {
  273. w.requestAnimationFrame(draw);
  274. frameCount++;
  275. if (player.pos[2] > 5) playerDie();
  276. player.oldOnGround = player.onGround;
  277. player.onGround -= 0.2;
  278. player.vel[2] += 0.05;
  279. var s = Math.sin(view.rot);
  280. var c = Math.cos(view.rot);
  281. if (keys[87]) {
  282. player.acc[0] += s;
  283. player.acc[1] += c;
  284. }
  285. if (keys[83]) {
  286. player.acc[0] -= s;
  287. player.acc[1] -= c;
  288. }
  289. if (keys[65]) {
  290. player.acc[0] -= c;
  291. player.acc[1] += s;
  292. }
  293. if (keys[68]) {
  294. player.acc[0] += c;
  295. player.acc[1] -= s;
  296. }
  297. var len = Math.hypot(player.acc[0], player.acc[1]);
  298. if (len !== 0) {
  299. player.acc[0] /= len;
  300. player.acc[1] /= len;
  301. player.acc[0] *= 0.07;
  302. player.acc[1] *= 0.07;
  303. }
  304. player.vel[0] += player.acc[0];
  305. player.vel[1] += player.acc[1];
  306. player.acc = [0, 0, 0];
  307. if (keys[37]) player.rot -= 0.06;
  308. if (keys[39]) player.rot += 0.06;
  309. if (keys[38]) view.rotX -= 0.02;
  310. if (keys[40]) view.rotX += 0.02;
  311. player.vel[0] *= 0.9;
  312. player.vel[1] *= 0.9;
  313. doCollisions(0, player);
  314. doCollisions(1, player);
  315. if (doCollisions(2, player)) {
  316. player.onGround = 1;
  317. if (keys[32]) player.vel[2] = -1;
  318. }
  319. platforms = [];
  320. var rd = player.rot - view.rot;
  321. view.rot += rd * 0.12;
  322. if (keys[16]) {
  323. var v = view.rot % (Math.PI * 2);
  324. if (view.rot > 0) {
  325. if (v > 0.78 && v < 2.35) {
  326. view.rot = Math.PI / 2;
  327. player.rot = Math.PI / 2;
  328. } else if (v >= 2.35 && v < 3.92) {
  329. view.rot = Math.PI;
  330. player.rot = Math.PI;
  331. } else if (v >= 3.92 && v < 5.49) {
  332. view.rot = Math.PI / 2 + Math.PI;
  333. player.rot = Math.PI / 2 + Math.PI;
  334. } else {
  335. view.rot = 0;
  336. player.rot = 0;
  337. }
  338. } else {
  339. if (v < -0.78 && v > -2.35) {
  340. view.rot = -Math.PI / 2;
  341. player.rot = -Math.PI / 2;
  342. } else if (v <= -2.35 && v > -3.92) {
  343. view.rot = -Math.PI;
  344. player.rot = -Math.PI;
  345. } else if (v <= -3.92 && v > -5.49) {
  346. view.rot = -Math.PI / 2 - Math.PI;
  347. player.rot = -Math.PI / 2 - Math.PI;
  348. } else {
  349. view.rot = 0;
  350. player.rot = 0;
  351. }
  352. }
  353. }
  354. view.pos[0] = lerp(view.pos[0], player.pos[0], 0.05);
  355. view.pos[1] = lerp(view.pos[1], player.pos[1], 0.05);
  356. view.pos[2] = lerp(view.pos[2], player.pos[2] - 10, 0.05);
  357. ctx.fillStyle = "rgb(192, 240, 255)";
  358. ctx.fillRect(0, 0, scale, scale);
  359. platform3D(-1000, -1000, 10, 2000, 2000, 1, color(52, 52, 52, 1));
  360. if (checkpoints < 7) {
  361. // green
  362. platform3D(-50, -50, 0, 100, 100, 3, color(0, 255, 0, 1));
  363. bobbingPlatform3D(-80, -10, -8, 20, 10, 2, color(0, 255, 0, 1), Math.PI, Math.PI, 8, 0);
  364. bobbingPlatform3D(-80, -10, -16, 10, 20, 2, color(0, 255, 0, 1), Math.PI, 0, 8, 1);
  365. bobbingPlatform3D(-80, -10, -24, 20, 10, 2, color(0, 255, 0, 1), Math.PI, 0, 8, 0);
  366. platform3D(-100, -10, -30, 10, 60, 1, color(0, 255, 0, 1));
  367. platform3D(-120, 50, -36, 10, 30, 1, color(0, 255, 0, 1));
  368. platform3D(-145, 30, -40, 30, 10, 1, color(0, 0, 255, 1));
  369. platform3D(-145, 90, -40, 30, 10, 1, color(0, 225, 255, 1));
  370. // red
  371. for (var i = 0; i < 15; i++) {
  372. platform3D(50 + i * (30 - i), 0, -i * 5, 30 - i * 2, 30, 1, color(255, 0, 0, 1));
  373. }
  374. for (var i = 0; i < 15; i++) {
  375. if (i % 4 === 0) bobbingPlatform3D(280, 5, -70 - i * 7, 10, 20, 1, color(255, 0, 0, 1), Math.PI, 0, 15, 1);
  376. else if (i % 4 === 1) bobbingPlatform3D(275, 10, -70 - i * 7, 20, 10, 1, color(255, 0, 0, 1), Math.PI, 0, 15, 0);
  377. else if (i % 4 === 2) bobbingPlatform3D(280, 5, -70 - i * 7, 10, 20, 1, color(255, 0, 0, 1), Math.PI, Math.PI, 15, 1);
  378. else bobbingPlatform3D(275, 10, -70 - i * 7, 20, 10, 1, color(255, 0, 0, 1), Math.PI, Math.PI, 15, 0);
  379. }
  380. // blue
  381. bobbingPlatform3D(-145, 5, -90, 20, 20, 1, color(0, 0, 255, 1), 1, Math.PI, 50, 2);
  382. for (var i = 0; i < 20; i++) {
  383. platform3D(-145, 5 + (Math.sin(i / 2) * 20), -140 - i * 5, 8, 8, 1, color(0, 0, 255, 1));
  384. }
  385. bobbingPlatform3D(-90, -5, -240, 20, 20, 1, color(0, 0, 255, 1), 2, 0, 40, 0);
  386. platform3D(-5, -5, -185, 10, 10, 1, color(0, 0, 255, 1));
  387. platform3D(20, -5, -145, 20, 20, 1, color(0, 0, 255, 1));
  388. // teal
  389. bobbingPlatform3D(-145, 105, -90, 20, 20, 1, color(0, 255, 255, 1), 1, 0, 50, 2);
  390. platform3D(-145, 125, -140, 90, 2, 1, color(0, 255, 255, 1));
  391. for (var i = 0; i < 10; i++) {
  392. for (var j = 0; j < 5; j++) {
  393. if ((i + j) % 2 === 0) {
  394. bobbingPlatform3D(-40 + i * 8, 105 + j * 8, -140, 8, 8, 1, color(0, 255, 255, 1), 3, (i + j) / 4, 8, 2);
  395. }
  396. }
  397. }
  398. platform3D(45, 115, -145, 20, 20, 1, color(0, 255, 255, 1));
  399. } else {
  400. // yellow
  401. platform3D(-50, -50, 0, 100, 100, 3, color(255, 255, 0, 1));
  402. }
  403. // purple
  404. if (checkpoints > 5) {
  405. platform3D(0, -70, -5, 100, 10, 1, color(255, 0, 255, 1));
  406. platform3D(90, -160, -10, 9, 100, 1, color(255, 0, 255, 1));
  407. platform3D(0, -160, -15, 100, 8, 1, color(255, 0, 255, 1));
  408. platform3D(0, -160, -20, 7, 100, 1, color(255, 0, 255, 1));
  409. platform3D(0, -70, -25, 100, 6, 1, color(255, 0, 255, 1));
  410. platform3D(90, -160, -30, 5, 100, 1, color(255, 0, 255, 1));
  411. platform3D(0, -160, -35, 100, 4, 1, color(255, 0, 255, 1));
  412. platform3D(0, -160, -40, 3, 100, 1, color(255, 0, 255, 1));
  413. platform3D(0, -70, -45, 100, 2, 1, color(255, 0, 255, 1));
  414. platform3D(90, -160, -50, 1, 100, 1, color(255, 0, 255, 1));
  415. platform3D(80, -150, -55, 10, 10, 1, color(255, 0, 255, 1));
  416. }
  417. box3D(player.pos[0] - player.size[0], player.pos[1] - player.size[1], player.pos[2] - player.size[2] - 0.1, player.size[0] * 2, player.size[1] * 2, player.size[2] * 2, color(0, 178, 255, 1), player.rot);
  418. shadow(player.pos[0] - 1, player.pos[1] - 1, player.pos[2], 2, 2);
  419.  
  420. for (var i of players) {
  421. box3D(i.pos[0] - i.size[0], i.pos[1] - i.size[1], i.pos[2] - i.size[2] - 0.1, i.size[0] * 2, i.size[1] * 2, i.size[2] * 2, color(240, 79, 84, 1), i.rot);
  422. shadow(i.pos[0] - 1, i.pos[1] - 1, i.pos[2], 2, 2);
  423. }
  424. if ((Math.abs(player.vel[0]) > 0.1 || Math.abs(player.vel[1]) > 0.1) && player.onGround > 0.5) objects.push(["dust", player.pos[0] + random(-1, 1), player.pos[1] + random(-1, 1), player.pos[2] + random(0.8, 1), 10, lcp[0][0]]);
  425. if (player.oldOnGround < -1 && player.onGround > 0) {
  426. for (var i = 0; i < 50; i++) {
  427. objects.push(["dust", player.pos[0] + random(-1, 1), player.pos[1] + random(-1, 1), player.pos[2] + random(0.8, 1), 8, lcp[0][0], random(-0.5, 0.5), random(-0.5, 0.5), 0]);
  428. }
  429. }
  430. for (var i = 0; i < objects.length; i++) {
  431. if (objects[i][0] === "checkpoint") {
  432. var sr = Math.sin(frameCount * 0.06) * 2;
  433. var cr = Math.cos(frameCount * 0.06) * 2;
  434. var c = color(255, 0, 0, 0.5 + Math.sin(frameCount * 0.05) / 3);
  435. if (objects[i][4]) c = color(0, 128, 0, 0.5 + Math.sin(frameCount * 0.05) / 3);
  436. else {
  437. objects.push(["checkpointEffect", objects[i][1] + sr, objects[i][2] + cr, objects[i][3] - 2.2, 0, 0, -0.5, 5]);
  438. objects.push(["checkpointEffect", objects[i][1] - sr, objects[i][2] - cr, objects[i][3] - 2.2, 0, 0, -0.5, 5]);
  439. }
  440. box3D(objects[i][1] - 2, objects[i][2] - 2, objects[i][3] - 2.2, 4, 4, 0.2, c, frameCount * 0.06);
  441. shadow(objects[i][1] - 2, objects[i][2] - 2, objects[i][3] - 4, 4, 4);
  442. if (collision3D(objects[i][1] - 2, objects[i][2] - 2, objects[i][3] - 6, 4, 4, 4, player.pos[0] - player.size[0], player.pos[1] - player.size[1], player.pos[2] - player.size[2], player.size[0] * 2, player.size[1] * 2, player.size[2] * 2)) {
  443. if (!objects[i][4]) checkpoints++;
  444. objects[i][4] = true;
  445. player.respawnPos = [objects[i][1], objects[i][2], objects[i][3] - 4];
  446. }
  447. } else if (objects[i][0] === "checkpointEffect") {
  448. var p = transform3D(objects[i][1], objects[i][2], objects[i][3]);
  449. if (p[3] > 0.5) sprites.push(["particle", objects[i][3], p[0], p[1], (objects[i][7] * 80) / p[3], color(255, 0, 255, map(objects[i][7], 5, 2, 1, 0))]);
  450. objects[i][1] += objects[i][4];
  451. objects[i][2] += objects[i][5];
  452. objects[i][3] += objects[i][6];
  453. objects[i][7] -= 0.1;
  454. if (objects[i][7] < 2) {
  455. objects.splice(i, 1);
  456. i--;
  457. continue;
  458. }
  459. } else if (objects[i][0] === "dust") {
  460. var p = transform3D(objects[i][1], objects[i][2], objects[i][3]);
  461. if (p[3] > 0.5) sprites.push(["particle", objects[i][3], p[0], p[1], objects[i][4], color(255, 255, 255, map(objects[i][4], 10, 5, 1, 0))]);
  462. if (objects[i][5] && platforms[objects[i][5]]) {
  463. objects[i][1] += platforms[objects[i][5]][6];
  464. objects[i][2] += platforms[objects[i][5]][7];
  465. objects[i][3] += platforms[objects[i][5]][8];
  466. }
  467. if (objects[i][6]) {
  468. objects[i][1] += objects[i][6];
  469. objects[i][2] += objects[i][7];
  470. objects[i][3] += objects[i][8];
  471. }
  472. objects[i][4] -= 0.25;
  473. if (objects[i][4] < 5) {
  474. objects.splice(i, 1);
  475. i--;
  476. continue;
  477. }
  478. }
  479. }
  480. sprites.sort(function(a, b) {
  481. return b[1] - a[1];
  482. });
  483. for (var i = 0; i < sprites.length; i++) {
  484. if (sprites[i][0] === "quad") {
  485. var d = vecDot(sprites[i][11], [0, 1, 0]);
  486. var cl = lerpColor(color(0, 0, 0, alpha(sprites[i][10])), sprites[i][10], constrain(d * 1.5, 0, 1));
  487. ctx.fillStyle = cl;
  488. ctx.strokeStyle = lerpColor(cl, "rgba(0, 0, 0, 1)", 0.25);
  489. ctx.beginPath();
  490. ctx.moveTo(sprites[i][2], sprites[i][3]);
  491. ctx.lineTo(sprites[i][4], sprites[i][5]);
  492. ctx.lineTo(sprites[i][6], sprites[i][7]);
  493. ctx.lineTo(sprites[i][8], sprites[i][9]);
  494. ctx.closePath();
  495. ctx.fill();
  496. ctx.stroke();
  497. } else if (sprites[i][0] === "particle") {
  498. ctx.fillStyle = sprites[i][5];
  499. ctx.beginPath();
  500. ctx.arc(sprites[i][2], sprites[i][3], sprites[i][4], 0, Math.PI * 2);
  501. ctx.fill();
  502. }
  503. }
  504. ctx.fillStyle = "rgb(0, 0, 0)";
  505. ctx.font = "15px Arial";
  506. ctx.textAlign = "left";
  507. ctx.fillText("Players: " + (players.length + 1), 10, 15);
  508. ctx.textAlign = "right";
  509. timer = checkpoints < 7 ? ((Date.now() - start) / 1000).toFixed(2) : timer;
  510. ctx.fillText("Seconds: " + timer, scale - 10, 15);
  511. ctx.fillText("Checkpoints grabbed: " + checkpoints, scale - 10, 30);
  512. sprites = [];
  513. }
  514. draw();
  515. w.addEventListener("keydown", function(e) {
  516. keys[e.keyCode] = true;
  517. });
  518. w.addEventListener("keyup", function(e) {
  519. keys[e.keyCode] = false;
  520. });
  521. })(window);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement