resultados.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. // --- variáveis de estilo ---
  2. var estilo = { font: "40px Arial", fill: "#fff", align: "center" };
  3. var educativo = { font: "40px Arial", fill: "#000", align: "justify" };
  4. var infos = { font: "40px Arial", fill: "#fff", align: "justify" };
  5. var titulo = { font: "50px Arial", fill: "#000", align: "justify" };
  6. // --- variáveis para posicionamento na tela ---
  7. var pagina = 975;
  8. var posImg = 285;
  9. var posTxt = 450;
  10. var posPorc = 420;
  11. var posCoracao = 285;
  12. var posPulmao = 485;
  13. var posBalanca = 685;
  14. var ponteiro = 1;
  15. // --- variáveis de tratamento de dados ---
  16. var qtdCaminhadas = 0;
  17. var arrResultados = new Array();
  18. var meta = 200;
  19. var Resultados = new Phaser.Class({
  20. Extends: Phaser.Scene,
  21. initialize:
  22. function Resultados ()
  23. {
  24. Phaser.Scene.call(this, { key: 'resultados' });
  25. },
  26. preload: function ()
  27. {
  28. this.load.image('fundo', 'img/background.jpg');
  29. this.load.image('btVoltar', 'img/bto_voltar.png');
  30. this.load.image('btFrente', 'img/bto_frente.png');
  31. this.load.image('btTras', 'img/bto_tras.png');
  32. this.load.image('iHealth', 'img/iHealth.png');
  33. this.load.image('coracao', 'img/ico_coracao.png');
  34. this.load.image('pulmao', 'img/ico_pulmao.png');
  35. this.load.image('balanca', 'img/ico_balanca.png');
  36. },
  37. create: function ()
  38. {
  39. // --- componentes da tela ---
  40. this.fundo = this.add.image(487, 775, 'fundo');
  41. const btoVoltar = this.add.image(500, 1300, 'btVoltar', { fill: '#0f0' })
  42. .setInteractive()
  43. .on('pointerdown', () => this.doVoltar() );
  44. this.grpCaminhadas = this.add.group();
  45. this.grpEducativo = this.add.group();
  46. //this.cursores = this.input.keyboard.createCursorKeys();
  47. //--------- INÍCIO DO TRATAMENTO DOS DADOS -------------------------------
  48. //--- separa os registros de localização por ocorrências de caminhada ----
  49. var dbData = localStorage.getItem('Data'); // todos os registros de data
  50. var dbCoor = localStorage.getItem('Local');
  51. var arrDBData = dbData.split('|'); // registros separados por dia
  52. var arrDBCoor = dbCoor.split('|');
  53. var x1 = 1;
  54. do {
  55. //--- analisa o percurso e calcula tempo, distância e velocidade média ---
  56. var datafim = '';
  57. var coorfim = '';
  58. var distancia = 0;
  59. var tempo = 0;
  60. var velocidade = 0;
  61. var calorias = 0;
  62. var x2 = 0;
  63. var arrData = arrDBData[x1].split(','); // registros individuais de data
  64. var arrCoor = arrDBCoor[x1].split(','); // registros individuais de localização
  65. do {
  66. if (arrData[x2] != '' && arrData[x2] != null && arrData[x2] != 'null') {
  67. var date1 = new Date(arrData[x2]);
  68. var date2 = new Date(datafim);
  69. if (date1.getDate() == date2.getDate() && date1.getMonth() == date2.getMonth() && date1.getYear() == date2.getYear()) {
  70. // --- calcula o tempo entre os registros ---
  71. var t = Math.abs(date1 - date2) / 3600000; // tempo total em horas incluindo os minutos
  72. if (t < 0) t = t * (-1);
  73. // --- calcula a distância em metros entre os regitros ---
  74. if (arrCoor[x2].trim() == 'SIMULAR DADOS') {
  75. // --- Considera o tempo em que o jogo ficou aberto na caminhada e multiplica por 5 ( velocidade média em uma caminhada em k/h )
  76. var d = (tempo * 5);
  77. } else {
  78. // --- Calcula a distância em kilometros ---
  79. var PI = 3.14159265358979323846;
  80. if (arrCoor[x2].trim() != '' && coorfim.trim() != '' && (arrCoor[x2].trim() != coorfim.trim())) {
  81. var lat1 = parseFloat(arrCoor[x2].substr((arrCoor[x2].indexOf('la:')+4),(arrCoor[x2].indexOf('lo:')-6)));
  82. var lon1 = parseFloat(arrCoor[x2].substr((arrCoor[x2].indexOf('lo:')+4),arrCoor[x2].length));
  83. var lat2 = parseFloat(coorfim.substr((coorfim.indexOf('la:')+4),(coorfim.indexOf('lo:')-6)));
  84. var lon2 = parseFloat(coorfim.substr((coorfim.indexOf('lo:')+4),coorfim.length));
  85. rad = function(x) {return x*Math.PI/180;}
  86. var R = 6378.137; //Raio da Terra no km (WGS84)
  87. var dLat = rad( lat2 - lat1 );
  88. var dLong = rad( lon2 - lon1 );
  89. var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(dLong/2) * Math.sin(dLong/2);
  90. var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  91. var d = R * c;
  92. }
  93. }
  94. // ----- calcula a velocidade -------
  95. var v = d / t;
  96. // --- acumula os dados
  97. tempo = tempo + t; // horas
  98. velocidade = velocidade + v; // k/h
  99. distancia = distancia + d; // quilometros
  100. }
  101. }
  102. datafim = arrData[x2];
  103. coorfim = arrCoor[x2];
  104. x2 = x2 + 1;
  105. } while (x2 < arrData.length); // cada um dos registros de localização
  106. if (distancia > 0) {
  107. arrResultados = [];
  108. var arrTemp = new Array;
  109. // --- organiza os resultados do último dia ---
  110. var horas = parseInt(tempo); // apenas as horas
  111. var minutos = Math.round((tempo - parseInt(tempo)) * 60); // apenas os minutos
  112. distancia = distancia * 1000; // converte para metros
  113. calorias = ((horas * 60) + minutos) * 5; // calcula o gasto energético
  114. velocidade = parseFloat(velocidade/(x2-1)).toFixed(2);
  115. var arrTemp = [
  116. date2,
  117. distancia,
  118. horas,
  119. minutos,
  120. velocidade,
  121. calorias
  122. ];
  123. arrResultados.push(arrTemp);
  124. qtdCaminhadas++; // --- registra esta caminhada no contador
  125. }
  126. x1 = x1 + 1;
  127. } while (x1 < arrDBData.length); // cada uma das caminhadas
  128. if (qtdCaminhadas < 1) var Texto1 = this.add.text(250,500,'Comece suas caminhadas\ne veja aqui os resultados',estilo);
  129. const btoTras = this.add.image(246, 1150, 'btTras', { fill: '#0f0' })
  130. .setInteractive()
  131. .on('pointerdown', () => this.moveCaminhadas('-') );
  132. const btoFrente = this.add.image(728, 1150, 'btFrente', { fill: '#0f0' })
  133. .setInteractive()
  134. .on('pointerdown', () => this.moveCaminhadas('+') );
  135. this.mostraResultados();
  136. this.mostraProjecao();
  137. this.poeConteudo();
  138. },
  139. update: function ()
  140. {
  141. },
  142. mostraResultados: function ()
  143. {
  144. // --- mostra os resultados na tela separados por data, finalizando com as projeções ---
  145. for (y = 0; y < arrResultados.length; y++ ) {
  146. eval('var Destaque' + y + ' = this.add.image(' + posImg + ', 650, "iHealth");');
  147. eval('var Texto' + y + ' = this.add.text(' + posTxt + ', 450, "Data: ' + arrResultados[y][0].getDate() + '/' + arrResultados[y][0].getMonth() + '/' + arrResultados[y][0].getFullYear() + ' \\n\\nDistância: ' + parseFloat(arrResultados[y][1]).toFixed(2) + ' m\\n\\nTempo: ' + arrResultados[y][2] + ' h ' + arrResultados[y][3] +' m\\n\\nVelocidade: ' + arrResultados[y][4] + ' k/h\\n\\nGasto calórico: ' + arrResultados[y][5] + '", infos);');
  148. eval('var Coracao' + y + ' = this.add.image(' + posCoracao + ', 950, "coracao");');
  149. eval('var Pulmao' + y + ' = this.add.image(' + posPulmao + ', 950, "pulmao");');
  150. eval('var Balanca' + y + ' = this.add.image(' + posBalanca + ', 950, "balanca");');
  151. eval('this.grpCaminhadas.add(Destaque' + y + ');');
  152. eval('this.grpCaminhadas.add(Texto' + y + ');');
  153. eval('this.grpCaminhadas.add(Coracao' + y + ');');
  154. eval('this.grpCaminhadas.add(Pulmao' + y + ');');
  155. eval('this.grpCaminhadas.add(Balanca' + y + ');');
  156. this.mostraBarra(meta, arrResultados[y][1], posPorc);
  157. // --- ajusta a posição para mostrar os dados da próxima caminhada ---
  158. posImg = posImg - pagina;
  159. posTxt = posTxt - pagina;
  160. posPorc = posPorc - pagina;
  161. posCoracao = posCoracao - pagina;
  162. posPulmao = posPulmao - pagina;
  163. posBalanca = posBalanca - pagina;
  164. }
  165. },
  166. mostraProjecao: function ()
  167. {
  168. var y = arrResultados.length;
  169. // --- tira a média ---
  170. var medDistancia = 0;
  171. var medHoras = 0;
  172. var medMinutos = 0;
  173. var medVelocidade = 0;
  174. var medCalorias = 0;
  175. for (x3 = 0; x3 < arrResultados.length; x3++) {
  176. medDistancia = medDistancia + arrResultados[x3][1];
  177. medHoras = medHoras + arrResultados[x3][2];
  178. medMinutos = medMinutos + arrResultados[x3][3];
  179. medVelocidade = medVelocidade + arrResultados[x3][4];
  180. medCalorias = medCalorias + arrResultados[x3][5];
  181. }
  182. medDistancia = (medDistancia / x3) * 3;
  183. medHoras = (medHoras / x3) * 3;
  184. medMinutos = (medMinutos / x3) * 3;
  185. medVelocidade = (medVelocidade / x3);
  186. medCalorias = (medCalorias / x3) * 3;
  187. eval('var Destaque' + y + ' = this.add.image(1260, 650, "iHealth");');
  188. eval('var Texto' + y + ' = this.add.text(1425, 450, "Data: daqui 3 meses \\n\\nDistância: ' + parseFloat(medDistancia).toFixed(2) + ' m\\n\\nTempo: ' + medHoras + ' h ' + medMinutos +' m\\n\\nVelocidade: ' + parseFloat(medVelocidade).toFixed(2) + ' k/h\\n\\nGasto calórico: ' + medCalorias + '", infos);');
  189. //eval('alert(Texto' + qtdCaminhadas + '.text);');
  190. //eval('var Coracao' + y + ' = this.add.image(' + posCoracao + ', 950, "coracao");');
  191. //eval('var Pulmao' + y + ' = this.add.image(' + posPulmao + ', 950, "pulmao");');
  192. //eval('var Balanca' + y + ' = this.add.image(' + posBalanca + ', 950, "balanca");');
  193. eval('this.grpCaminhadas.add(Destaque' + y + ');');
  194. eval('this.grpCaminhadas.add(Texto' + y + ');');
  195. //eval('this.grpCaminhadas.add(Coracao' + y + ');');
  196. //eval('this.grpCaminhadas.add(Pulmao' + y + ');');
  197. //eval('this.grpCaminhadas.add(Balanca' + y + ');');
  198. this.mostraBarra(meta, -1, 1395);
  199. },
  200. poeConteudo: function ()
  201. {
  202. /*
  203. //var boxFechar = this.add.graphics();
  204. var boxConteudo1 = this.add.graphics();
  205. //boxFechar.fillStyle(0xffffff, 1);
  206. //boxFechar.fillCirc(120, 150, 740);
  207. //const btoFechar = this.add.text(500, 200, 'X', { fill: '#0f0' })
  208. // .setInteractive()
  209. // .on('pointerdown', () => boxConteudo1.visible = false; boxCoracao1.visible = false; boxConteudo1.visible = false; );
  210. boxConteudo1.fillStyle(0xffffff, 1);
  211. boxConteudo1.fillRect(120, 150, 740, 1000);
  212. eval('var boxCoracao' + qtdCaminhadas + ' = this.add.image(240, 250, "coracao");');
  213. eval('var boxTitCoracao' + qtdCaminhadas + ' = this.add.text(350, 220,"Saúde Cardíaca", titulo);');
  214. eval('var boxTxtCoracao' + qtdCaminhadas + ' = this.add.text(180, 350,"As caminhadas que você fez\\naceleraram seu coração aumentando\\no fluxo sanguíneo em seu sistema\\ncirculatório.\\n\\nEntre outros benefícios, isso fortalece\\nseu coração e acelera a troca de\\nnutrientes e de gases entre as células,\\npromovendo maior consumo de\\nenergia, ou seja, emagrecimento\\nsaudável. ", educativo);');
  215. boxConteudo1.visible = false;
  216. boxCoracao1.visible = false;
  217. boxTitCoracao1.visible = false;
  218. boxTxtCoracao1.visible = false;
  219. var boxConteudo2 = this.add.graphics();
  220. boxConteudo2.fillStyle(0xffffff, 1);
  221. boxConteudo2.fillRect(120, 150, 740, 1000);
  222. boxConteudo2.visible = false;
  223. var boxConteudo3 = this.add.graphics();
  224. boxConteudo3.fillStyle(0xffffff, 1);
  225. boxConteudo3.fillRect(120, 150, 740, 1000);
  226. boxConteudo3.visible = false;*/
  227. },
  228. converteMes: function (mes)
  229. {
  230. if (mes == 'Jan') return '01';
  231. if (mes == 'Feb') return '02';
  232. if (mes == 'Mar') return '03';
  233. if (mes == 'Apr') return '04';
  234. if (mes == 'May') return '05';
  235. if (mes == 'Jun') return '06';
  236. if (mes == 'Jul') return '07';
  237. if (mes == 'Aug') return '08';
  238. if (mes == 'Sep') return '09';
  239. if (mes == 'Oct') return '10';
  240. if (mes == 'Nov') return '11';
  241. if (mes == 'Dec') return '12';
  242. },
  243. getDistanceFromLatLonInKm: function (position1, position2) {
  244. "use strict";
  245. var deg2rad = function (deg) { return deg * (Math.PI / 180); },
  246. R = 6371,
  247. dLat = deg2rad(position2.lat - position1.lat),
  248. dLng = deg2rad(position2.lng - position1.lng),
  249. a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
  250. + Math.cos(deg2rad(position1.lat))
  251. * Math.cos(deg2rad(position1.lat))
  252. * Math.sin(dLng / 2) * Math.sin(dLng / 2),
  253. c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  254. return ((R * c *1000).toFixed());
  255. },
  256. doVoltar: function ()
  257. {
  258. this.scene.start('inicio');
  259. },
  260. /*moveEsquerda: function ()
  261. {
  262. this.cursores.left.isDown = false;
  263. },
  264. moveDireita: function ()
  265. {
  266. this.cursores.right.isDown = false;
  267. },*/
  268. moveCaminhadas: function (direcao)
  269. {
  270. if ((ponteiro < qtdCaminhadas && direcao == '-') || (ponteiro == 1 && direcao == '+')) {
  271. if (direcao == '+') ponteiro--;
  272. else ponteiro++;
  273. var grpMovel = this.grpCaminhadas.getChildren();
  274. for (var i = 0; i < grpMovel.length; i++) {
  275. //alert(grpMovel[i].x + ' -> ' +grpMovel[i].text) ;
  276. if (direcao == '+') grpMovel[i].x -= pagina;
  277. else grpMovel[i].x += pagina;
  278. }
  279. }
  280. },
  281. mostraBarra: function (meta, distancia, posPorc)
  282. {
  283. //--- barra de progressão da caminhada ---
  284. if (distancia > 0) {
  285. eval('var progressBox' + qtdCaminhadas + ' = this.add.graphics();');
  286. var porcentagem = (distancia*100)/meta;
  287. var compBarra = (parseInt(porcentagem*330)/100) + 200;
  288. eval('progressBox' + qtdCaminhadas + '.fillStyle(0xffffff, 0.8);');
  289. eval('progressBox' + qtdCaminhadas + '.fillRect(210, 320, compBarra, 50);');
  290. eval('progressBox' + qtdCaminhadas + '.fillStyle(0xcccccc, 0.8);');
  291. eval('progressBox' + qtdCaminhadas + '.fillRect(200, 310, 550, 70); ');
  292. }
  293. if (distancia > 0) {
  294. var txtTopo = '';
  295. if (porcentagem <= 30) txtTopo = "DÁ PRA MELHORAR!";
  296. if (porcentagem > 30 && porcentagem <= 60) txtTopo = "JÁ FOI UM COMEÇO!";
  297. if (porcentagem > 60 && porcentagem < 100) txtTopo = "MUITO BEM, CONTINUE!";
  298. if (porcentagem == 100) txtTopo = "CONQUISTA DESBLOQUEADA!";
  299. txtTopo = txtTopo + '\\n\\nmeta: ' + meta + ' metros';
  300. eval('var txtTopo' + qtdCaminhadas + ' = this.add.text(260, 150, "' + txtTopo + '", estilo);');
  301. eval('var Porcentagem' + qtdCaminhadas + ' = this.add.text(' + posPorc + ',325, parseFloat(' + porcentagem + ').toFixed(2) + "%",{ font: "40px Arial", fill: "#CD5C5C", align: "justify" });');
  302. eval('this.grpCaminhadas.add(progressBox' + qtdCaminhadas + ');');
  303. eval('this.grpCaminhadas.add(txtTopo' + qtdCaminhadas + ');');
  304. eval('this.grpCaminhadas.add(Porcentagem' + qtdCaminhadas + ');');
  305. } else {
  306. eval('var txtTopo' + qtdCaminhadas + ' = this.add.text(1200, 150, "PROJEÇÃO PARA 3 MESES!", estilo);');
  307. eval('this.grpCaminhadas.add(txtTopo' + qtdCaminhadas + ');');
  308. }
  309. }
  310. });