page_3.html 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212
  1. <!-- LInE - Free Education, Private Data - http://www.usp.br/line -->
  2. <!DOCTYPE html>
  3. <html lang='pt-br'>
  4. <head>
  5. <meta charset='UTF-8'>
  6. <meta name='viewport' content='width=device-width, initial-scale=1.0'>
  7. <meta name="description" content="Collection of educational games for teaching fractions" />
  8. <meta name="keywords" content="ifractions, ifrações, fraction, game, private data, math, moodle" />
  9. <link rel="icon" type="image/ico" href="../../assets/flag_icon.png">
  10. <link rel="stylesheet" href="../../style/bootstrap/bootstrap.min.css">
  11. <link rel='stylesheet' href="../../style/style.css">
  12. <title>iFractions | Área do Desenvolvedor</title>
  13. <link rel="stylesheet" href="../../style/prism/prism-default.css">
  14. <script src="../../script/prism/prism.js"></script>
  15. </head>
  16. <body class="container-flex">
  17. <!-- menu superior -->
  18. <nav class="navbar navbar-expand-lg navbar-dark ifr__color__blue">
  19. </nav>
  20. <!-- botao de voltar ao inicio da pagina -->
  21. <button onclick="backToTop()" type="button" id="ifr__btn__backToTop" title="Go to top"
  22. class="btn btn-primary">&uparrow;</button>
  23. <!-- modal -->
  24. <div id="myModal" class="modal">
  25. <span class="close">&times;</span>
  26. <img class="modal-content" id="myModal-img" src="">
  27. <div id="caption"></div>
  28. </div>
  29. <!-- header -->
  30. <header class="jumbotron jumbotron-flex p-5">
  31. <nav aria-label="breadcrumb">
  32. <ol class="breadcrumb">
  33. <li class="breadcrumb-item"><a href="../../index.html">Início</a></li>
  34. <li class="breadcrumb-item"><a href="../documentacao.html">Documentação</a></li>
  35. <li class="breadcrumb-item active" aria-current="page">Área do Desenvolvedor - Conhecendo o código</li>
  36. </ol>
  37. </nav>
  38. <h1 id='' class='display-4'>Conhecendo o código</h1>
  39. <p class="lead">
  40. Essa página apresenta os conteúdos
  41. dos arquivos <code>gameMechanics.js</code> e
  42. <code>globals.js</code>. Para visualizar a documentação detalhada dos parâmetros usados nas
  43. funções em <code>gameMechanics.js</code> e das variáveis globais, bem como sobre os estados do iFractions
  44. clique <a href='https://www.ime.usp.br/~laira/ifractions-doc/'>aqui (desatualizado)</a>. Basta navegar pelo menu
  45. lateral.
  46. Esta documentação gerada usando <a href='https://jsdoc.app/'>JSDoc</a> está em inglês e cobre apenas a
  47. porção de javascript do código.
  48. </p>
  49. <hr class="display-4">
  50. </header>
  51. <!-- pagina -->
  52. <main class='container-flex'>
  53. <div class="row">
  54. <!-- menu de navegacao lateral -->
  55. <!-- <div class="col-lg-2 text-start p-1 ifr__toc ifr__noBullet">
  56. </div> -->
  57. <div class="col-lg-2 text-start p-1"></div>
  58. <div class="col-lg-8 px-5">
  59. <!-- titulo -->
  60. <!-- agora o site ta como read only e nao consigo mudar de volta para ifractions-doc (minusculo) - será pq usei mt? tentar novamente depois
  61. OLD: A documentação detalhada dos parâmetros usados nas funções do iFractions e mais está disponível em <a href='https://www.ime.usp.br/~laira/ifractions-doc/'>link</a>. Basta navegar pelo menu lateral, que lista os estados, objetos e variáveis (globais) do código. Esta documentação está em inglês e cobre exclusivamente a porção de javascript do código.
  62. -->
  63. <section id="estado">
  64. <h2>Estados de jogo</h2>
  65. <p>
  66. Como mencionado anteriormente, um estado é um tipo especial de objeto que possui algumas funções
  67. que
  68. seguem
  69. um
  70. comportamento predefinido: <b>preload</b>, <b>create</b> e <b>update</b>. Nessa seção veremos mais
  71. sobre
  72. o
  73. comportamento de cada uma dessas funções.
  74. </p>
  75. <ol type='A'>
  76. <li><b>Preload</b>
  77. <p>
  78. O <code><b>preload</b></code> é a primeira função a ser executada quando um estado é chamado.
  79. Ela
  80. está
  81. encarregada de
  82. carregar todos elementos de mídia para o cache e chamar o <code>create</code>. Ela
  83. <u>executa uma única vez</u>
  84. e
  85. o <code>create</code> só é chamado depois do último elemento de mídia ser carregado.
  86. </p>
  87. <p>
  88. É uma função <u>opcional</u> &minus; se o estado atual não precisar de nenhum elemento
  89. de
  90. mídia novo ela não
  91. precisa
  92. existir.
  93. </p>
  94. </li>
  95. <li><b>Create</b>
  96. <p>
  97. O <code><b>create</b></code> é chamado pelo <code>preload</code> logo após todas mídias serem
  98. carregadas
  99. no
  100. cache. Ele
  101. <u>executa uma única vez</u>. Contém "código principal" do estado atual &minus; desenho
  102. da
  103. tela,
  104. definição de variáveis, criação de eventos etc. Ao fim da sua execução, chama o
  105. <code>update</code>
  106. &minus;
  107. se
  108. existir.
  109. </p>
  110. <p>
  111. É uma função <u>necessária</u> &minus; precisa existir em todos estados, caso contrário
  112. não
  113. tem como mudar de
  114. estado.
  115. </p>
  116. </li>
  117. <li><b>Update</b>
  118. <p>
  119. O <code><b>update</b></code> é chamado logo após o fim da execução do <code>create</code>.
  120. Está
  121. sincronizado
  122. com o laço de
  123. jogo (<i>game loop</i>) e contém o código que reage a mudanças durante a execução. Aqui fica o
  124. código que
  125. reage
  126. a ações do jogador.
  127. <u>Continua sendo executado iterativamente enquanto não sair do estado</u>.
  128. </p>
  129. <p>
  130. É uma função <u>opcional</u> &minus; algumas telas, por exemplo, só aguardam clique de
  131. mouse, ou seja, a única
  132. forma
  133. de mudar de estado é por um evento, não precisando de <code>update</code> pois ações de
  134. eventos
  135. ficam em
  136. funções
  137. próprias.
  138. </p>
  139. <!-- PENSAR SOBRE O FATO DO CANVAS NEM O CONTEXT ESTAR INCLUSO NO JSDOC POR ESTAREM NO INDEX
  140. colocar template de estado
  141. -->
  142. </li>
  143. </ol>
  144. <section id="estado__codigo">
  145. <h3>No código</h3>
  146. <p>
  147. A tabela abaixo mostra a lista com todos estados do iFractions e em que arquivo estão contidos.
  148. </p>
  149. <table class='center-box mb-3'>
  150. <tr>
  151. <th><b>Estado</b></th>
  152. <th><b>Arquivo</b></th>
  153. </tr>
  154. <tr class="border-top">
  155. <td>boot</td>
  156. <td><code>js/menus/menus_boot.js</code></td>
  157. </tr>
  158. <tr class="border-top">
  159. <td>lang<br>loadLang</td>
  160. <td><code>js/menus/menus_lang.js</code></td>
  161. </tr>
  162. <tr class="border-top">
  163. <td>name</td>
  164. <td><code>js/menus/menus_name.js</code></td>
  165. </tr>
  166. <tr class="border-top">
  167. <td>menu</td>
  168. <td><code>js/menus/menu_main.js</code></td>
  169. </tr>
  170. <tr class="border-top">
  171. <td>customMenu</td>
  172. <td><code>js/menus/menu_custom.js</code></td>
  173. </tr>
  174. <tr class="border-top">
  175. <td>map</td>
  176. <td><code>js/screens/map.js</code></td>
  177. </tr>
  178. <tr class="border-top">
  179. <td>end</td>
  180. <td><code>js/screens/end.js</code></td>
  181. </tr>
  182. <tr class="border-top">
  183. <td>studentReport</td>
  184. <td><code>js/moodle/studentReport.js</code></td>
  185. </tr>
  186. <tr class="border-top">
  187. <td>squareOne</td>
  188. <td><code>js/games/squareOne.js</code></td>
  189. </tr>
  190. <tr class="border-top">
  191. <td>circleOne</td>
  192. <td><code>js/games/circleOne.js</code></td>
  193. </tr>
  194. <tr class="border-top">
  195. <td>squareTwo</td>
  196. <td><code>js/games/squareTwo.js</code></td>
  197. </tr>
  198. </table>
  199. <p>
  200. É interessante perceber que, de forma simplista, os estados podem ser divididos em duas
  201. categorias: os
  202. que
  203. unicamente carregam elementos de mídia no cache e as telas.
  204. </p>
  205. <p>
  206. Considere a figura abaixo que corresponde ao fluxo principal do jogo usando
  207. como parâmetros chamadas de estado. Com exceção dos estados <code>boot</code> e <code>loadLang</code>
  208. que
  209. fazem
  210. carregamento, todos os outros estados correspondem a telas no jogo.
  211. </p>
  212. <div class="text-center">
  213. <img src='../../assets/fluxoDeEstados.png' class='ifr__img img-responsive w-75'
  214. alt='Fluxo principal de estados.'>
  215. </div>
  216. <p>
  217. Quando abrimos o iFractions no navegador, o arquivo <code>index.html</code> é executado,
  218. carregando
  219. todos
  220. arquivos do diretório <code>js/</code>, inicializando o Canvas, e criando referência para todos
  221. estados.
  222. Então o
  223. primeiro estado é chamado: <code>boot</code>. Este estado carrega no cache toda mídia necessária
  224. para
  225. as
  226. telas
  227. de selecionar linguagem e inserir nome, além dos ícones persistentes em todas as telas. Os
  228. outros
  229. elementos
  230. de
  231. mídia são carregados a medida que vão sendo necessários quando um estado novo é chamado.
  232. </p>
  233. </section>
  234. </section>
  235. <hr class="display-4" />
  236. <section id="mechanics">
  237. <h2>O arquivo <code class='clear'>gameMechanics.js</code></h2>
  238. <p>
  239. O arquivo <code>js/gameMechanics.js</code> é como uma caixa de ferramenta que contém tudo que o
  240. iFractions
  241. usa
  242. durante a construção do código. Foi desenvolvido pelo LInE-IME-USP, com o intuito de diminuir
  243. dependência
  244. de
  245. arcabouços de terceiros quando não se mostrava necessário.
  246. </p>
  247. <p>
  248. Usando o prefixo <code>game</code>, este arquivo provê diversas funções que fazem o gerenciamento
  249. de
  250. elementos
  251. de
  252. jogabilidade, elementos visuais e sonoros etc, que são usadas em todos outros arquivos JavaScript.
  253. A
  254. seguir
  255. temos a lista das funcionalidades providas por esse arquivo.
  256. </p>
  257. <section id="mechanics__estado">
  258. <h3>1 Gerenciando o comportamento dos estados</h3>
  259. <p>
  260. Como apresentado <a href="#estado">anteriormente</a>, os estados são objetos que se comportam
  261. seguindo
  262. certas características. O <code>game.state</code> contém todo código que define esses
  263. comportamentos,
  264. além
  265. ser
  266. responsável por fazer a preparação para transicionar entre estados (limpar eventos, fila de
  267. mídia,
  268. variáveis
  269. etc). Ele provê as seguintes funções:
  270. </p>
  271. <ul>
  272. <li>
  273. Criar um novo estado:
  274. <pre><code class='language-js'>game.state.add(&lt;params>)</code></pre>
  275. </li>
  276. <li>
  277. Chama/inicia o estado
  278. <pre><code class='language-js'>game.state.start(&lt;params>)</code></pre>
  279. </li>
  280. </ul>
  281. </section>
  282. <section id="mechanics__laco">
  283. <h3 id=''>2 Laço de jogo (<i>Game loop</i>)</h3>
  284. <p>
  285. Quando a função <b>update</b> é chamada dentro de um estado, o laço de jogo é iniciado
  286. (<code>game.loop</code>), sendo executando iterativamente até a saída do estado atual. Ele
  287. permite que
  288. verifiquemos a cada iteração se houve mudança no código por ação do usuário, e é por meio dele
  289. que é
  290. possível
  291. redesenhar tela, estabelecer um temporizador em segundos, executar animação de sprite etc.
  292. </p>
  293. <p>
  294. É importante notar que elas <b>não</b> devem ser usadas diretamente, sendo chamadas pelo
  295. gerenciador
  296. de
  297. estados. Abaixo, as funções disponíveis:
  298. </p>
  299. <ul>
  300. <li>
  301. Inicia o laço de jogo:
  302. <pre><code class='language-js'>game.loop.start()</code></pre>
  303. </li>
  304. <li>
  305. Encerra o laço de jogo:
  306. <pre><code class='language-js'>game.loop.stop()</code></pre>
  307. </li>
  308. </ul>
  309. </section>
  310. <section id="mechanics__midia">
  311. <h3>3 Carregando arquivos de mídia para o cache</h3>
  312. <p>
  313. O <code>game.load</code> recebe um vetor com os caminhos (URL) para arquivos de mídia e os
  314. carrega
  315. para o
  316. <b>cache</b>.
  317. </p>
  318. <p>
  319. Ele deve ser usado <b>exclusivamente</b> dentro da função <b>preload</b> de um estado,
  320. garantindo que
  321. a
  322. função <b>create</b> só seja chamada quando todos elementos de mídia terminarem de ser
  323. carregados.
  324. <i>É importante notar que um elemento de mídia não pode ser usada se não tiver sido antes
  325. carregado no
  326. cache.</i>
  327. </p>
  328. <p>
  329. As funções abaixo carregam elementos de mídia:
  330. </p>
  331. <!-- A cada URL carregada, ela chama <code>game.load.informMediaIsLoaded()</code>, que recebe a quantidade de elementos carregados até o momento e o total.
  332. Quando tudo for carregado, essa função chama <code>game.load.isPreloadDone()</code>, que verifica se todos tipos de mídia necessário para a página foram completamente carregados e por fim chama <code>game.state.create()</code>.
  333. -->
  334. <ul>
  335. <li>
  336. Arquivos de idioma:
  337. <pre><code class='language-js'>game.load.lang(&lt;url>)</code></pre>
  338. </li>
  339. <li>
  340. Audios:
  341. <pre><code class='language-js'>game.load.audio(&lt;urls>)</code></pre>
  342. </li>
  343. <li>
  344. Imagens:
  345. <pre><code class='language-js'>game.load.image(&lt;urls>)</code></pre>
  346. </li>
  347. <li>
  348. Spritesheets:
  349. <pre><code class='language-js'>game.load.sprite(&lt;urls>)</code></pre>
  350. </li>
  351. </ul>
  352. </section>
  353. <section id="mechanics__cache">
  354. <h3>4 Como essa mídia é carregada no cache</h3>
  355. <p>
  356. Levando em consideração que o iFractions é uma aplicação de página única, uma "mudança de tela"
  357. dentro
  358. do
  359. jogo corresponde, na verdade, a desenhar novos elementos gráficos no Canvas, sobrescrevendo a
  360. tela
  361. anterior.
  362. </p>
  363. <p>
  364. Dessa forma, diferente de uma aplicação de varias páginas, onde a cada carregamento os elementos
  365. de
  366. mídia
  367. ficam
  368. prontos antes do código executar, ele utiliza chamadas assíncronas tanto para carregar os
  369. arquivos
  370. necessários
  371. logo no inicio do programa, como para carregar novos elementos durante a execução.
  372. </p>
  373. <p>
  374. Para isso, os arquivos de idioma e de áudio são carregados usando <b>Fetch API</b> e imagens (e
  375. <i>spritesheets</i>) usando <b>HTMLImageElement</b>, ambos nativos do JavaScript.
  376. </p>
  377. </section>
  378. <section id="mechanics__i18n">
  379. <h3>5 Sobre o formato dos arquivos de idioma</h3>
  380. <p>
  381. Estes arquivos não precisam de extensão todo seu conteúdo segue o formato
  382. <code>&lt;chave>=&lt;tradução></code>, onde
  383. as traduções não requerem uso de aspas.
  384. </p>
  385. <p class="text-center">
  386. <b>Ex:</b> <code>insert_name=DIGITE SEU NOME</code> (trecho do arquivo
  387. <code>/assets/lang/pt_BR</code>).
  388. </p>
  389. <p>
  390. Quando o usuário seleciona um idioma, a função
  391. <code>game.load.lang(&lt;caminho para arquivo>)</code>
  392. é
  393. chamada.
  394. Nela o conteúdo do arquivo referente ao idioma escolhido é acessado usando o Fetch API. A função
  395. então
  396. quebra
  397. esse texto em <b>chave</b> e <b>tradução</b> usando a quebra de linha como indicativo de que a
  398. tradução
  399. encerrou, e os salva num objeto que pode ser acessado da forma <code>game.lang.&lt;chave></code>
  400. (como é possível ver na <a href="#mechanics__usaMidia">próxima seção</a> ).
  401. </p>
  402. <div class="text-center mb-3">
  403. <img src='../../assets/lang_files.png' class='ifr__img img-responsive' style='width:150px;'
  404. alt='No iFractions, os arquivos usados para fazer a tradução dos textos ficam no diretório /assets/lang.'>
  405. </div>
  406. </section>
  407. <section id="mechanics__usaMidia">
  408. <h3 id=''>6 Usando arquivos de idioma e áudio diretamente</h3>
  409. <p>
  410. O <code>gameMechanics.js</code> contém os objetos <code>audio, lang, image</code> e
  411. <code>sprite</code>,
  412. onde os elementos de mídia são salvos pelo <code>game.load</code> porém apenas
  413. <code>audio</code> e
  414. <code>lang</code> devem ser acessados diretamente.
  415. </p>
  416. <p>
  417. Abaixo a forma de acesso desse tipos de mídia:
  418. </p>
  419. <ul>
  420. <li>
  421. Toca o som:
  422. <pre><code class='language-js'>game.audio.&lt;nome do audio>.play()</code></pre>
  423. </li>
  424. <li>
  425. Retorna a tradução associada àquela chave de acordo com o idioma selecionado pelo jogador:
  426. <pre><code class='language-js'>game.lang.&lt;chave da palavra></code></pre>
  427. </li>
  428. </ul>
  429. <p>
  430. Já os objetos <code>image</code> e <code>sprite</code> <b>não</b> devem ser acessados
  431. diretamente, mas
  432. sim
  433. por meio da função <code>game.add</code> &minus; <a href="#mechanics__canvasIndireto">seção 7</a> &minus;
  434. que salva os
  435. elementos
  436. gráficos
  437. na
  438. <b>fila de mídia</b> para o estado atual. A fila de mídia é usada <b>exclusivamente</b> por
  439. <code>game.render</code>, que é chamado pelo gerenciados de estados. Mais sobre os detalhes
  440. dessa
  441. implementação
  442. na <a href="#mechanics__canvasDireto">seção 8</a></span>.
  443. </p>
  444. </section>
  445. <section id="mechanics__canvasIndireto">
  446. <h3 id=''>7 Desenhando na tela (indiretamente)</h3>
  447. <p>
  448. As funções providas por <code>game.add</code> podem ser usadas sempre que for desejado colocar
  449. algum elemento gráfico na tela. No entanto, é importante notar que, por si só, ela não renderiza esses
  450. elementos na tela. Todo desenho no Canvas é realizado por <code>game.render</code> (<a
  451. href="#mechanics__canvasDireto">seção
  452. 8</a>), que é chamado pelo gerenciador de estados quando este redesenha o Canvas. Assim, o papel das
  453. funções abaixo é adicionar esses elementos para a fila de renderização. Obs.:
  454. <i>Os parâmetros em negrito são obrigatórios enquanto os outros são opcionais.</i>
  455. </p>
  456. <ul>
  457. <li>
  458. Imagem:
  459. <pre><code class='language-js'>game.add.image(&lt;params>)</code></pre>
  460. <code>&lt;params> = <b>x, y, img</b>, scale, alpha</code>
  461. </li>
  462. <li>
  463. Spritesheet:
  464. <pre><code class='language-js'>game.add.sprite(&lt;params>)</code></pre>
  465. <code>&lt;params> = <b>x, y, img</b>, curFrame, scale, alpha</code>
  466. </li>
  467. <li>Texto:
  468. <pre><code class='language-js'>game.add.text(&lt;params>)</code></pre>
  469. <code>&lt;params> = <b>x, y, text, style</b>, align</code>
  470. </li>
  471. </ul>
  472. <p>
  473. Figuras geométricas também podem ser criadas usando <code>game.add.graphic</code>:
  474. </p>
  475. <ul>
  476. <li>
  477. Retângulo:
  478. <pre><code class='language-js'>game.add.graphic.rect(&lt;params>)</code></pre>
  479. <code>&lt;params> = <b>x, y, width, height</b>, lineColor, lineWidth, fillColor, alpha</code>
  480. <br>
  481. </li>
  482. <li>
  483. Círculo:
  484. <pre><code class='language-js'>game.add.graphic.circle(&lt;params>)</code></pre>
  485. <code>&lt;params> = <b>x, y, diameter</b>, lineColor, lineWidth, fillColor, alpha</code>
  486. </li>
  487. <li>
  488. Arco:
  489. <pre><code class='language-js'>game.add.graphic.arc(&lt;param>)</code></pre>
  490. <code>&lt;params> = <b>x, y, diameter, angleStart, angleEnd</b>, anticlockwise, lineColor, lineWidth, fillColor, alpha</code>
  491. <br>
  492. </li>
  493. <li>
  494. Linha (em construção):
  495. <pre><code class='language-js'>game.add.graphic.line(&lt;param>)</code></pre>
  496. <code>&lt;params> = <b>x0, y0</b>, x1, y1, lineWidth, lineColor, alpha</code>
  497. <br>
  498. </li>
  499. </ul>
  500. <section id="mechanics__canvasIndireto__props">
  501. <h4>7.1 Algumas propriedades disponíveis para esses elementos</h4>
  502. <ul>
  503. <li>
  504. Pivô:
  505. <pre><code class='language-js'>&lt;mídia>.anchor(&lt;valor horizontal>,&lt;valor vertical>)</code></pre>
  506. </li>
  507. <li>
  508. Adicionar sombra na figura:
  509. <pre><code class='language-js'>&lt;mídia>.shadow = &lt;valor booleano></code></pre>
  510. </li>
  511. <li>
  512. Rotação:
  513. <pre><code class='language-js'>&lt;mídia>.angle = &lt;ângulo em graus></code></pre>
  514. </li>
  515. <li>
  516. Transparência:
  517. <pre><code class='language-js'>&lt;mídia>.alpha = &lt;valor entre 0 e 1></code></pre>
  518. </li>
  519. </ul>
  520. <p>
  521. A tabela abaixo apresenta uma visualização das propriedades disponíveis
  522. para
  523. cada
  524. elemento
  525. gráfico adicionado usando <code>game.add</code>. Em verde temos os parâmetros obrigatórios na
  526. criação,
  527. em
  528. amarelo o parâmetros opcionais, em azul as outras propriedades que podem ser usadas e em
  529. branco as
  530. propriedades
  531. que o elemento não tem acesso.
  532. <!--
  533. ver se tem rotação na criação do objeto ou se ele pode so ser adicionado depois e considerado por game.render
  534. -->
  535. </p>
  536. <div class='center'>
  537. <!--<table class='center-box' style='border-left: none; border-top: none'>-->
  538. <table class='table table-bordered'>
  539. <thead>
  540. <tr>
  541. <td></td>
  542. <th><span class='vertical'><b>image</b></span></th>
  543. <th><span class='vertical'><b>sprite</b></span></th>
  544. <th><span class='vertical'><b>text</b></span></th>
  545. <th><span class='vertical'>geom.<b>rect</b></span></th>
  546. <th><span class='vertical'>geom.<b>circle</b></span></th>
  547. <th><span class='vertical'>geom.<b>arc</b></span></th>
  548. <th><span class='vertical'>(em progresso)<br>geom.<b>line</b></span></th>
  549. </tr>
  550. </thead>
  551. <tbody>
  552. <tr>
  553. <th>x</th>
  554. <td class='table-success'></td>
  555. <td class='table-success'></td>
  556. <td class='table-success'></td>
  557. <td class='table-success'></td>
  558. <td class='table-success'></td>
  559. <td class='table-success'></td>
  560. <td></td>
  561. </tr>
  562. <tr>
  563. <th>y</th>
  564. <td class='table-success'></td>
  565. <td class='table-success'></td>
  566. <td class='table-success'></td>
  567. <td class='table-success'></td>
  568. <td class='table-success'></td>
  569. <td class='table-success'></td>
  570. <td></td>
  571. </tr>
  572. <tr>
  573. <th>img</th>
  574. <td class='table-success'></td>
  575. <td class='table-success'></td>
  576. <td></td>
  577. <td></td>
  578. <td></td>
  579. <td></td>
  580. <td></td>
  581. </tr>
  582. <tr>
  583. <th>scale</th>
  584. <td class='table-warning'></td>
  585. <td class='table-warning'></td>
  586. <td></td>
  587. <td class='table-primary'></td>
  588. <td class='table-primary'></td>
  589. <td class='table-primary'></td>
  590. <td></td>
  591. </tr>
  592. <tr>
  593. <th>alpha</th>
  594. <td class='table-warning'></td>
  595. <td class='table-warning'></td>
  596. <td class='table-primary'></td>
  597. <td class='table-warning'></td>
  598. <td class='table-warning'></td>
  599. <td class='table-warning'></td>
  600. <td></td>
  601. </tr>
  602. <tr>
  603. <th>curFrame</th>
  604. <td></td>
  605. <td class='table-warning'></td>
  606. <td></td>
  607. <td></td>
  608. <td></td>
  609. <td></td>
  610. <td></td>
  611. </tr>
  612. <tr>
  613. <th>width</th>
  614. <td class='table-primary'></td>
  615. <td class='table-primary'></td>
  616. <td></td>
  617. <td class='table-success'></td>
  618. <td></td>
  619. <td></td>
  620. <td></td>
  621. </tr>
  622. <tr>
  623. <th>height</th>
  624. <td class='table-primary'></td>
  625. <td class='table-primary'></td>
  626. <td></td>
  627. <td class='table-warning'></td>
  628. <td></td>
  629. <td></td>
  630. <td></td>
  631. </tr>
  632. <tr>
  633. <th>text</th>
  634. <td></td>
  635. <td></td>
  636. <td class='table-success'></td>
  637. <td></td>
  638. <td></td>
  639. <td></td>
  640. <td></td>
  641. </tr>
  642. <tr>
  643. <th>style</th>
  644. <td></td>
  645. <td></td>
  646. <td class='table-success'></td>
  647. <td></td>
  648. <td></td>
  649. <td></td>
  650. <td></td>
  651. </tr>
  652. <tr>
  653. <th>align</th>
  654. <td></td>
  655. <td></td>
  656. <td class='table-primary'></td>
  657. <td></td>
  658. <td></td>
  659. <td></td>
  660. <td></td>
  661. </tr>
  662. <tr>
  663. <th>font</th>
  664. <td></td>
  665. <td></td>
  666. <td class='table-primary'></td>
  667. <td></td>
  668. <td></td>
  669. <td></td>
  670. <td></td>
  671. </tr>
  672. <tr>
  673. <th>fill</th>
  674. <td></td>
  675. <td></td>
  676. <td class='table-primary'></td>
  677. <td></td>
  678. <td></td>
  679. <td></td>
  680. <td></td>
  681. </tr>
  682. <tr>
  683. <th>lineColor</th>
  684. <td></td>
  685. <td></td>
  686. <td></td>
  687. <td class='table-warning'></td>
  688. <td class='table-warning'></td>
  689. <td class='table-warning'></td>
  690. <td></td>
  691. </tr>
  692. <tr>
  693. <th>lineWidth</th>
  694. <td></td>
  695. <td></td>
  696. <td></td>
  697. <td class='table-warning'></td>
  698. <td class='table-warning'></td>
  699. <td class='table-warning'></td>
  700. <td></td>
  701. </tr>
  702. <tr>
  703. <th>fillColor</th>
  704. <td></td>
  705. <td></td>
  706. <td></td>
  707. <td class='table-warning'></td>
  708. <td class='table-warning'></td>
  709. <td class='table-warning'></td>
  710. <td></td>
  711. </tr>
  712. <tr>
  713. <th>diameter</th>
  714. <td></td>
  715. <td></td>
  716. <td></td>
  717. <td></td>
  718. <td class='table-success'></td>
  719. <td class='table-success'></td>
  720. <td></td>
  721. </tr>
  722. <tr>
  723. <th>angleStart</th>
  724. <td></td>
  725. <td></td>
  726. <td></td>
  727. <td></td>
  728. <td class='table-primary'></td>
  729. <td class='table-success'></td>
  730. <td></td>
  731. </tr>
  732. <tr>
  733. <th>angleEnd</th>
  734. <td></td>
  735. <td></td>
  736. <td></td>
  737. <td></td>
  738. <td class='table-primary'></td>
  739. <td class='table-success'></td>
  740. <td></td>
  741. </tr>
  742. <tr>
  743. <th>anticlockwise</th>
  744. <td></td>
  745. <td></td>
  746. <td></td>
  747. <td></td>
  748. <td class='table-primary'></td>
  749. <td class='table-warning'></td>
  750. <td></td>
  751. </tr>
  752. <tr>
  753. <th>xAnchor</th>
  754. <td class='table-primary'></td>
  755. <td class='table-primary'></td>
  756. <td></td>
  757. <td class='table-primary'></td>
  758. <td></td>
  759. <td></td>
  760. <td></td>
  761. </tr>
  762. <tr>
  763. <th>yAnchor</th>
  764. <td class='table-primary'></td>
  765. <td class='table-primary'></td>
  766. <td></td>
  767. <td class='table-primary'></td>
  768. <td></td>
  769. <td></td>
  770. <td></td>
  771. </tr>
  772. <tr>
  773. <th>anchor</th>
  774. <td class='table-primary'></td>
  775. <td class='table-primary'></td>
  776. <td></td>
  777. <td class='table-primary'></td>
  778. <td></td>
  779. <td></td>
  780. <td></td>
  781. </tr>
  782. <tr>
  783. <th>xWithAnchor</th>
  784. <td class='table-primary'></td>
  785. <td class='table-primary'></td>
  786. <td></td>
  787. <td class='table-primary'></td>
  788. <td></td>
  789. <td></td>
  790. <td></td>
  791. </tr>
  792. <tr>
  793. <th>yWithAnchor</th>
  794. <td class='table-primary'></td>
  795. <td class='table-primary'></td>
  796. <td></td>
  797. <td class='table-primary'></td>
  798. <td></td>
  799. <td></td>
  800. <td></td>
  801. </tr>
  802. <tr>
  803. <th>shadow</th>
  804. <td class='table-primary'></td>
  805. <td class='table-primary'></td>
  806. <td></td>
  807. <td class='table-primary'></td>
  808. <td></td>
  809. <td></td>
  810. <td></td>
  811. </tr>
  812. <tr>
  813. <th>shadowColor</th>
  814. <td class='table-primary'></td>
  815. <td class='table-primary'></td>
  816. <td class='table-primary'></td>
  817. <td class='table-primary'></td>
  818. <td class='table-primary'></td>
  819. <td class='table-primary'></td>
  820. <td></td>
  821. </tr>
  822. <tr>
  823. <th>shadowBlur</th>
  824. <td class='table-primary'></td>
  825. <td class='table-primary'></td>
  826. <td class='table-primary'></td>
  827. <td class='table-primary'></td>
  828. <td class='table-primary'></td>
  829. <td class='table-primary'></td>
  830. <td></td>
  831. </tr>
  832. </tbody>
  833. </table>
  834. <p>
  835. Lista de propriedades de cada elemento gráfico adicionados usando <code
  836. class='language-js'>game.add</code> &minus; em verde
  837. os parametros obrigatórios na criação; em amarelo os parametros opcionais; em azul as outras
  838. propriedades disponíveis.
  839. </p>
  840. </div>
  841. </section>
  842. </section>
  843. <section id="mechanics__canvasDireto">
  844. <h3>8 Desenhando na tela (diretamente)</h3>
  845. <p>
  846. Em <code>game.render</code> está o código que pega um objeto previamente criado em
  847. <code>game.add</code>
  848. e
  849. desenha na tela usando as propriedade do elemento Canvas.
  850. </p>
  851. <p>
  852. Ele utiliza uma fila de renderização &minus; <code>game.render.queue</code> &minus; para
  853. estabelecer a
  854. ordem
  855. de
  856. desenho
  857. na
  858. tela e é chamada <b>exclusivamente</b> pelo gerenciador de estados &minus; que redesenha a tela
  859. a cada
  860. chamada
  861. do
  862. laço de jogo.
  863. </p>
  864. <p>
  865. É importante notar que o processo de desenho na tela foi dividido em <code
  866. class='language-js'>game.add</code>
  867. e
  868. <code>game.render</code> por conta do laço de jogo, que redesenha a tela diversas
  869. vezes.
  870. </p>
  871. <p>
  872. <b>Resumindo a estrutura:</b> <code>game.add</code> cria o elemento e o salva na fila
  873. de renderização e
  874. <code>game.render</code> (re)desenha os elementos da fila de renderização na tela sempre que é
  875. chamado
  876. pelo
  877. gerenciador de estados &minus; <code>game.state</code> &minus; que, por sua vez, segue o tempo
  878. estabelecido pelo
  879. laço
  880. de
  881. jogo &minus; <code>game.loop</code>.
  882. </p>
  883. <ul>
  884. <li>
  885. Desenha no Canvas todos elementos que estão na na fila de renderização:
  886. <pre><code class='language-js'>game.render.all()</code></pre>
  887. </li>
  888. <li>
  889. Limpa a fila de renderização. É chamado pelo gerenciador de estados ao sair de um estado para
  890. que
  891. elementos antigos não sigam sendo redesenhados na tela:
  892. <pre><code class='language-js'>game.render.clear()</code></pre>
  893. </li>
  894. </ul>
  895. </section>
  896. <section id="mechanics__matematica">
  897. <h3>9 Funções matemáticas</h3>
  898. <!-- adicionar novas -->
  899. <p>
  900. Algumas funções são necessárias diversas vezes no jogo então foram centralizadas em
  901. <code>game.math</code>.
  902. </p>
  903. <ul>
  904. <li>
  905. Retorna um inteiro entre dois números
  906. <pre><code class='language-js'>game.math.randomInRange(&lt;params>)</code></pre>
  907. </li>
  908. <li>
  909. Retorna um divisor aleatório de um número:
  910. <pre><code class='language-js'>game.math.randomDivisor(&lt;params>)</code></pre>
  911. </li>
  912. <li>
  913. Converte de grau para radiano:
  914. <pre><code class='language-js'>game.math.degreeToRad(&lt;params>)</code></pre>
  915. </li>
  916. <li>
  917. Retorna a distância do centro de um ícone para o ponteiro do mouse:
  918. <pre><code class='language-js'>game.math.distanceToPointer(&lt;params>)</code></pre>
  919. </li>
  920. <li>
  921. verifica se ponteiro está sobre um ícone (frequentemente usada para validar eventos de mouse):
  922. <pre><code class='language-js'>game.math.isOverIcon(&lt;params>)</code></pre>
  923. </li>
  924. </ul>
  925. </section>
  926. <section id="mechanics__mouse">
  927. <h3 id=''>10 Eventos de mouse</h3>
  928. <p>
  929. O <code>game.event</code> encapsula <b>eventos</b> para que sejam usados pelo gerenciador de
  930. estado.
  931. Atualmente, ele captura eventos de mouse e toque de tela.
  932. </p>
  933. <ul>
  934. <li>
  935. Captura evento de clique de mouse (e toque de tela):
  936. <pre><code class='language-js'>game.event.add('click',&lt;função>)</code></pre>
  937. </li>
  938. <li>
  939. Captura evento de movimento de mouse. Usado para ver se o ponteiro está sobre um ícone:
  940. <pre><code class='language-js'>game.event.add('move',&lt;função>)</code></pre>
  941. </li>
  942. </ul>
  943. <p>
  944. É importante entender a forma como o Canvas lida com eventos. Elementos desenhados no Canvas não
  945. são
  946. isolados do
  947. mesmo, assim, o evento é capturado pelo Canvas como um todo e não pelo elemento separadamente.
  948. </p>
  949. <p>
  950. Assim, quando um evento é capturado, a função definida como parâmetro na criação do evento é
  951. chamada.
  952. Por
  953. convenção usamos os nomes <code>onInputOver()</code> e <code>onInputDown()</code> e precisam ser
  954. declaradas
  955. dentro do estado que contém o
  956. evento.
  957. </p>
  958. <p>
  959. Assim, quando estas funções são chamadas, sabemos que um evento foi capturado pelo Canvas, mas
  960. não
  961. sabemos
  962. se o
  963. ponteiro está sobre um elemento válido. Então essas funções devem fazer essa verificação. Para
  964. isso
  965. usamos
  966. sempre que possível a função <code>game.math.isOverIcon()</code>,
  967. que
  968. recebe
  969. a lista de ícones válidos e as coordenadas do ponteiro e retorna se este está sobre algum deles.
  970. </p>
  971. </section>
  972. <section id="mechanics__animacao">
  973. <h3>11 Animação de sprites</h3>
  974. <!-- O Spritesheet é... -->
  975. <p>
  976. As funções providas por <code>game.animation</code> gerenciam as animações do jogo. Essas
  977. animações
  978. são
  979. feitas iterando pelos frames de um <i>spritesheet</i> a cada iteração do laço de jogo.
  980. </p>
  981. <ul>
  982. <li>
  983. Começa a executar uma animação:
  984. <pre><code class='language-js'>game.animation.play(&lt;params>)</code></pre>
  985. </li>
  986. <li>
  987. Para uma animação:
  988. <pre><code class='language-js'>game.animation.stop(&lt;params>)</code></pre>
  989. </li>
  990. </ul>
  991. <p>
  992. Uma vez que seja adicionada a propriedade <code>animation</code> a um sprite ele pode ser
  993. animado
  994. usando
  995. estas
  996. funções acima.
  997. </p>
  998. <ul>
  999. <li>
  1000. Adiciona a um <i>spritesheet</i> a propriedade de animação:
  1001. <pre><code class='language-js'>&lt;sprite>.animation = [&lt;nome>,[&lt;frames>]]</code></pre>
  1002. </li>
  1003. </ul>
  1004. </section>
  1005. <section id="mechanics__temp">
  1006. <h3 id=''>12 Temporizador</h3>
  1007. <p>
  1008. Usado no iFractions para calcular o tempo que o jogador levou para terminar um jogo, o
  1009. <code>game.timer</code> está associado ao laço de jogo e conta os segundos passados
  1010. desde o inicio do seu contador até o fim.
  1011. </p>
  1012. <ul>
  1013. <li>
  1014. Inicia o contador:
  1015. <pre><code class='language-js'>game.timer.start()</code></pre>
  1016. </li>
  1017. <li>
  1018. Para o contador:
  1019. <pre><code class='language-js'>game.timer.stop()</code></pre>
  1020. </li>
  1021. <li>
  1022. Retorna o tempo percorrido:
  1023. <pre><code class='language-js'>game.timer.elapsed</code></pre>
  1024. </li>
  1025. </ul>
  1026. </section>
  1027. </section>
  1028. <hr class=" display-4" />
  1029. <section id="global">
  1030. <h2>O arquivo <code class='clear'>globals.js</code></h2>
  1031. <p>Em construção...</p>
  1032. <!-- <p>
  1033. O arquivo <code>/js/globals.js</code> contém variáveis, objetos e funções globais do iFractions,
  1034. possuindo
  1035. informações como <code>gameType, levelType, sublevelType, gameDifficulty</code>, que definem a
  1036. escolha
  1037. do
  1038. jogo atual, como ilustrado pela tabela <span>\ref{tab:niveis}</span>). -->
  1039. <!-- Expandir.
  1040. item -> <code>url</code> - contém as URL para os arquivos de mídia; usado para parâmetro para
  1041. <code>game.load</code>; divide as URL por tela onde é carregada e tipo de mídia.
  1042. -->
  1043. </p>
  1044. </section>
  1045. <div class="d-flex justify-content-between">
  1046. <a class="btn btn-primary" href='./page_2.html' role="button">Voltar - tecnologias utilizadas</a>
  1047. </div>
  1048. </div>
  1049. <div class="col-lg-2 p-1"></div>
  1050. </div>
  1051. </main>
  1052. <!-- rodape -->
  1053. <footer id='footer' class="container-flex mt-5 py-5 text-center"></footer>
  1054. </body>
  1055. <script src="../../script/bootstrap/bootstrap.bundle.min.js"></script>
  1056. <script src="../../script/index.js"></script>
  1057. <script>
  1058. updateMenu(2);
  1059. </script>
  1060. </html>