]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - doc/src-html/forms/FormMain.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / doc / src-html / forms / FormMain.pas
1 <HTML><HEAD>\r
2 <TITLE>File: formmain.pas </TITLE>\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">\r
4 </HEAD>\r
5 <BODY BGCOLOR="#FFFFFF">\r
6 <A NAME=formmain.pas><CENTER><H3>formmain.pas</H3></A><I> from <A HREF=/proyecto/doc/src-html/AlgoWars.html> Project: AlgoWars.dpr</A></I></CENTER>\r
7 <HR>\r
8 <PRE>\r
9 <I><FONT COLOR="Navy">{** Formulario principal de la aplicación<br> \r
10     <i>Cambios:</i> \r
11     <PRE> \r
12     29/11/00: Se agregan algunos controles gráficos con indicadores de energía y velocidad. \r
13               No se incluyen en una clase Vista porque son muy pequeños. \r
14     01/12/00: Se modifica levemente la interfaz. \r
15               Se agregan controles para los disparos y metodos pertinentes. \r
16     06/12/00: Se cambian minimamente los menúes, poniendo la parte del manejo \r
17               de escenarios en un submenú del menú Archivo. \r
18     08/12/00: Se termina de implementar la funcionalidad de los menúes \r
19                 Archivo -> Abrir ... \r
20                 Archivo -> Guardar ... \r
21                 Archivo -> Escenario -> Abrir ... \r
22                 Archivo -> Escenario -> Guardar ... \r
23               Se completa el 'destructor', ya que faltaban liberar bastantes \r
24               objetos. \r
25     </PRE>}</FONT></I> \r
26 <B>unit</B> FormMain; \r
27  \r
28 <B>interface</B> \r
29  \r
30 <B>uses</B> \r
31   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, \r
32   ExtCtrls, Menus, StdCtrls, \r
33   Espacio, \r
34   NavePropia, \r
35   NavesEnemigas, \r
36   Meteorito, \r
37   Armas, \r
38   Vectores, \r
39   Vista, \r
40   Tipos; \r
41  \r
42 <B>type</B> \r
43   <I><FONT COLOR="Navy">{** Formulario principal de la aplicación}</FONT></I> \r
44   TMainForm = <B>class</B>(TForm) \r
45     aBtnIniciar: TButton; \r
46     aMainMenu: TMainMenu; \r
47     aTimer: TTimer; \r
48     aMenuJuego: TMenuItem; \r
49     aMenuItemConfigurar: TMenuItem; \r
50     aMenuItemSalir: TMenuItem; \r
51     aTimerVista: TTimer; \r
52     aEditEnergia: TEdit; \r
53     aLblEnergia: TLabel; \r
54     N1: TMenuItem; \r
55     aMenuItemNuevoJuego: TMenuItem; \r
56     aMenuItemGuardar: TMenuItem; \r
57     aMenuItemAbrir: TMenuItem; \r
58     aMenuItemAbrirEscenario: TMenuItem; \r
59     aMenuItemGuardarEscenario: TMenuItem; \r
60     N3: TMenuItem; \r
61     aLblVelocidad: TLabel; \r
62     aEditVelocidad: TEdit; \r
63     aLblKMH: TLabel; \r
64     aLblMisiles: TLabel; \r
65     aEditMisiles: TEdit; \r
66     aLblMisilesDir: TLabel; \r
67     aEditMisilesDirigidos: TEdit; \r
68     aLblArma: TLabel; \r
69     aEditArma: TEdit; \r
70     aMenuEscenario: TMenuItem; \r
71     aSaveJuego: TSaveDialog; \r
72     aOpenJuego: TOpenDialog; \r
73     aSaveEscenario: TSaveDialog; \r
74     aOpenEscenario: TOpenDialog; \r
75     aMenuVista: TMenuItem; \r
76     aMenuItemFrontal: TMenuItem; \r
77     aMenuItemDerecha: TMenuItem; \r
78     aMenuItemIzquierda: TMenuItem; \r
79     aMenuItemTrasera: TMenuItem; \r
80     aMenuItemSuperior: TMenuItem; \r
81     aMenuItemInferior: TMenuItem; \r
82     aMenuItemDelArma: TMenuItem; \r
83     N2: TMenuItem; \r
84     aMenuItemCalidad: TMenuItem; \r
85     aMenuItemCambioAutomatico: TMenuItem; \r
86     aMenuItemMapa: TMenuItem; \r
87     <B>procedure</B> <A HREF="#TMainForm.aBtnIniciarClick">aBtnIniciarClick</A>(Sender: TObject); \r
88     <B>procedure</B> <A HREF="#TMainForm.aTimerTimer">aTimerTimer</A>(Sender: TObject); \r
89     <B>procedure</B> <A HREF="#TMainForm.aMenuItemConfigurarClick">aMenuItemConfigurarClick</A>(Sender: TObject); \r
90     <B>procedure</B> <A HREF="#TMainForm.FormCreate">FormCreate</A>(Sender: TObject); \r
91     <B>procedure</B> <A HREF="#TMainForm.aMenuItemSalirClick">aMenuItemSalirClick</A>(Sender: TObject); \r
92     <B>procedure</B> <A HREF="#TMainForm.FormDestroy">FormDestroy</A>(Sender: TObject); \r
93     <B>procedure</B> <A HREF="#TMainForm.FormKeyDown">FormKeyDown</A>(Sender: TObject; <B>var</B> Key: Word; \r
94       Shift: TShiftState); \r
95     <B>procedure</B> <A HREF="#TMainForm.FormHide">FormHide</A>(Sender: TObject); \r
96     <B>procedure</B> <A HREF="#TMainForm.aTimerVistaTimer">aTimerVistaTimer</A>(Sender: TObject); \r
97     <B>procedure</B> <A HREF="#TMainForm.aMenuItemGuardarClick">aMenuItemGuardarClick</A>(Sender: TObject); \r
98     <B>procedure</B> <A HREF="#TMainForm.aMenuClick">aMenuClick</A>(Sender: TObject); \r
99     <B>procedure</B> <A HREF="#TMainForm.aMenuItemAbrirClick">aMenuItemAbrirClick</A>(Sender: TObject); \r
100     <B>procedure</B> <A HREF="#TMainForm.aMenuItemNuevoJuegoClick">aMenuItemNuevoJuegoClick</A>(Sender: TObject); \r
101     <B>procedure</B> <A HREF="#TMainForm.aMenuItemGuardarEscenarioClick">aMenuItemGuardarEscenarioClick</A>(Sender: TObject); \r
102     <B>procedure</B> <A HREF="#TMainForm.aMenuItemAbrirEscenarioClick">aMenuItemAbrirEscenarioClick</A>(Sender: TObject); \r
103     <B>procedure</B> <A HREF="#TMainForm.CambiarVistaClick">CambiarVistaClick</A>(Sender: TObject); \r
104     <B>procedure</B> <A HREF="#TMainForm.aMenuItemCalidadClick">aMenuItemCalidadClick</A>(Sender: TObject); \r
105     <B>procedure</B> <A HREF="#TMainForm.DesSerializarEscenario">DesSerializarEscenario</A>( archivo: <B>string</B> ); \r
106     <B>procedure</B> <A HREF="#TMainForm.SerializarEscenario">SerializarEscenario</A>( archivo: <B>string</B> ); \r
107     <B>procedure</B> <A HREF="#TMainForm.DesSerializarJuego">DesSerializarJuego</A>( archivo: <B>string</B> ); \r
108     <B>procedure</B> <A HREF="#TMainForm.SerializarJuego">SerializarJuego</A>( archivo: <B>string</B> ); \r
109     <B>procedure</B> <A HREF="#TMainForm.aMenuItemCambioAutomaticoClick">aMenuItemCambioAutomaticoClick</A>(Sender: TObject); \r
110   <B>private</B> \r
111     <I><FONT COLOR="Navy">{ Private declarations }</FONT></I> \r
112     aObjetos:    TList;       <I><FONT COLOR="Navy">// Lista de objetos a utlizar con el espacio </FONT></I>\r
113     aEspacio:    cEspacio;    <I><FONT COLOR="Navy">// Espacio a utilizar </FONT></I>\r
114     aNavePropia: cNavePropia; <I><FONT COLOR="Navy">// Nave propia a utilizar con el espacio </FONT></I>\r
115     aVista:      cVista;      <I><FONT COLOR="Navy">// Vista utilizada para dibujar el modelo en el formulario </FONT></I>\r
116     <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
117     aDebugFile:  Text;        <I><FONT COLOR="Navy">// Archivo para guardar información de debug </FONT></I>\r
118     <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
119   <B>public</B> \r
120     <I><FONT COLOR="Navy">{ Public declarations }</FONT></I> \r
121     <I><FONT COLOR="Navy">{** Obtiene la lista de objetos del formulario}</FONT></I> \r
122     <B>function</B> <A HREF="#TMainForm.mGetObjetos">mGetObjetos</A>: TList; \r
123     <I><FONT COLOR="Navy">{** Obtiene la nave propia del formulario}</FONT></I> \r
124     <B>function</B> <A HREF="#TMainForm.mGetNavePropia">mGetNavePropia</A>: cNavePropia; \r
125   <B>end</B>; \r
126  \r
127 <B>var</B> \r
128   MainForm:    TMainForm; \r
129  \r
130 <B>implementation</B> \r
131  \r
132 <B>uses</B> \r
133   FormConfig, \r
134   ObjetoPersistente, \r
135   SerializacionUtils, \r
136   RegExpr, \r
137   ObjetoVolador, \r
138   Camara; \r
139  \r
140 <I><FONT COLOR="Navy">{$R *.DFM}</FONT></I> \r
141  \r
142 <B>const</B> \r
143   DEBUGING: boolean = true; <I><FONT COLOR="Navy">// Constante para indicar si se genera el archivo de debug </FONT></I>\r
144  \r
145 <B>procedure</B> <A NAME=TMainForm.aBtnIniciarClick>TMainForm.aBtnIniciarClick</A>(Sender: TObject); \r
146 <B>begin</B> \r
147   <B>if</B> aEspacio = <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Todavía no se inicio el juego </FONT></I>\r
148     aEspacio := cEspacio.create( aNavePropia, aObjetos, 50 ); \r
149     aVista := cVista.create( self, aNavePropia ); \r
150     aMenuItemConfigurar.Enabled := false; \r
151     aMenuItemGuardar.Enabled := true; \r
152     aMenuEscenario.Enabled := false; \r
153     aMenuVista.Enabled := true; \r
154   <B>end</B>; \r
155   <B>if</B> aTimer.Enabled = false <B>then</B> <B>begin</B> \r
156     aTimer.enabled := true; \r
157     aTimerVista.enabled := true; \r
158     aBtnIniciar.caption := 'Pausa'; \r
159   <B>end</B> <B>else</B> <B>begin</B> \r
160     aTimer.enabled := false; \r
161     aTimerVista.enabled := false; \r
162     aBtnIniciar.caption := 'Continuar'; \r
163   <B>end</B>; \r
164 <B>end</B>; \r
165  \r
166 <B>procedure</B> <A NAME=TMainForm.aTimerTimer>TMainForm.aTimerTimer</A>(Sender: TObject); \r
167 <B>begin</B> \r
168   <B>try</B> <I><FONT COLOR="Navy">// Prueba el codigo </FONT></I>\r
169     aEspacio.mActualizar; \r
170   <B>except</B> \r
171     on e: ENavePropiaDestruida <B>do</B> <B>begin</B>         <I><FONT COLOR="Navy">// Si cae en una excepcion de nave propia destruida </FONT></I>\r
172       aBtnIniciarClick( self );                 <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>\r
173       aBtnIniciar.Enabled := false;             <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>\r
174       aMenuItemGuardar.Enabled := false;        <I><FONT COLOR="Navy">// No permite guardar el juego </FONT></I>\r
175       aMenuVista.Enabled := false;              <I><FONT COLOR="Navy">// No permite manipular la vista </FONT></I>\r
176       <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
177       writeln( aDebugFile, 'GAME OVER!!!! (' +  <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>\r
178                            e.<B>Message</B> + ')' ); \r
179       <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
180       ShowMessage( 'GAME OVER!!!' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
181     <B>end</B>; \r
182     on e: Exception <B>do</B> <B>begin</B>                       <I><FONT COLOR="Navy">// Si cae en una excepcion desconocida </FONT></I>\r
183       aBtnIniciarClick( self );                    <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>\r
184       aBtnIniciar.Enabled := false;                <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>\r
185       aMenuItemGuardar.Enabled := false;           <I><FONT COLOR="Navy">// No permite guardar el juego </FONT></I>\r
186       aMenuVista.Enabled := false;                 <I><FONT COLOR="Navy">// No permite manipular la vista </FONT></I>\r
187       <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
188       writeln( aDebugFile, 'ERROR: ' + e.<B>Message</B>); <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>\r
189       <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
190       ShowMessage( 'ERROR: ' + e.<B>Message</B> );    <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
191     <B>end</B>; \r
192   <B>end</B>; \r
193 <B>end</B>; \r
194  \r
195 <B>procedure</B> <A NAME=TMainForm.aTimerVistaTimer>TMainForm.aTimerVistaTimer</A>(Sender: TObject); \r
196 <B>const</B> \r
197   i: int64 = 0; \r
198 <B>begin</B> \r
199   <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
200   i := i + 1; \r
201   <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
202   <I><FONT COLOR="Navy">// Muestra la energía de la nave </FONT></I>\r
203   aEditEnergia.Text := IntToStr( aNavePropia.mGetEnergia ); \r
204   <I><FONT COLOR="Navy">// La velocidad esta en las unidades 1m/ms. Sabiendo que 1m = 0,001 km y </FONT></I>\r
205   <I><FONT COLOR="Navy">// 1 h = 60 . 60 . 1000 ms, entonces 1 ms = 1 / 3600000 h </FONT></I>\r
206   <I><FONT COLOR="Navy">// Entonces velocidad * 0,001 * 3600000 = velocidad * 3600 = km/h </FONT></I>\r
207   aEditVelocidad.Text := FloatToStr( aNavePropia.mGetVelModulo * 3600 ); \r
208   <I><FONT COLOR="Navy">// Muestra la cantidad de misiles que le quedan a la nave </FONT></I>\r
209   aEditMisiles.Text := IntToStr( aNavePropia.mGetMisiles ); \r
210   <I><FONT COLOR="Navy">// Muestra la cantidad de misiles dirigidos que le quedan a la nave </FONT></I>\r
211   aEditMisilesDirigidos.Text := IntToStr( aNavePropia.mGetMisilesDirigidos ); \r
212   <I><FONT COLOR="Navy">// Muestra en el título la cámara actualmente en uso </FONT></I>\r
213   Caption := Application.Title + ' @ ' + aVista.mGetCamaraStr; \r
214   <I><FONT COLOR="Navy">// Muestra el arma seleccionada </FONT></I>\r
215   <B>case</B> aNavePropia.mGetArmaSelec <B>of</B> \r
216     OV_LASER: <B>begin</B> \r
217       aEditArma.Text := 'Láser'; \r
218       <B>if</B> aNavePropia.mPuedeDispararLaser( <B>nil</B> ) <B>then</B> \r
219         aEditArma.Font.Color := clLime \r
220       <B>else</B> \r
221         aEditArma.Font.Color := clRed; \r
222     <B>end</B>; \r
223     OV_MISIL: <B>begin</B> \r
224       aEditArma.Text := 'Misil'; \r
225       <B>if</B> aNavePropia.mPuedeDispararMisil( <B>nil</B> ) <B>then</B> \r
226         aEditArma.Font.Color := clLime \r
227       <B>else</B> \r
228         aEditArma.Font.Color := clRed; \r
229     <B>end</B>; \r
230     OV_MISDIR: <B>begin</B> \r
231       aEditArma.Text := 'Misil Dirigido'; \r
232       <B>if</B> aNavePropia.mPuedeDispararMisDir( <B>nil</B> ) <B>then</B> \r
233         aEditArma.Font.Color := clLime \r
234       <B>else</B> \r
235         aEditArma.Font.Color := clRed; \r
236     <B>end</B>; \r
237   <B>end</B>; \r
238   <B>try</B> <I><FONT COLOR="Navy">// Prueba el codigo </FONT></I>\r
239     aVista.mDibujarVista( aEspacio ); \r
240     <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
241     <I><FONT COLOR="Navy">// Imprime la informacion del estado del espacio en este instante </FONT></I>\r
242     writeln( aDebugFile, aEspacio.mGetDebugInfo( DI_NORMAL ) ); \r
243     <I><FONT COLOR="Navy">// Imprime la data de la vista </FONT></I>\r
244     writeln( aDebugFile, aVista.mGetDebugInfo( DI_MAXI ) ); \r
245     writeln( aDebugFile, #13 + #10 + '====================>  ' + IntToStr( i ) + '  <======================' ); \r
246     <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
247   <B>except</B> \r
248     on e: ECameramanDestruido <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si cae en una excepcion de camara destruida </FONT></I>\r
249       aBtnIniciarClick( self );        <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>\r
250       aBtnIniciar.Enabled := false;    <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>\r
251       <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
252       writeln( aDebugFile, 'ERROR!!!! (' +  <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>\r
253                            e.<B>Message</B> + ')' ); \r
254       <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
255       ShowMessage( 'ERROR!!!! (' + e.<B>Message</B> + ')' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
256     <B>end</B>; \r
257     on e: ENavePropiaDestruida <B>do</B> <B>begin</B>         <I><FONT COLOR="Navy">// Si cae en una excepcion de nave propia destruida </FONT></I>\r
258       aBtnIniciarClick( self );                 <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>\r
259       aBtnIniciar.Enabled := false;             <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>\r
260       <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
261       writeln( aDebugFile, 'GAME OVER!!!! (' +  <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>\r
262                            e.<B>Message</B> + ')' ); \r
263       <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
264       ShowMessage( 'GAME OVER!!!' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
265     <B>end</B>; \r
266     on e: Exception <B>do</B> <B>begin</B>                      <I><FONT COLOR="Navy">// Si cae en una excepcion desconocida </FONT></I>\r
267       aBtnIniciarClick( self );                    <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>\r
268       aBtnIniciar.Enabled := false;                <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>\r
269       <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
270       writeln( aDebugFile, 'ERROR: ' + e.<B>Message</B>); <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>\r
271       <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
272       ShowMessage( 'ERROR: ' + e.<B>Message</B> );    <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
273     <B>end</B>; \r
274   <B>end</B>; \r
275 <B>end</B>; \r
276  \r
277 <B>procedure</B> <A NAME=TMainForm.aMenuItemConfigurarClick>TMainForm.aMenuItemConfigurarClick</A>(Sender: TObject); \r
278 <B>begin</B> \r
279   ConfigForm.ShowModal; \r
280 <B>end</B>; \r
281  \r
282 <B>procedure</B> <A NAME=TMainForm.FormCreate>TMainForm.FormCreate</A>(Sender: TObject); \r
283 <B>begin</B> \r
284   aEspacio := <B>nil</B>; \r
285   aObjetos := TList.create; \r
286   aNavePropia := cNavePropia.create; \r
287   <I><FONT COLOR="Navy">// Pausa si se minimiza </FONT></I>\r
288   Application.OnMinimize := FormHide; \r
289  \r
290   <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
291   <I><FONT COLOR="Navy">// Inicializa el archivo de texto para DEBUG </FONT></I>\r
292   assignFile( aDebugFile, 'debug.txt' ); \r
293   rewrite( aDebugFile ); \r
294   <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
295  \r
296   <I><FONT COLOR="Navy">// Cargamos Algunos datos de ejemplo al principio si existe el archivo </FONT></I>\r
297   <B>if</B> FileExists( 'comun.eaw' ) <B>then</B> \r
298     <B>try</B> <I><FONT COLOR="Navy">// Prueba que no haya errores </FONT></I>\r
299       DesSerializarEscenario( 'comun.eaw' ); \r
300     <B>except</B> \r
301       on e: ESerializacion <B>do</B> <B>begin</B> \r
302         ShowMessage( 'Hubo un error al recuperar el escenario por defecto "comun.eaw": ' + e.<B>Message</B> );    <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
303         <I><FONT COLOR="Navy">// Resetea todos los valores ... </FONT></I>\r
304         aEspacio.free; \r
305         aObjetos.free; \r
306         aNavePropia.free; \r
307         aEspacio := <B>nil</B>; \r
308         aObjetos := TList.create; \r
309         aNavePropia := cNavePropia.create; \r
310       <B>end</B>; \r
311     <B>end</B>; \r
312 <B>end</B>; \r
313  \r
314 <B>procedure</B> <A NAME=TMainForm.aMenuItemSalirClick>TMainForm.aMenuItemSalirClick</A>(Sender: TObject); \r
315 <B>begin</B> \r
316   Close; \r
317 <B>end</B>; \r
318  \r
319 <B>procedure</B> <A NAME=TMainForm.FormDestroy>TMainForm.FormDestroy</A>(Sender: TObject); \r
320 <B>var</B> \r
321   ov: cObjetoVolador; \r
322 <B>begin</B> \r
323   <I><FONT COLOR="Navy">// Si el espacio no esta creado, liberamos la nave propia y los objetos </FONT></I>\r
324   <B>if</B> aEspacio = <B>nil</B> <B>then</B> <B>begin</B> \r
325     aNavePropia.free; \r
326     <B>while</B> aObjetos.Count > 0 <B>do</B> <B>begin</B> \r
327       ov := aObjetos.First; \r
328       aObjetos.Remove( ov ); \r
329       ov.free; \r
330     <B>end</B>; \r
331     aObjetos.free; \r
332   <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// Si el espacio esta creado ... </FONT></I>\r
333     <I><FONT COLOR="Navy">// aObjetos y aNavePropia se liberan cuando se libera el aEspacio </FONT></I>\r
334     aEspacio.free; \r
335   aVista.free; \r
336   <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
337   <I><FONT COLOR="Navy">// Cierra el archivo para DEBUG </FONT></I>\r
338   closeFile( aDebugFile ); \r
339   <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
340 <B>end</B>; \r
341  \r
342 <I><FONT COLOR="Navy">{** Obtiene la lista de objetos del formulario \r
343     @return Lista de objetos que utilizara el espacio}</FONT></I> \r
344 <B>function</B> <A NAME=TMainForm.mGetObjetos>TMainForm.mGetObjetos</A>: TList; \r
345 <B>begin</B> \r
346   result := aObjetos; \r
347 <B>end</B>; \r
348  \r
349 <I><FONT COLOR="Navy">{** Obtiene la nave propia del formulario \r
350     @return Nave propia que utilizara el espacio}</FONT></I> \r
351 <B>function</B> <A NAME=TMainForm.mGetNavePropia>TMainForm.mGetNavePropia</A>: cNavePropia; \r
352 <B>begin</B> \r
353   result := aNavePropia; \r
354 <B>end</B>; \r
355  \r
356 <B>procedure</B> <A NAME=TMainForm.FormKeyDown>TMainForm.FormKeyDown</A>(Sender: TObject; <B>var</B> Key: Word; \r
357   Shift: TShiftState); \r
358 <B>begin</B> \r
359   <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
360   writeln( aDebugFile, 'Presiono la letra: ', Key ); \r
361   <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
362   <B>if</B> aTimer.Enabled <B>then</B> \r
363     <B>case</B> Key <B>of</B> \r
364       <I><FONT COLOR="Navy">// 8.7e-3 es 0,5 grados </FONT></I>\r
365       73<I><FONT COLOR="Navy">{I}</FONT></I>: aNavePropia.mGirarArriba( 8.7e-3 ); \r
366       75<I><FONT COLOR="Navy">{K}</FONT></I>: aNavePropia.mGirarAbajo( 8.7e-3 ); \r
367       74<I><FONT COLOR="Navy">{J}</FONT></I>: aNavePropia.mGirarIzquierda( 8.7e-3 ); \r
368       76<I><FONT COLOR="Navy">{L}</FONT></I>: aNavePropia.mGirarDerecha( 8.7e-3 ); \r
369       85<I><FONT COLOR="Navy">{U}</FONT></I>: aNavePropia.mRotarDerecha( 8.7e-3 ); \r
370       79<I><FONT COLOR="Navy">{O}</FONT></I>: aNavePropia.mRotarIzquierda( 8.7e-3 ); \r
371       <I><FONT COLOR="Navy">// 0.005 es 18 km/h </FONT></I>\r
372       81<I><FONT COLOR="Navy">{Q}</FONT></I>: aNavePropia.mAcelerar( 0.005 ); \r
373       65<I><FONT COLOR="Navy">{A}</FONT></I>: aNavePropia.mDesacelerar( 0.005 ); \r
374       <I><FONT COLOR="Navy">// Disparos </FONT></I>\r
375       83<I><FONT COLOR="Navy">{S}</FONT></I>: <B>begin</B> <I><FONT COLOR="Navy">// Dispara creando la nueva camara del arma si hubo un disparo </FONT></I>\r
376                aVista.mCrearCamaraDeArma( aNavePropia.mIntentarDisparo ); \r
377                <B>if</B> aMenuItemCambioAutomatico.Checked <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si está activado el cambio automatico... </FONT></I>\r
378                  CambiarVistaClick( aMenuItemDelArma ); <I><FONT COLOR="Navy">// Cambia la camara </FONT></I>\r
379                <B>end</B>; \r
380              <B>end</B>; \r
381       87<I><FONT COLOR="Navy">{W}</FONT></I>: aNavePropia.mSeleccionarArmaSig; \r
382       84<I><FONT COLOR="Navy">{T}</FONT></I>: aNavePropia.mCambiarLockeado( aEspacio.mGetObjetos ); \r
383       <I><FONT COLOR="Navy">// Vista </FONT></I>\r
384       67<I><FONT COLOR="Navy">{C}</FONT></I>: aVista.mCamaraSiguiente; \r
385     <B>end</B>; \r
386 <B>end</B>; \r
387  \r
388 <B>procedure</B> <A NAME=TMainForm.FormHide>TMainForm.FormHide</A>(Sender: TObject); \r
389 <B>begin</B> \r
390   <B>if</B> aBtnIniciar.caption = 'Pausa' <B>then</B> <I><FONT COLOR="Navy">// Esta jugando </FONT></I>\r
391     aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// Pausa el juego </FONT></I>\r
392 <B>end</B>; \r
393  \r
394 <B>procedure</B> <A NAME=TMainForm.aMenuItemGuardarClick>TMainForm.aMenuItemGuardarClick</A>(Sender: TObject); \r
395 <B>begin</B> \r
396   Repaint; \r
397   <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>\r
398     aBtnIniciarClick( self );   <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>\r
399   <B>if</B> aSaveJuego.Execute <B>then</B> <I><FONT COLOR="Navy">// Si eligio un archivo... </FONT></I>\r
400     SerializarJuego( aSaveJuego.Filename ); \r
401 <B>end</B>; \r
402  \r
403 <B>procedure</B> <A NAME=TMainForm.aMenuClick>TMainForm.aMenuClick</A>(Sender: TObject); \r
404 <B>begin</B> \r
405   <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>\r
406     aBtnIniciarClick( self );   <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>\r
407 <B>end</B>; \r
408  \r
409 <B>procedure</B> <A NAME=TMainForm.aMenuItemAbrirClick>TMainForm.aMenuItemAbrirClick</A>(Sender: TObject); \r
410 <B>begin</B> \r
411   Repaint; \r
412   <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>\r
413     aBtnIniciarClick( self );   <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>\r
414   <B>if</B> aOpenJuego.Execute <B>then</B> <I><FONT COLOR="Navy">// Si eligio un archivo... </FONT></I>\r
415     DesSerializarJuego( aOpenJuego.Filename ); \r
416 <B>end</B>; \r
417  \r
418 <B>procedure</B> <A NAME=TMainForm.aMenuItemNuevoJuegoClick>TMainForm.aMenuItemNuevoJuegoClick</A>(Sender: TObject); \r
419 <B>var</B> \r
420   ov: cObjetoVolador; \r
421 <B>begin</B> \r
422   Repaint; \r
423   <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>\r
424     aBtnIniciarClick( self );   <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>\r
425   <B>if</B> MessageDlg( 'Se perderán todos los datos del juego actual ¿Está seguro que desea empezar un juego nuevo?', \r
426                  mtConfirmation, [mbYes, mbNo], 0) = mrYes <B>then</B> <B>begin</B> \r
427   <I><FONT COLOR="Navy">// Si el espacio no esta creado, liberamos la nave propia y los objetos </FONT></I>\r
428     <B>if</B> aEspacio = <B>nil</B> <B>then</B> <B>begin</B> \r
429       aNavePropia.free; \r
430       <B>while</B> aObjetos.Count > 0 <B>do</B> <B>begin</B> \r
431         ov := aObjetos.First; \r
432         aObjetos.Remove( ov ); \r
433         ov.free; \r
434       <B>end</B>; \r
435       aObjetos.free; \r
436     <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// Si el espacio esta creado ... </FONT></I>\r
437       <I><FONT COLOR="Navy">// aObjetos y aNavePropia se liberan cuando se libera el aEspacio </FONT></I>\r
438       aEspacio.free; \r
439     aVista.free; \r
440     aEspacio := <B>nil</B>; \r
441     aVista := <B>nil</B>; \r
442     aObjetos := TList.create; \r
443     aNavePropia := cNavePropia.create; \r
444     aBtnIniciar.caption := 'Iniciar'; \r
445     aMenuItemConfigurar.Enabled := true; \r
446     aMenuItemGuardar.Enabled := false; \r
447     aMenuEscenario.Enabled := true; \r
448     aBtnIniciar.Enabled := true;         <I><FONT COLOR="Navy">// Se puede iniciar el juego </FONT></I>\r
449   <B>end</B>; \r
450 <B>end</B>; \r
451  \r
452 <B>procedure</B> <A NAME=TMainForm.aMenuItemGuardarEscenarioClick>TMainForm.aMenuItemGuardarEscenarioClick</A>(Sender: TObject); \r
453 <B>begin</B> \r
454   Repaint; \r
455   <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>\r
456     aBtnIniciarClick( self );   <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>\r
457   <B>if</B> aSaveEscenario.Execute <B>then</B> <I><FONT COLOR="Navy">// Si eligio un archivo... </FONT></I>\r
458     SerializarEscenario( aSaveEscenario.Filename ); \r
459 <B>end</B>; \r
460  \r
461 <B>procedure</B> <A NAME=TMainForm.aMenuItemAbrirEscenarioClick>TMainForm.aMenuItemAbrirEscenarioClick</A>(Sender: TObject); \r
462 <B>begin</B> \r
463   Repaint; \r
464   <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>\r
465     aBtnIniciarClick( self );   <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>\r
466   <B>if</B> aOpenEscenario.Execute <B>then</B> <I><FONT COLOR="Navy">// Si eligio un archivo... </FONT></I>\r
467     DesSerializarEscenario( aOpenEscenario.Filename ); <I><FONT COLOR="Navy">// Deserializa el archivo </FONT></I>\r
468 <B>end</B>; \r
469  \r
470 <B>procedure</B> <A NAME=TMainForm.CambiarVistaClick>TMainForm.CambiarVistaClick</A>(Sender: TObject); \r
471 <B>begin</B> \r
472   <B>if</B> Sender = aMenuItemFrontal <B>then</B> \r
473     aVista.mCambiarCamara( CAMARA_FRONTAL ) \r
474   <B>else</B> <B>if</B> Sender = aMenuItemDerecha <B>then</B> \r
475     aVista.mCambiarCamara( CAMARA_LATDER ) \r
476   <B>else</B> <B>if</B> Sender = aMenuItemIzquierda <B>then</B> \r
477     aVista.mCambiarCamara( CAMARA_LATIZQ ) \r
478   <B>else</B> <B>if</B> Sender = aMenuItemTrasera <B>then</B> \r
479     aVista.mCambiarCamara( CAMARA_TRASERA ) \r
480   <B>else</B> <B>if</B> Sender = aMenuItemSuperior <B>then</B> \r
481     aVista.mCambiarCamara( CAMARA_ARRIBA ) \r
482   <B>else</B> <B>if</B> Sender = aMenuItemInferior <B>then</B> \r
483     aVista.mCambiarCamara( CAMARA_ABAJO ) \r
484   <B>else</B> <B>if</B> Sender = aMenuItemDelArma <B>then</B> \r
485     aVista.mCambiarCamara( CAMARA_ARMA ) \r
486   <B>else</B> <B>if</B> Sender = aMenuItemMapa <B>then</B> \r
487     aVista.mCambiarCamara( CAMARA_MAPA ) \r
488 <B>end</B>; \r
489  \r
490 <B>procedure</B> <A NAME=TMainForm.aMenuItemCalidadClick>TMainForm.aMenuItemCalidadClick</A>(Sender: TObject); \r
491 <B>begin</B> \r
492   aVista.mCambiarCalidad; \r
493   aMenuItemCalidad.Checked := <B>not</B> aMenuItemCalidad.Checked; \r
494 <B>end</B>; \r
495  \r
496 <B>procedure</B> <A NAME=TMainForm.DesSerializarEscenario>TMainForm.DesSerializarEscenario</A>( archivo: <B>string</B> ); \r
497 <B>var</B> \r
498   recuperado, \r
499   str:         <B>string</B>; \r
500   i, \r
501   total:       integer; \r
502   ov:          cObjetoVolador; \r
503   c:           char; \r
504   f:           TextFile; \r
505   r:           TRegExpr; \r
506 <B>begin</B> \r
507     <B>try</B> \r
508       assignFile( f, archivo );   <I><FONT COLOR="Navy">// Asigna el archivo </FONT></I>\r
509       reset( f );                             <I><FONT COLOR="Navy">// Abre el archivo </FONT></I>\r
510       recuperado := ''; \r
511       <B>while</B> <B>not</B> eof( f ) <B>do</B> <B>begin</B>     <I><FONT COLOR="Navy">// Lee el archivo </FONT></I>\r
512         <B>read</B>( f, c );                 <I><FONT COLOR="Navy">// caracter por caracter </FONT></I>\r
513         recuperado := recuperado + c; <I><FONT COLOR="Navy">// Almacenandolo en un string </FONT></I>\r
514       <B>end</B>; \r
515       closeFile( f );                 <I><FONT COLOR="Navy">// Cierra el archivo </FONT></I>\r
516     <B>except</B>  <I><FONT COLOR="Navy">// Si hay algun error </FONT></I>\r
517       on e: Exception <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
518         ShowMessage( 'Hubo un error al leer el archivo "' + \r
519                      archivo + '": ' + #13 + #10 + \r
520                      e.<B>Message</B> + #13 + #10 + \r
521                      'Por favor lea la Sección de Errores del Manual del ' + \r
522                      'Usuario para más información'  ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
523       <B>end</B>; \r
524     <B>end</B>; \r
525     r := TRegExpr.create; \r
526     <B>try</B> <I><FONT COLOR="Navy">// ensure memory release </FONT></I>\r
527       r.Expression := '<eaw/s+version=(/d+[/./d+]*)/s*>/s*(.+)/s*</eaw>'; \r
528       <B>if</B> r.Exec ( recuperado ) <B>then</B> \r
529         <B>if</B> r.Match[1] = '1.0' <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el archivo es version 1.0 </FONT></I>\r
530           str := r.Match[2]; \r
531           <B>try</B> <I><FONT COLOR="Navy">// ensure memory release </FONT></I>\r
532             r.Expression := '<navepropia>/s*(.+)/s*</navepropia>'; \r
533             <B>if</B> r.Exec ( str ) <B>then</B> <B>begin</B> \r
534               aNavePropia.free; <I><FONT COLOR="Navy">// Libera la vieja nave propia </FONT></I>\r
535               <I><FONT COLOR="Navy">// Obtiene la nueva navepropia de la serializacion </FONT></I>\r
536               aNavePropia := cNavePropia.crearDeSerializado( r.Match[1] ); \r
537               <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
538                 r.Expression := '<objetos/s+total=(/d+)/s*>/s*(.+)/s*</objetos>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
539                 <B>if</B> r.Exec ( str ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
540                   total := StrToInt( r.Match[1] ); \r
541                   str := r.Match[2]; \r
542                   <I><FONT COLOR="Navy">// libera los objetos viejos </FONT></I>\r
543                   <B>while</B> aObjetos.Count > 0 <B>do</B> <B>begin</B> \r
544                     ov := aObjetos.First; \r
545                     aObjetos.Remove( ov ); \r
546                     ov.free; \r
547                   <B>end</B>; \r
548                   <B>for</B> i := 0 <B>to</B> total - 1 <B>do</B> <B>begin</B> \r
549                     <I><FONT COLOR="Navy">// OBJETO N </FONT></I>\r
550                     <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>\r
551                       r.Expression := '<objeto' + IntToStr( i ) + '/s+class=([/w/d]+)/s*>/s*(.+)/s*</objeto' + IntToStr( i ) + '>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>\r
552                       <B>if</B> r.Exec ( str ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>\r
553                         <I><FONT COLOR="Navy">// lo crea segun su clase y lo agrega a la lista </FONT></I>\r
554                         ov := restaurarObjeto( r.Match[1], r.Match[2] ); \r
555                         aObjetos.Add( ov ); \r
556                         <I><FONT COLOR="Navy">// Elimina duplicados </FONT></I>\r
557                         <B>if</B> ov <B>is</B> cMisilDirigido <B>then</B> <B>begin</B> \r
558                           (ov <B>as</B> cMisilDirigido).mGetObjetivo.free; <I><FONT COLOR="Navy">// libera el objetivo duplicado </FONT></I>\r
559                           (ov <B>as</B> cMisilDirigido).mSetObjetivo( aNavePropia ); <I><FONT COLOR="Navy">// le asigna como objetivo a la nave propia </FONT></I>\r
560                         <B>end</B>; \r
561                       <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>\r
562                         ShowMessage( 'No se encontro el objeto ' + IntToStr( i ) ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
563                     <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>\r
564                       on e: ESerializacion <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si fueron de serializacion... </FONT></I>\r
565                         r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
566                         ShowMessage( 'Error al deserializar el objeto ' \r
567                                      + IntToStr( i ) + ': ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// muestra mensaje </FONT></I>\r
568                       <B>end</B>; \r
569                       on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
570                          r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
571                          ShowMessage( 'Error al extraer el objeto ' + IntToStr( i ) + ' utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
572                       <B>end</B>; \r
573                     <B>end</B>; \r
574                   <B>end</B>; \r
575                 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// si no encontro el tag <objetos total=n> </FONT></I>\r
576                   ShowMessage( 'No se encontro la cantidad total de objetos' ); <I><FONT COLOR="Navy">// muestra mensaje </FONT></I>\r
577               <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores en el tag <objetos total=n> </FONT></I>\r
578                 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
579                   r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>\r
580                   ShowMessage( 'Error al extraer la cantidad total de objetos utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>\r
581                 <B>end</B>; \r
582               <B>end</B>; \r
583             <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// si no encontro el tag <navepropia> </FONT></I>\r
584                   ShowMessage( 'No se encontro la nave propia' ); <I><FONT COLOR="Navy">// muestra mensaje </FONT></I>\r
585           <B>except</B> <I><FONT COLOR="Navy">// si hubieron errores en el tag <navepropia> </FONT></I>\r
586             on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>\r
587               r.Free; \r
588               ShowMessage( 'Error al recuperar la nave propia utilizando expresiones regulares: ' + e.<B>Message</B> ); \r
589             <B>end</B>; \r
590             on e: ESerializacion <B>do</B> <B>begin</B> \r
591               r.Free; \r
592               ShowMessage( 'Error al recuperar la nave propia: ' + e.<B>Message</B> ); \r
593             <B>end</B>; \r
594           <B>end</B> \r
595         <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// if r.Match[1] = '1.0' then begin - chequeo de version fallido </FONT></I>\r
596           ShowMessage( 'El escenario almacenado es de una versión incorrecta (' + \r
597                        r.Match[1] + ').' ) \r
598       <B>else</B> <I><FONT COLOR="Navy">// if r.Exec ( recuperado ) then - si no se encontró un escenario almacenado </FONT></I>\r
599         ShowMessage( 'No se encontró un escenario almacenado en el archivo "' + \r
600                      archivo + '".' ); \r
601     <B>except</B> <I><FONT COLOR="Navy">// error en el tag <eaw version=n> </FONT></I>\r
602       on e: ERegExpr <B>do</B> <B>begin</B> \r
603         r.Free; \r
604         ShowMessage( 'Error al recuperar el escenario utilizando expresiones regulares: ' + e.<B>Message</B> ); \r
605       <B>end</B>; \r
606     <B>end</B>; <I><FONT COLOR="Navy">// try - except </FONT></I>\r
607 <B>end</B>; \r
608  \r
609 <B>procedure</B> <A NAME=TMainForm.SerializarEscenario>TMainForm.SerializarEscenario</A>( archivo: <B>string</B> ); \r
610 <B>var</B> \r
611   serializado: <B>string</B>; \r
612   f:           TextFile; \r
613   ov:          cObjetoVolador; \r
614   i:           integer; \r
615 <B>begin</B> \r
616     <B>try</B> \r
617       assignFile( f, archivo ); <I><FONT COLOR="Navy">// Asigna el archivo </FONT></I>\r
618       rewrite( f );                         <I><FONT COLOR="Navy">// Sobreescribe el archivo </FONT></I>\r
619       <I><FONT COLOR="Navy">// Serializa la nave propia agregando alguna información sobre el archivo y la versión </FONT></I>\r
620       serializado := '<eaw version=1.0><navepropia>' + aNavePropia.mSerializar + '</navepropia>' + \r
621                      '<objetos total=' + IntToStr( aObjetos.Count ) + '>'; \r
622       <I><FONT COLOR="Navy">// Serializa los objetos </FONT></I>\r
623       <B>for</B> i := 0 <B>to</B> aObjetos.Count - 1 <B>do</B> <B>begin</B>  <I><FONT COLOR="Navy">// recorre la lista </FONT></I>\r
624         ov := aObjetos.Items[i]; <I><FONT COLOR="Navy">// obteniendo el primer objeto volador </FONT></I>\r
625           <I><FONT COLOR="Navy">// Serializa el objeto actual </FONT></I>\r
626           serializado := serializado + '<objeto' + IntToStr( i ) + ' class=' + \r
627                          ov.ClassName + '>' + ov.mSerializar + '</objeto' + \r
628                          IntToStr( i ) + '>'; \r
629       <B>end</B>; \r
630       serializado := serializado + '</objetos></eaw>'; \r
631       <B>write</B>( f, serializado );              <I><FONT COLOR="Navy">// Escribe en el archivo </FONT></I>\r
632       closeFile( f );                       <I><FONT COLOR="Navy">// Cierra el archivo </FONT></I>\r
633     <B>except</B>  <I><FONT COLOR="Navy">// Si hay algun error </FONT></I>\r
634       on e: Exception <B>do</B> <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
635         ShowMessage( 'Hubo un error al grabar el archivo "' + \r
636                      archivo + '": ' + #13 + #10 + \r
637                      e.<B>Message</B> + #13 + #10 + \r
638                      'Por favor lea la Sección de Errores del Manual del ' + \r
639                      'Usuario para más información'  ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
640     <B>end</B>; \r
641 <B>end</B>; \r
642  \r
643 <B>procedure</B> <A NAME=TMainForm.DesSerializarJuego>TMainForm.DesSerializarJuego</A>( archivo: <B>string</B> ); \r
644 <B>var</B> \r
645   recuperado:  <B>string</B>; \r
646   c:           char; \r
647   f:           TextFile; \r
648   r:           TRegExpr; \r
649 <B>begin</B> \r
650     <B>try</B> \r
651       assignFile( f, archivo );   <I><FONT COLOR="Navy">// Asigna el archivo </FONT></I>\r
652       reset( f );                             <I><FONT COLOR="Navy">// Abre el archivo </FONT></I>\r
653       recuperado := ''; \r
654       <B>while</B> <B>not</B> eof( f ) <B>do</B> <B>begin</B>     <I><FONT COLOR="Navy">// Lee el archivo </FONT></I>\r
655         <B>read</B>( f, c );                 <I><FONT COLOR="Navy">// caracter por caracter </FONT></I>\r
656         recuperado := recuperado + c; <I><FONT COLOR="Navy">// Almacenandolo en un string </FONT></I>\r
657       <B>end</B>; \r
658     <B>except</B>  <I><FONT COLOR="Navy">// Si hay algun error </FONT></I>\r
659       on e: Exception <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
660         ShowMessage( 'Hubo un error al leer el archivo "' + \r
661                      archivo + '": ' + #13 + #10 + \r
662                      e.<B>Message</B> + #13 + #10 + \r
663                      'Por favor lea la Sección de Errores del Manual del ' + \r
664                      'Usuario para más información'  ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
665       <B>end</B>; \r
666     <B>end</B>; \r
667     r := TRegExpr.create; \r
668     <B>try</B> <I><FONT COLOR="Navy">// ensure memory release </FONT></I>\r
669       r.Expression := '<jaw/s+version=(/d+[/./d+]*)/s*>/s*(.+)/s*</jaw>'; \r
670       <B>if</B> r.Exec ( recuperado ) <B>then</B> \r
671         <B>if</B> r.Match[1] = '1.0' <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el archivo es version 1.0 </FONT></I>\r
672           aEspacio.free; <I><FONT COLOR="Navy">// Libera el espacio existente de existir </FONT></I>\r
673           aEspacio := <B>nil</B>; \r
674           aEspacio := cEspacio.crearDeSerializado( r.Match[2] );    <I><FONT COLOR="Navy">// Crea el nuevo a partir del guardado </FONT></I>\r
675           aNavePropia := aEspacio.mGetNavePropia;       <I><FONT COLOR="Navy">// Asigna la nueva nave propia </FONT></I>\r
676           aVista.free;                                  <I><FONT COLOR="Navy">// Libera la vieja vista </FONT></I>\r
677           aVista := <B>nil</B>; \r
678           aVista := cVista.create( self, aNavePropia ); <I><FONT COLOR="Navy">// Crea la nueva vista </FONT></I>\r
679           aBtnIniciar.Enabled := true;                  <I><FONT COLOR="Navy">// Se puede iniciar el juego </FONT></I>\r
680         <B>end</B> <B>else</B> \r
681           ShowMessage( 'El juego almacenado es de una versión incorrecta (' + \r
682                        r.Match[1] + ').' ) \r
683       <B>else</B> \r
684         ShowMessage( 'No se encontró un juego almacenado en el archivo "' + \r
685                      archivo + '".' ); \r
686     <B>except</B> \r
687       on e: ERegExpr <B>do</B> <B>begin</B> \r
688         r.Free; \r
689         ShowMessage( 'Error al recuperar el juego utilizando expresiones regulares: ' + e.<B>Message</B> ); \r
690       <B>end</B>; \r
691       on e: ESerializacion <B>do</B> <B>begin</B> \r
692         r.Free; \r
693         ShowMessage( 'Error al recuperar el juego: ' + e.<B>Message</B> ); \r
694       <B>end</B>; \r
695     <B>end</B>; \r
696     closeFile( f );                         <I><FONT COLOR="Navy">// Cierra el archivo </FONT></I>\r
697 <B>end</B>; \r
698  \r
699 <B>procedure</B> <A NAME=TMainForm.SerializarJuego>TMainForm.SerializarJuego</A>( archivo: <B>string</B> ); \r
700 <B>var</B> \r
701   serializado: <B>string</B>; \r
702   f:           TextFile; \r
703 <B>begin</B> \r
704     <B>try</B> \r
705       assignFile( f, archivo ); <I><FONT COLOR="Navy">// Asigna el archivo </FONT></I>\r
706       rewrite( f );                         <I><FONT COLOR="Navy">// Sobreescribe el archivo </FONT></I>\r
707       <I><FONT COLOR="Navy">// Serializa agregando alguna información sobre el archivo y la versión </FONT></I>\r
708       serializado := '<jaw version=1.0>' + aEspacio.mSerializar + '</jaw>'; \r
709       <B>write</B>( f, serializado );              <I><FONT COLOR="Navy">// Escribe en el archivo </FONT></I>\r
710       closeFile( f );                       <I><FONT COLOR="Navy">// Cierra el archivo </FONT></I>\r
711     <B>except</B>  <I><FONT COLOR="Navy">// Si hay algun error </FONT></I>\r
712       on e: Exception <B>do</B> <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
713         ShowMessage( 'Hubo un error al grabar el archivo "' + \r
714                      archivo + '": ' + #13 + #10 + \r
715                      e.<B>Message</B> + #13 + #10 + \r
716                      'Por favor lea la Sección de Errores del Manual del ' + \r
717                      'Usuario para más información'  ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>\r
718     <B>end</B>; \r
719 <B>end</B>; \r
720  \r
721 <B>procedure</B> <A NAME=TMainForm.aMenuItemCambioAutomaticoClick>TMainForm.aMenuItemCambioAutomaticoClick</A>(Sender: TObject); \r
722 <B>begin</B> \r
723   aMenuItemCambioAutomatico.Checked := <B>not</B> aMenuItemCambioAutomatico.Checked;  \r
724 <B>end</B>; \r
725  \r
726 <B>end</B>. \r
727 </PRE>\r
728 </BODY>\r
729 </HTML>\r