resultados.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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' }).setInteractive().on('pointerdown', () => this.doVoltar() );
  42. this.grpCaminhadas = this.add.group();
  43. this.grpEducativo = this.add.group();
  44. //this.cursores = this.input.keyboard.createCursorKeys();
  45. //--------- INÍCIO DO TRATAMENTO DOS DADOS -------------------------------
  46. //--- separa os registros de localização por ocorrências de caminhada ----
  47. var dbData = localStorage.getItem('Data'); // todos os registros de data
  48. var dbCoor = localStorage.getItem('Local');
  49. var arrDBData = dbData.split('|'); // registros separados por dia
  50. var arrDBCoor = dbCoor.split('|');
  51. var x1 = 1;
  52. ponteiro = 1;
  53. qtdCaminhadas = 0;
  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. // --- variáveis para posicionamento na tela ---
  145. //var pagina = 975;
  146. posImg = 285;
  147. posTxt = 450;
  148. posPorc = 420;
  149. posCoracao = 285;
  150. posPulmao = 485;
  151. posBalanca = 685;
  152. // --- mostra os resultados na tela separados por data, finalizando com as projeções ---
  153. for (y = 0; y < arrResultados.length; y++ ) {
  154. var mesAjustado = arrResultados[y][0].getMonth()+1;
  155. eval('var Destaque' + y + ' = this.add.image(' + posImg + ', 650, "iHealth");');
  156. eval('var Texto' + y + ' = this.add.text(' + posTxt + ', 450, "Data: ' + arrResultados[y][0].getDate() + '/' + mesAjustado + '/' + 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);');
  157. eval('var Coracao' + y + ' = this.add.image(' + posCoracao + ', 950, "coracao");');
  158. eval('var Pulmao' + y + ' = this.add.image(' + posPulmao + ', 950, "pulmao");');
  159. eval('var Balanca' + y + ' = this.add.image(' + posBalanca + ', 950, "balanca");');
  160. eval('this.grpCaminhadas.add(Destaque' + y + ');');
  161. eval('this.grpCaminhadas.add(Texto' + y + ');');
  162. eval('this.grpCaminhadas.add(Coracao' + y + ');');
  163. eval('this.grpCaminhadas.add(Pulmao' + y + ');');
  164. eval('this.grpCaminhadas.add(Balanca' + y + ');');
  165. this.mostraBarra(meta, arrResultados[y][1], posPorc);
  166. // --- ajusta a posição para mostrar os dados da próxima caminhada ---
  167. posImg = posImg - pagina;
  168. posTxt = posTxt - pagina;
  169. posPorc = posPorc - pagina;
  170. posCoracao = posCoracao - pagina;
  171. posPulmao = posPulmao - pagina;
  172. posBalanca = posBalanca - pagina;
  173. }
  174. },
  175. mostraProjecao: function ()
  176. {
  177. var y = arrResultados.length;
  178. // --- tira a média ---
  179. var medDistancia = 0;
  180. var medHoras = 0;
  181. var medMinutos = 0;
  182. var medVelocidade = 0;
  183. var medCalorias = 0;
  184. for (x3 = 0; x3 < arrResultados.length; x3++) {
  185. medDistancia = medDistancia + arrResultados[x3][1];
  186. medHoras = medHoras + arrResultados[x3][2];
  187. medMinutos = medMinutos + arrResultados[x3][3];
  188. medVelocidade = medVelocidade + arrResultados[x3][4];
  189. medCalorias = medCalorias + arrResultados[x3][5];
  190. }
  191. medDistancia = (medDistancia / x3) * 3;
  192. medHoras = (medHoras / x3) * 3;
  193. medMinutos = (medMinutos / x3) * 3;
  194. medVelocidade = (medVelocidade / x3);
  195. medCalorias = (medCalorias / x3) * 3;
  196. eval('var Destaque' + y + ' = this.add.image(1260, 650, "iHealth");');
  197. 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);');
  198. eval('this.grpCaminhadas.add(Destaque' + y + ');');
  199. eval('this.grpCaminhadas.add(Texto' + y + ');');
  200. this.mostraBarra(meta, -1, 1395);
  201. },
  202. poeConteudo: function ()
  203. {
  204. /*
  205. //var boxFechar = this.add.graphics();
  206. var boxConteudo1 = this.add.graphics();
  207. //boxFechar.fillStyle(0xffffff, 1);
  208. //boxFechar.fillCirc(120, 150, 740);
  209. //const btoFechar = this.add.text(500, 200, 'X', { fill: '#0f0' })
  210. // .setInteractive()
  211. // .on('pointerdown', () => boxConteudo1.visible = false; boxCoracao1.visible = false; boxConteudo1.visible = false; );
  212. boxConteudo1.fillStyle(0xffffff, 1);
  213. boxConteudo1.fillRect(120, 150, 740, 1000);
  214. eval('var boxCoracao' + qtdCaminhadas + ' = this.add.image(240, 250, "coracao");');
  215. eval('var boxTitCoracao' + qtdCaminhadas + ' = this.add.text(350, 220,"Saúde Cardíaca", titulo);');
  216. 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);');
  217. boxConteudo1.visible = false;
  218. boxCoracao1.visible = false;
  219. boxTitCoracao1.visible = false;
  220. boxTxtCoracao1.visible = false;
  221. var boxConteudo2 = this.add.graphics();
  222. boxConteudo2.fillStyle(0xffffff, 1);
  223. boxConteudo2.fillRect(120, 150, 740, 1000);
  224. boxConteudo2.visible = false;
  225. var boxConteudo3 = this.add.graphics();
  226. boxConteudo3.fillStyle(0xffffff, 1);
  227. boxConteudo3.fillRect(120, 150, 740, 1000);
  228. boxConteudo3.visible = false;*/
  229. },
  230. getDistanceFromLatLonInKm: function (position1, position2) {
  231. "use strict";
  232. var deg2rad = function (deg) { return deg * (Math.PI / 180); },
  233. R = 6371,
  234. dLat = deg2rad(position2.lat - position1.lat),
  235. dLng = deg2rad(position2.lng - position1.lng),
  236. a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
  237. + Math.cos(deg2rad(position1.lat))
  238. * Math.cos(deg2rad(position1.lat))
  239. * Math.sin(dLng / 2) * Math.sin(dLng / 2),
  240. c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  241. return ((R * c *1000).toFixed());
  242. },
  243. doVoltar: function ()
  244. {
  245. this.scene.start('inicio');
  246. },
  247. /*moveEsquerda: function ()
  248. {
  249. this.cursores.left.isDown = false;
  250. },
  251. moveDireita: function ()
  252. {
  253. this.cursores.right.isDown = false;
  254. },*/
  255. moveCaminhadas: function (direcao)
  256. {
  257. if ((ponteiro < qtdCaminhadas && direcao == '-') || (ponteiro == 1 && direcao == '+')) {
  258. if (direcao == '+') ponteiro--;
  259. else ponteiro++;
  260. var grpMovel = this.grpCaminhadas.getChildren();
  261. for (var i = 0; i < grpMovel.length; i++) {
  262. //alert(grpMovel[i].x + ' -> ' +grpMovel[i].text) ;
  263. if (direcao == '+') grpMovel[i].x -= pagina;
  264. else grpMovel[i].x += pagina;
  265. }
  266. }
  267. },
  268. mostraBarra: function (meta, distancia, posPorc)
  269. {
  270. //--- barra de progressão da caminhada ---
  271. if (distancia > 0) {
  272. eval('var progressBox' + qtdCaminhadas + ' = this.add.graphics();');
  273. var porcentagem = (distancia*100)/meta;
  274. var compBarra = (parseInt(porcentagem*330)/100) + 200;
  275. if (compBarra > 530) compBarra = 530;
  276. eval('progressBox' + qtdCaminhadas + '.fillStyle(0xffffff, 0.8);');
  277. eval('progressBox' + qtdCaminhadas + '.fillRect(210, 320, compBarra, 50);');
  278. eval('progressBox' + qtdCaminhadas + '.fillStyle(0xcccccc, 0.8);');
  279. eval('progressBox' + qtdCaminhadas + '.fillRect(200, 310, 550, 70); ');
  280. }
  281. if (distancia > 0) {
  282. var txtTopo = '';
  283. if (porcentagem <= 30) txtTopo = "DÁ PRA MELHORAR!";
  284. if (porcentagem > 30 && porcentagem <= 60) txtTopo = "JÁ FOI UM COMEÇO!";
  285. if (porcentagem > 60 && porcentagem < 100) txtTopo = "MUITO BEM, CONTINUE!";
  286. if (porcentagem == 100) txtTopo = "CONQUISTA DESBLOQUEADA!";
  287. txtTopo = txtTopo + '\\n\\nmeta: ' + meta + ' metros';
  288. eval('var txtTopo' + qtdCaminhadas + ' = this.add.text(260, 150, "' + txtTopo + '", estilo);');
  289. eval('var Porcentagem' + qtdCaminhadas + ' = this.add.text(' + posPorc + ',325, parseFloat(' + porcentagem + ').toFixed(2) + "%",{ font: "40px Arial", fill: "#CD5C5C", align: "justify" });');
  290. eval('this.grpCaminhadas.add(progressBox' + qtdCaminhadas + ');');
  291. eval('this.grpCaminhadas.add(txtTopo' + qtdCaminhadas + ');');
  292. eval('this.grpCaminhadas.add(Porcentagem' + qtdCaminhadas + ');');
  293. } else {
  294. eval('var txtTopo' + qtdCaminhadas + ' = this.add.text(1200, 150, "PROJEÇÃO PARA 3 MESES!", estilo);');
  295. eval('this.grpCaminhadas.add(txtTopo' + qtdCaminhadas + ');');
  296. }
  297. }
  298. });