Page4_Fr.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. <html>
  2. <head>
  3. <title>
  4. Lier une Dll &agrave; LuaEdit (Tutoriel) - Contr&ocirc;ler et Lier 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">Contr&ocirc;ler et Lier 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 que nous avons un bon "quelque chose" avec quoi d&eacute;marrer, c'est le temps de vraiment contr&ocirc;ler
  32. le jeu &agrave; travers la boucle principale pr&eacute;cemment cr&eacute;&eacute;e.
  33. </p>
  34. <br>
  35. </font>
  36. </td>
  37. </tr>
  38. <tr>
  39. <td colspan="2">
  40. <font face="Tahoma" size="2">
  41. <p style="text-align:justify">
  42. Avant l'appel &agrave; la fonction simon.Create() pr&eacute;c&eacute;demment ajout&eacute;, nous allons ajouter un nouvel appel
  43. &agrave; la fonction simon.SetMediaPath(). Ceci sp&eacute;cifiera au moteur du jeu d'analyser le r&eacute;pertoire
  44. sp&eacute;cifi&eacute; pour trouver ses fichiers multim&eacute;dia (*.wav). Voici comment &agrave; quoi la boucle compl&egrave;te devrait
  45. ressembler &agrave;:
  46. </p>
  47. <br>
  48. </td>
  49. </tr>
  50. <tr>
  51. <td class="code" colspan="2">
  52. <br>
  53. <blockquote>
  54. -- Show Simon game main form<br>
  55. simon.SetMediaPath("C:\\Prog\\Delphi\\MNet\\Bin\\Medias")<br>
  56. simon.Create()<br><br>
  57. -- Main processing loop<br>
  58. while simon.GetPowerStatus() == 1 do<br>
  59. &nbsp;&nbsp;&nbsp;&nbsp;if simon.GetPlayStatus() == 1 then<br>
  60. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon:Initialize()<br><br>
  61. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Game processing loop<br>
  62. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while GameState do<br>
  63. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserSequenceCount = 0<br>
  64. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon:AddSequence()<br>
  65. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon:DisplayMessage("Simon's Turn!", "clRed", 750)<br>
  66. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon:PlaySequence(MainSequence)<br><br>
  67. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon:DisplayMessage("Your Turn!", "clLime", 1000)<br>
  68. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GameState = simon.GetUserSequence(SequenceCount, 2000)<br><br>
  69. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if simon:GetScore() > 1000 then<br>
  70. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simon:DisplayMessage("You Win!", "clAqua", -1)<br>
  71. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GameState = false<br>
  72. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>
  73. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>
  74. &nbsp;&nbsp;&nbsp;&nbsp;end<br><br>
  75. &nbsp;&nbsp;&nbsp;&nbsp;-- Make sure the processor doesn't runs for no reason<br>
  76. &nbsp;&nbsp;&nbsp;&nbsp;Sleep(10)<br>
  77. end<br><br>
  78. simon.Destroy()<br>
  79. </blockquote>
  80. </td>
  81. </tr>
  82. <tr>
  83. <td colspan="2">
  84. <font face="Tahoma" size="2">
  85. <br>
  86. <br>
  87. <p style="text-align:justify">
  88. La fonction simon.GetPowerStatus() est utilis&eacute; pour d&eacute;terminer si "l'allimentation" (dans notre
  89. cas virtuel) est toujours "ouverte". Si cette fonction retourne 1, cela signifie que "l'alimentation"
  90. est toujours "ouverte". La fonction simon.GetPlayerStatus() retourne 1 si le joueur &agrave; appuy&eacute; sur le boutton "play".
  91. Appeler simon.DisplayMessage() affichera la cha&icirc;ne de caract&egrave;res sp&eacute;cifi&eacute;e en utilisant la couleur sp&eacute;cifi&eacute;e
  92. (pour les codes de couleurs, jettez un coup d'oeil &agrave; la colonne "Delphi/C++ Builder" de ce
  93. <a href="http://www.iocomp.com/support/helpvcl/ioc01592.htm">site web</a>) et
  94. et la longueur sp&eacute;cifi&eacute;e en milisecondes. Dans notre cas, ceci sera utilis&eacute; afin de faire savoir au joueur &agrave; quel tour il s'agit.
  95. La fonction simon.GetUserSequence() demandera au joueur d'entrer sa s&eacute;quence. Le premier argument
  96. sp&eacute;cifie la dur&eacute;e de la s&eacute;quence &agrave; obtenir et le deuxi&egrave;me sp&eacute;cifie la valeur du "timeout"
  97. en milisecondes &agrave; utiliser avant de consid&eacute;rer le tour comme &eacute;chec. En terme d'ex&eacute;cution,
  98. dans la script Lua, cet appel devrait &ecirc;tre suspendre le code en attedant la r&eacute;ponse du joueur.
  99. mais eventuellement d&eacute;clanchera un appel automatique du moteur du jeu &agrave; la fonction simon:OnButtonClick() chaque fois
  100. le joueur appuiera un boutton depuis le jeu. Cette fonction retourne &eacute;gallement l'&eacute;tat de la partie
  101. (false == "game over"). Maintenant, ce qui suit devrait bri&egrave;vement expliquer comment configurer la dll
  102. en C++/Delphi pour actuellement permettre &agrave; LuaEdit de se lier &agrave; votre code, dans ce cas-ci: simon.dll. (La source
  103. compl&egrave;te du code est disponible dans les sources du tutoriel mais pour des raison de temps et de complexit&eacute; ne sera pas expliqu&eacute; compl&egrave;tement en d&eacute;tails
  104. comme la script simon.lua. Seul la partie "initializer" le sera.)
  105. </p>
  106. <p style="text-align:justify">
  107. Comme discut&eacute; dans <a href=".\Page1_En.html">l'&eacute;tape 1</a> de ce tutoriel, votre dll DOIT exporter la
  108. fonction sp&eacute;cifique LuaDebug_Initializer(). Cette fonction sera appel&eacute;e par LuaEdit juste avant de d&eacute;marrer
  109. une session de d&eacute;bug. Nous allons ensuite utiliser ce "hook"/"callback" afin d'enregister toute les fonctions du
  110. moteur du jeu pr&eacute;c&eacute;demment d&eacute;crite. Ceci tracera les fonctions en Lua et pr&eacute;viendra LuaEdit de notifier
  111. des erreurs parce qu'il ne trouve peut trouver une r&eacute;f&eacute;rence &agrave; la fonction dans le script. De cette mani&egrave;re, le d&eacute;buggage en temps r&eacute;el
  112. sera dispnible &agrave; travers LuaEdit.
  113. </p>
  114. <br>
  115. <b>Delphi:</b> (Cette fonction doit &ecirc;tre ajout&eacute; dans l'instruction "exports" de votre code tout comme chacune des fonctions enregistr&eacute; &agrave; l'environnement Lua qui se trouve &agrave; l'int&eacute;rieur de celle-ci)
  116. <br>
  117. <br>
  118. </td>
  119. </tr>
  120. <tr>
  121. <td class="code" colspan="2">
  122. <br>
  123. <blockquote>
  124. // Register a c function in a specified table<br>
  125. procedure LuaRegisterCustom(L: PLua_State; ndx: Integer; funcname: String; func: lua_CFunction);<br>
  126. begin<br>
  127. &nbsp;&nbsp;&nbsp;&nbsp;lua_pushstring(L, funcname);<br>
  128. &nbsp;&nbsp;&nbsp;&nbsp;lua_pushcfunction(L, func);<br>
  129. &nbsp;&nbsp;&nbsp;&nbsp;lua_rawset(L, ndx - 2);<br>
  130. end;<br><br>
  131. // Register a c function using the globalsindex constant<br>
  132. procedure LuaRegister(L: PLua_State; funcname: String; func: lua_CFunction);<br>
  133. begin<br>
  134. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, LUA_GLOBALSINDEX, funcname, func);<br>
  135. end;<br><br>
  136. // LuaEdit is calling this function everytime a script with a project<br>
  137. // specifying this dll as the initializer when debugging<br>
  138. function LuaDebug_Initializer(L: PLua_State): Integer;<br>
  139. begin<br>
  140. &nbsp;&nbsp;&nbsp;&nbsp;// Create new table on the lua stack<br>
  141. &nbsp;&nbsp;&nbsp;&nbsp;lua_newtable(L);<br><br>
  142. &nbsp;&nbsp;&nbsp;&nbsp;// Register delphi functions in that new table<br>
  143. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'SetMediaPath', SetMediaPath);<br>
  144. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'SetLight', SetLight);<br>
  145. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'Create', Create);<br>
  146. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'Destroy', Destroy);<br>
  147. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'GetUserSequence', GetUserSequence);<br>
  148. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'GetPowerStatus', GetPowerStatus);<br>
  149. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'GetPlayStatus', GetPlayStatus);<br>
  150. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'SetScore', SetScore);<br>
  151. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'GetScore', GetScore);<br>
  152. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'LockControls', LockControls);<br>
  153. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'UnlockControls', UnlockControls);<br>
  154. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, 'DisplayMessage', DisplayMessage);<br><br>
  155. &nbsp;&nbsp;&nbsp;&nbsp;// Register other miscalleneous functions<br>
  156. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegister(L, 'Sleep', LuaSleep);<br><br>
  157. &nbsp;&nbsp;&nbsp;&nbsp;// Assing "simon" lua global variable to the new table<br>
  158. &nbsp;&nbsp;&nbsp;&nbsp;lua_setglobal(L, 'simon');<br>
  159. end;<br>
  160. </blockquote>
  161. </td>
  162. </tr>
  163. <tr>
  164. <td colspan="2">
  165. <font face="Tahoma" size="2">
  166. <br>
  167. <br>
  168. <b>C/C++:</b> (Cette fonction doit &ecirc;tre ajout&eacute; dans l'instruction "EXPORTS" de votre fichier *.def tout comme chacune des fonctions enregistr&eacute; &agrave; l'environnement Lua qui se trouve &agrave; l'int&eacute;rieur de celle-ci)
  169. <br>
  170. <br>
  171. </td>
  172. </tr>
  173. <tr>
  174. <td class="code" colspan="2">
  175. <br>
  176. <blockquote>
  177. // Register a c function in a specified table<br>
  178. void LuaRegisterCustom(lua_State *L, long ndx, const char* funcname, lua_CFunction func)<br>
  179. {<br>
  180. &nbsp;&nbsp;&nbsp;&nbsp;lua_pushstring(L, funcname);<br>
  181. &nbsp;&nbsp;&nbsp;&nbsp;lua_pushcfunction(L, func);<br>
  182. &nbsp;&nbsp;&nbsp;&nbsp;lua_rawset(L, ndx - 2);<br>
  183. }<br><br>
  184. // Register a c function using the globalsindex constant<br>
  185. void LuaRegister(lua_State *L, const char* funcname, lua_CFunction func)<br>
  186. {<br>
  187. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, LUA_GLOBALSINDEX, funcname, func);<br>
  188. }<br><br>
  189. // LuaEdit is calling this function everytime a script with a project<br>
  190. // specifying this dll as the initializer when debugging<br>
  191. int LuaDebug_Initializer(lua_State *L)<br>
  192. {<br>
  193. &nbsp;&nbsp;&nbsp;&nbsp;// Create new table on the lua stack<br>
  194. &nbsp;&nbsp;&nbsp;&nbsp;lua_newtable(L);<br><br>
  195. &nbsp;&nbsp;&nbsp;&nbsp;// Register delphi functions in that new table<br>
  196. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "SetMediaPath", SetMediaPath);<br>
  197. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "SetLight", SetLight);<br>
  198. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "Create", Create);<br>
  199. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "Destroy", Destroy);<br>
  200. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "GetUserSequence", GetUserSequence);<br>
  201. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "GetPowerStatus", GetPowerStatus);<br>
  202. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "GetPlayStatus", GetPlayStatus);<br>
  203. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "SetScore", SetScore);<br>
  204. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "GetScore", GetScore);<br>
  205. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "LockControls", LockControls);<br>
  206. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "UnlockControls", UnlockControls);<br>
  207. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegisterCustom(L, -1, "DisplayMessage", DisplayMessage);<br><br>
  208. &nbsp;&nbsp;&nbsp;&nbsp;// Register other miscalleneous functions<br>
  209. &nbsp;&nbsp;&nbsp;&nbsp;LuaRegister(L, "Sleep", LuaSleep);<br><br>
  210. &nbsp;&nbsp;&nbsp;&nbsp;// Assing "simon" lua global variable to the new table<br>
  211. &nbsp;&nbsp;&nbsp;&nbsp;lua_setglobal(L, "simon");<br>
  212. }<br>
  213. </blockquote>
  214. </td>
  215. </tr>
  216. <tr>
  217. <td colspan="2">
  218. <font face="Tahoma" size="2">
  219. <br>
  220. <br>
  221. <p style="text-align:justify">
  222. Les fonctions LuaRegisterCustom() et LuaRegister() simplifieront la complexit&eacute; du code
  223. &eacute;tant donn&eacute; le fait que nous aurions &agrave; r&eacute;p&eacute;ter ces 3 lignes de code pour chaque fonction qui
  224. a besoins d'&ecirc;tre enregistr&eacute; &agrave; l'environnement Lua. Maintenant, pour compl&eacute;t&eacute; ce projet/turotiel,
  225. tout ce dont vous avez besoins de faire est de vous inspirer du code fournis et de terminer cette dll. Comme mentionn&eacute;
  226. ci-haut, cette partie ne sera pas expliqu&eacute; en d&eacute;tails.
  227. </p>
  228. <br>
  229. <p style="text-align:justify">
  230. Maintenant, vous devriez en avoir suffisamment vue pour savoir comment Lua interragit avec LuaEdit pour &eacute;ventuellement
  231. b&acirc;tir votre propre projet de cette mani&egrave;re afin que le code Lua soit une chose facile &agrave; d&eacute;bogger.
  232. J'esp&egrave;re grandement que ce tutoriel vous a aider de plusieurs mani&egrave;re. Si vous avez toujours des questions, vous pouvez toujours
  233. poster une nouvelle "thread" dans la <a href="">section "Tutorial"</a> de notre forum ou sentez &agrave; l'aiser de
  234. me contacter &agrave; l'addresse courriel suivante: <a href="mailto:[email protected]?subject=&Agrave; propos de Lier une Dll &agrave; LuaEdit (Tutoriel)...">
  235. [email protected]</a>. Merci d'avoir utilis&eacute; ce tutoriel et bonne chance dans vos futur projets!
  236. </p>
  237. </td>
  238. </tr>
  239. <tr>
  240. <td colspan="2">
  241. <font face="Tahoma" size="2">
  242. <br>
  243. <br>
  244. <b>Hints:</b>
  245. <ul type="square">
  246. <li>Essayez le d&eacute;boggage en temps r&eacute;el avec la script que vous venez juste d'accomplir en utilisant le fichiers compil&eacute; simon.dll
  247. et lua.dll situ&eacute;s dans le r&eacute;pertoire bin du tutoriel. Copiez et collez le projet et la script Lua que venez
  248. de cr&eacute;er dans ce m&ecirc;me r&eacute;pertoire, lancez LuaEdit, ajoutez un "breakpoint" sur n'importe quelle ligne de code (pas de commentaire...)
  249. et appuyez sur "play".</li>
  250. <li>Essayez d'ajouter une logique de "Level" dans le code Lua en modifiant certaines variantes du jeu
  251. comme la vitesse d'affichage de la s&eacute;quence, le "timeout" du joueur, le nombre d'item ajout&eacute;
  252. &agrave; la s&eacute;quence par tour, etc...</li>
  253. <li>D&eacute;fiez vos amis/amies avec une script modifi&eacute; "impossible &agrave; gagner"! :P</li>
  254. <li>Pour des utilisateurs plus avanc&eacute;, essayez d'ajouter un moteur multijoueur pour joueur sur un LAN.</li>
  255. <li>Impl&eacute;mentez une application *.exe qui lancera la dll de la m&ecirc;me mani&egrave;re que LuaEdit
  256. en appelant d'abord la fonction LuaDebug_Initializer() et ensuite en chargant
  257. la script Lua en utilisant l'API luaL_loadbuffer(). Jettez un coup d'oeil au code Delphi du projet SimonExec.</li>
  258. </ul>
  259. </p>
  260. </td>
  261. </tr>
  262. <tr>
  263. <td valign="bottom">
  264. <font face="Tahoma" size="2">
  265. <div align="left" valign="bottom">
  266. <a href=".\Page3_Fr.html">&lt;&lt; Pr&eacute;c&eacute;dent</a>
  267. </div>
  268. </td>
  269. </tr>
  270. <tr>
  271. <td colspan="2">
  272. <font face="Tahoma" size="1" color="silver">
  273. <hr size="1" color="#000000">
  274. <div align="right">
  275. <a href="http://www.luaedit.org">www.luaedit.org</a>
  276. <br>
  277. &copy; Copyright 2004-2005 LuaEdit
  278. <br>
  279. Lier une Dll &agrave; LuaEdit (Tutoriel)
  280. </div>
  281. </font>
  282. </td>
  283. </tr>
  284. </table>
  285. </body>
  286. </html>