Page3_Fr.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <html>
  2. <head>
  3. <title>
  4. Lier une Dll &agrave; LuaEdit (Tutoriel) - G&eacute;rer le Jeu
  5. </title>
  6. <link rel="stylesheet" href="..\Tutorial.css" type="text/css">
  7. </head>
  8. <body bgcolor="#FFFFFF" vlink="silver" alink="navy" link="navy">
  9. <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
  10. <tr>
  11. <td valign="bottom">
  12. <div align="left">
  13. <b><font face="Tahoma" size="3" color="navy">G&eacute;rer le Jeu</font></b>
  14. </div>
  15. </td>
  16. <td>
  17. <font face="Tahoma" size="1" color="silver">
  18. <div align="right" valign="top">
  19. <a href="http://www.lua.org">Page d'accueuil Lua</a>
  20. </div>
  21. </font>
  22. </td>
  23. </tr>
  24. <tr valign="top">
  25. <td colspan="2">
  26. <hr size="1" color="#000000">
  27. <br>
  28. <br>
  29. <font face="Tahoma" size="2">
  30. <p style="text-align:justify">
  31. Maintenant, la script contient de solides bases/structures autour desquelles nous allons
  32. ajouter du code pour g&eacute;rer le jeu. Cela signifie algorythmes de g&eacute;n&eacute;ration al&eacute;atoire de s&eacute;quence,
  33. validations de touche, syst&egrave;me de pointage, etc. Commencons par la routine d'intialisation du jeu.
  34. </p>
  35. <br>
  36. </font>
  37. </td>
  38. </tr>
  39. <tr>
  40. <td colspan="2">
  41. <font face="Tahoma" size="2">
  42. <p style="text-align:justify">
  43. La fonction simon:Initialize() pr&eacute;c&eacute;demment ajout&eacute;e sera appel&eacute; juste avant chaque nouvelle partie
  44. requise par le joueur. Notre but principal dans cette fonction est de r&eacute;initialiser tout les variables de manipulation
  45. pr&eacute;c&eacute;demment cr&eacute;&eacute;es et initialiser la logique de hasard. Dans le monde des ordinateurs, g&eacute;n&eacute;rer
  46. le hasard est loin d'&ecirc;tre une mince chose &agrave; accomplir. Soyons r&eacute;alistes, il est impossible de recr&eacute;er
  47. exactement ce que le hasard est par d&eacute;finition. D'un autre c&ocirc;t&eacute;, nous pouvons g&eacute;n&eacute;rer quelque chose
  48. de si grand en termes de quantit&eacute; de possibilit&eacute;s, que statistiquement et humainement parlant, nous pouvons
  49. appeler cela du hasard. Le moteur de pseudo-hasard de Lua fonctionne de la m&ecirc;me mani&egrave;re que celui du C/C++.
  50. En fait, "derri&egrave;re la sc&egrave;ne", Lua utilise le moteur de pseudo-harsard du C/C++. Ce moteur fonctionne
  51. avec des "seeds" (semances) pour g&eacute;n&eacute;rer des s&eacute;quences de num&eacute;ros au "hasard". Une "seed" (semance) est un nombre qui sera
  52. utilis&eacute; pour g&eacute;n&eacute;rer les num&eacute;ros au "hasard". En d'autre mots, deux s&eacute;quences utilisant la m&ecirc;me "seed" (semance)
  53. sera identique. Pour &eacute;viter ce probl&egrave;me, plusieurs scripts/programmes utilisent l'heure courrante du syst&egrave;me
  54. comme "seed" (semance), ce qui rend pratiquement impossible pour l'utilisateur d'obetenir ou m&ecirc;me de se rappeler
  55. d'avoir obetenue la m&ecirc;me s&eacute;quence. Voici comment la fonction simon:Initialize() devrait ressembler &agrave;:
  56. </p>
  57. <br>
  58. </td>
  59. </tr>
  60. <tr>
  61. <td class="code" colspan="2">
  62. <br>
  63. <blockquote>
  64. -- Initialize the game<br>
  65. function simon:Initialize()<br>
  66. &nbsp;&nbsp;&nbsp;&nbsp;-- Initalize variables<br>
  67. &nbsp;&nbsp;&nbsp;&nbsp;simon:SetScore(0)<br>
  68. &nbsp;&nbsp;&nbsp;&nbsp;GameState = true<br>
  69. &nbsp;&nbsp;&nbsp;&nbsp;UserSequenceCount = 0<br>
  70. &nbsp;&nbsp;&nbsp;&nbsp;SequenceCount = 0<br>
  71. &nbsp;&nbsp;&nbsp;&nbsp;MainSequence = {}<br><br>
  72. &nbsp;&nbsp;&nbsp;&nbsp;-- Initialize random engine<br>
  73. &nbsp;&nbsp;&nbsp;&nbsp;math.randomseed(os.time())<br>
  74. &nbsp;&nbsp;&nbsp;&nbsp;math.random()<br>
  75. &nbsp;&nbsp;&nbsp;&nbsp;math.random()<br>
  76. &nbsp;&nbsp;&nbsp;&nbsp;math.random()<br>
  77. end<br>
  78. </blockquote>
  79. </td>
  80. </tr>
  81. <tr>
  82. <td colspan="2">
  83. <font face="Tahoma" size="2">
  84. <br>
  85. <br>
  86. <p style="text-align:justify">
  87. Dans le pr&eacute;c&eacute;dent exemple de code, la fonction math.random() est appel&eacute;e par trois fois parce que sur certains
  88. syst&egrave;me d'exploitation (du moins dans Windows 2k<sup>&reg;</sup>) les premiers num&eacute;ros d'une s&eacute;quence de hasard que vous obtenez ne sont pas r&eacute;ellement
  89. "hasard&eacute;s". (Source prise du site web <a href="http://lua-users.org/wiki/MathLibraryTutorial">lua-users wiki</a>) Pour obtenir de meilleur pseudo-hasardeux num&eacute;ros, nous avons juste &agrave; g&eacute;n&eacute;rer quelques num&eacute;ros au hasard
  90. avant de r&eacute;ellement les utiliser. Les autre lignes de code dans le pr&eacute;c&eacute;dent exemple initialise les variables pr&eacute;c&eacute;demment
  91. d&eacute;clar&eacute;es &agrave; <a href=".\Page2_En.html">l'&eacute;tape 2</a> de ce tutoriel. Maintenant, ajoutons du code &agrave; la
  92. fonction simon:AddSequence(Sequence). Le but de cette fonction est d'ajouter un nouvel item &agrave; s&eacute;quence
  93. principale que le joueur essaira de reproduire plus tard. Pour se faire, nous incr&eacute;menterons par 1
  94. la variable globale SequenceCount et nous "hasarderons" un num&eacute;ro de 1 &agrave; 4. Le num&eacute;ro g&eacute;n&eacute;r&eacute;
  95. repr&eacute;sentera une des lumi&egrave;re &agrave; allumer dans la s&eacute;quence. Voici &agrave; quoi la fonction devrait ressembler &agrave;:
  96. </p>
  97. <br>
  98. </td>
  99. </tr>
  100. <tr>
  101. <td class="code" colspan="2">
  102. <br>
  103. <blockquote>
  104. -- Add one more part to the game's sequence<br>
  105. function simon:AddSequence()<br>
  106. &nbsp;&nbsp;&nbsp;&nbsp;SequenceCount = SequenceCount + 1<br>
  107. &nbsp;&nbsp;&nbsp;&nbsp;MainSequence[SequenceCount] = math.random(4)<br>
  108. end<br>
  109. </blockquote>
  110. </td>
  111. </tr>
  112. <tr>
  113. <td colspan="2">
  114. <font face="Tahoma" size="2">
  115. <br>
  116. <br>
  117. <p style="text-align:justify">
  118. Maintenant, remplissons la fonction simon:PlaySequence(Sequence). Le principal obectif de cette
  119. fonction est de jouer une s&eacute;quence pr&eacute;c&eacute;demment b&acirc;tit par l'interm&eacute;diaire de fonctions export&eacute;es du
  120. moteur du jeu Simon<sup>&reg;</sup>. Dans cette fonction, on devrait analyser la table de la s&eacute;quence principale
  121. item par item et allumet la lumi&egrave;re qui correspond avec la valeur de l'item courrant.
  122. Soyons un peu plus sp&eacute;cifique:
  123. </p>
  124. <br>
  125. </td>
  126. </tr>
  127. <tr>
  128. <td class="code" colspan="2">
  129. <br>
  130. <blockquote>
  131. -- Play the game's sequence<br>
  132. function simon:PlaySequence(Sequence)<br>
  133. &nbsp;&nbsp;&nbsp;&nbsp;local v = nil<br>
  134. &nbsp;&nbsp;&nbsp;&nbsp;local i = nil<br><br>
  135. &nbsp;&nbsp;&nbsp;&nbsp;-- Lock controls from user to make sure no conflicts happened while palying sequence<br>
  136. &nbsp;&nbsp;&nbsp;&nbsp;simon.LockControls()<br><br>
  137. &nbsp;&nbsp;&nbsp;&nbsp;-- Play all sequence<br>
  138. &nbsp;&nbsp;&nbsp;&nbsp;repeat<br>
  139. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon.SetLight(SIMON_NONE)<br>
  140. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(300)<br>
  141. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i, v = next(Sequence, i)<br>
  142. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon.SetLight(v)<br><br>
  143. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if i ~= nil then<br>
  144. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(500)<br>
  145. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>
  146. &nbsp;&nbsp;&nbsp;&nbsp;until i == nil<br><br>
  147. &nbsp;&nbsp;&nbsp;&nbsp;simon.UnlockControls()<br>
  148. &nbsp;&nbsp;&nbsp;&nbsp;simon.SetLight(SIMON_NONE)<br>
  149. end<br>
  150. </blockquote>
  151. </td>
  152. </tr>
  153. <tr>
  154. <td colspan="2">
  155. <font face="Tahoma" size="2">
  156. <br>
  157. <br>
  158. <p style="text-align:justify">
  159. Les deux variables locales v et i serons utilis&eacute;es pour r&eacute;cup&eacute;rer le r&eacute;sultat
  160. du retour aux appels &agrave; la fonction next(). La fonction next() sert &agrave; obtenir l'item
  161. suivant l'&eacute;l&eacute;ment donn&eacute; dans une table Lua en passant celle-ci et l'index de
  162. l'&eacute;l&eacute;ment courrant comme arguments. Les fonctions simon.LockControls() et simon.UnlockControls()
  163. sont export&eacute;es du moteur du jeu leur but principal est de verrouiller/d&eacute;verrouiller
  164. les contr&ocirc;les au joueur afin d'&eacute;viter toute conflit dans le code. Dans le pr&eacute;c&eacute;dent exemple
  165. de code, ces appels effectu&eacute;s avant et apr&egrave;s la boucle qui s'occupe d'afficher la s&eacute;quence
  166. au joueur &agrave; l'&eacute;cran. Aussi, la l'exemple de code, l'instruction repeat...until
  167. a &eacute;t&eacute; utilis&eacute; afin de permettre au code d'entrer dans la bouvle &agrave; la premi&egrave;re it&eacute;ration
  168. chaque fois qu'il le doit mais n'importe quel autre syntaxe de boucle aurait tr&egrave;s bien pu faire l'affaire.
  169. Le premier morceau de code dans la boucle principale est un appel &agrave; la fonction simon.SetLight() utilisant
  170. SIMON_NONE comme premier et seul argument. Cette instruction fermera tout les lumi&egrave;res
  171. dans le jeu parce que nous voulons nous assurer que pour chaque item il n'y aille pas d'autre lumi&egrave;re allum&eacute;e
  172. que celle repr&eacute;senter par l'item courrant. Ensuite, nous avons un appel &agrave; la fonction Sleep() avec 300 miliseconds
  173. comme argument. Cet appel, contrairement &agrave; celui &agrave; <a href=".\Page2_En.html">l'&eacute;tape 2</a> du
  174. tutoriel, a le m&ecirc;me effet sur le processeur de l'ordinateur mais est davantage utilis&eacute; dans ce cas-ci comme un dispositif de "pause"
  175. plut&ocirc;t qu'un dispositif de "rallentissement". Avec ce qui a &eacute;t&eacute; clarifi&eacute; jusqu'&agrave; maintenant,
  176. vous devriez &ecirc;tre capable de comprendre les lignes de code qui n'ont toujours pas &eacute;t&eacute; expliqu&eacute;es.
  177. </p>
  178. <p style="text-align:justify">
  179. Afin de finaliser cette &eacute;tape, nous allons ajouter un peu de code &agrave; la fonction simon:OnButtonClick(ButtonIndex).
  180. Cette fonction sera apell&eacute;e depuis le moteur du jeu Simon<sup>&reg;</sup> &agrave; chaque fois que
  181. le joueur appuira sur un des quatre bouttons du jeu. Notre but principal dans cette fonction
  182. est de valider les boutton que le joueur &agrave; appuy&eacute; et commencer &agrave; g&eacute;rer le syst&egrave;me de pointage pour une &eacute;ventuelle victoire.
  183. Pour se faire, les fonctions simon.GetScore() et simon.SetScore() seront utilis&eacute;es. &Eacute;tant donn&eacute; la
  184. simplicit&eacute; de cette fonction et l'avancement du tutoriel, cette fonction ne sera pas
  185. expliqu&eacute; en d&eacute;tail. Vous avez juste &agrave; vous rappeler de ce que nous avons discut&eacute; jusqu'&agrave; maintenant dans ce turoriel:
  186. </p>
  187. <br>
  188. </td>
  189. </tr>
  190. <tr>
  191. <td class="code" colspan="2">
  192. <br>
  193. <blockquote>
  194. -- Event handler called by simon.dll when any of the colored buttons are clicked<br>
  195. function simon:OnButtonClick(ButtonIndex)<br>
  196. &nbsp;&nbsp;&nbsp;&nbsp;local Result = 0<br>
  197. &nbsp;&nbsp;&nbsp;&nbsp;UserSequenceCount = UserSequenceCount + 1<br><br>
  198. &nbsp;&nbsp;&nbsp;&nbsp;if MainSequence[UserSequenceCount] == ButtonIndex then<br>
  199. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon.SetScore(simon.GetScore() + 10)<br>
  200. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result = 1<br>
  201. &nbsp;&nbsp;&nbsp;&nbsp;end<br><br>
  202. &nbsp;&nbsp;&nbsp;&nbsp;return Result<br>
  203. end<br>
  204. </blockquote>
  205. </td>
  206. </tr>
  207. <tr>
  208. <td colspan="2">
  209. <font face="Tahoma" size="2">
  210. <br>
  211. <br>
  212. <p style="text-align:justify">
  213. Dans la prochaine &eacute;tape de ce tutoriel, nous discuterons davantage &agrave; propos du "contr&ocirc;le" du jeu
  214. dans la boucle principale et lier les fonctions de la dll C/C++/Delphi.
  215. </p>
  216. <br>
  217. </td>
  218. </tr>
  219. <tr>
  220. <td valign="bottom">
  221. <font face="Tahoma" size="2">
  222. <div align="left" valign="bottom">
  223. <a href=".\Page2_Fr.html">&lt;&lt; Pr&eacute;c&eacute;dent</a>
  224. </div>
  225. </td>
  226. <td>
  227. <font face="Tahoma" size="2">
  228. <div align="right" valign="bottom">
  229. <a href=".\Page4_Fr.html">Suivant &gt;&gt;</a>
  230. </div>
  231. </font>
  232. </td>
  233. </tr>
  234. <tr>
  235. <td colspan="2">
  236. <font face="Tahoma" size="1" color="silver">
  237. <hr size="1" color="#000000">
  238. <div align="right">
  239. <a href="http://www.luaedit.org">www.luaedit.org</a>
  240. <br>
  241. &copy; Copyright 2004-2005 LuaEdit
  242. <br>
  243. Lier une Dll &agrave; LuaEdit (Tutoriel)
  244. </div>
  245. </font>
  246. </td>
  247. </tr>
  248. </table>
  249. </body>
  250. </html>