2 <TITLE>File: nave.pas </TITLE>
\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">
\r
5 <BODY BGCOLOR="#FFFFFF">
\r
6 <A NAME=nave.pas><CENTER><H3>nave.pas</H3></A><I> from <A HREF=/proyecto/doc/src-html/AlgoWars.html> Project: AlgoWars.dpr</A></I></CENTER>
\r
9 <I><FONT COLOR="Navy">{** Contiene una clase abstracta con elementos comunes a todas las naves.<br>
\r
12 27/11/00: Se agrega toda la parte del manejo de disparos, agregándose los métodos mPuedeDispararLaser,
\r
13 mPuedeDispararMisil, mPuedeDispararMisDir y mDisparar, además de varios atributos para manejar
\r
14 los retardos de las armas. El método mDisparar se hace virtual ya que puede ser modificado por
\r
15 las subclases para que cambie su mecanismo de disparos.
\r
16 29/11/00: Se agregan métodos para obtener la cantidad de armamento que le queda a la nave para poder ser
\r
17 mostrados (mGetMisiles y mGetMisilesDirigidos)
\r
18 01/12/00: Se modifican levemente los metodos mPuedeDispararXxxx para que permitan disparar si el puntero
\r
19 al Objeto Volador objetivo es nil.
\r
20 Se Agregan los métodos mRetardarLaser, mRetardarMisil, mRetardarMisDir que resetea el contador
\r
21 del retardo, mActualizarRetardos que resta el dT a los retardos, y mCrearLaserDisparado,
\r
22 mCrearMisilDisparado y mCrearMisDirDisparado que crea el arma correspondiente (actualizando
\r
23 retardos y todo lo que sea necesario) para que las subclases puedan escribir su propio mDisparar.
\r
24 Se cambia el orden de los argumentos de mDisparar para aprovechar los argumentos por defecto.
\r
25 08/12/00: Se sobreescribieron los métodos para establecer la velocidad y su módulo para evitar que se
\r
26 sobrepase el límite de la velocidad máxima.
\r
39 <I><FONT COLOR="Navy">{** Clase abstracta con elementos comunes a todas las naves.}</FONT></I>
\r
40 cNave = <B>class</B>( cObjetoVolador )
\r
42 aMisiles: tMaxMisil; <I><FONT COLOR="Navy">// Cantidad de misilies comunes </FONT></I>
\r
43 aMisilesDirigidos: tMaxMisilDirigido; <I><FONT COLOR="Navy">// Cantidad de misiles dirigidos </FONT></I>
\r
44 aVelMaxima: tLongitud; <I><FONT COLOR="Navy">// Velocidad máxima de la nave </FONT></I>
\r
45 aRetardoLaser: tTiempo; <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar </FONT></I>
\r
46 aRetardoMisil: tTiempo; <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar </FONT></I>
\r
47 aRetardoMisDir: tTiempo; <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar </FONT></I>
\r
48 aRetardoLaserCont: tTiempo; <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar (contador) </FONT></I>
\r
49 aRetardoMisilCont: tTiempo; <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar (contador) </FONT></I>
\r
50 aRetardoMisDirCont: tTiempo; <I><FONT COLOR="Navy">// Ratardo del arma antes de poder volver a disparar (contador) </FONT></I>
\r
52 <I><FONT COLOR="Navy">{** Setea la velocidad máxima}</FONT></I>
\r
53 <B>function</B> <A HREF="#cNave.mSetVelMax">mSetVelMax</A>( velMax: tLongitud ): cNave;
\r
54 <I><FONT COLOR="Navy">{** Resta un misil}</FONT></I>
\r
55 <B>function</B> <A HREF="#cNave.mRestarMisil">mRestarMisil</A>: cNave;
\r
56 <I><FONT COLOR="Navy">{** Resta un misil dirigido}</FONT></I>
\r
57 <B>function</B> <A HREF="#cNave.mRestarMisilDirigido">mRestarMisilDirigido</A>: cNave;
\r
58 <I><FONT COLOR="Navy">{** Devuelve true si todavía tiene misiles}</FONT></I>
\r
59 <B>function</B> <A HREF="#cNave.mTieneMisil">mTieneMisil</A>: boolean;
\r
60 <I><FONT COLOR="Navy">{** Devuelve true si todavía tiene misiles dirigidos}</FONT></I>
\r
61 <B>function</B> <A HREF="#cNave.mTieneMisilDirigido">mTieneMisilDirigido</A>: boolean;
\r
62 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del láser}</FONT></I>
\r
63 <B>procedure</B> <A HREF="#cNave.mRetardarLaser">mRetardarLaser</A>;
\r
64 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del misil}</FONT></I>
\r
65 <B>procedure</B> <A HREF="#cNave.mRetardarMisil">mRetardarMisil</A>;
\r
66 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del misil dirigido}</FONT></I>
\r
67 <B>procedure</B> <A HREF="#cNave.mRetardarMisDir">mRetardarMisDir</A>;
\r
68 <I><FONT COLOR="Navy">{** Actualiza los retardadores}</FONT></I>
\r
69 <B>procedure</B> <A HREF="#cNave.mActualizarRetardadores">mActualizarRetardadores</A>( dT: tTiempo );
\r
70 <I><FONT COLOR="Navy">{** Crea un laser (actualizando retardos y todo lo que sea necesario)}</FONT></I>
\r
71 <B>function</B> <A HREF="#cNave.mCrearLaserDisparado">mCrearLaserDisparado</A>: cLaser;
\r
72 <I><FONT COLOR="Navy">{** Crea un misil (actualizando retardos y todo lo que sea necesario)}</FONT></I>
\r
73 <B>function</B> <A HREF="#cNave.mCrearMisilDisparado">mCrearMisilDisparado</A>: cMisil;
\r
74 <I><FONT COLOR="Navy">{** Crea un misil dirigido (actualizando retardos y todo lo que sea necesario)}</FONT></I>
\r
75 <B>function</B> <A HREF="#cNave.mCrearMisDirDisparado">mCrearMisDirDisparado</A>( ov : cObjetoVolador ): cMisilDirigido;
\r
77 <I><FONT COLOR="Navy">{** Constructor}</FONT></I>
\r
78 <B>constructor</B> create( pos: cVector = <B>nil</B>; vel: cVector = <B>nil</B>; dim: tLongitud = 5;
\r
79 pot: tEnergia = 1; ene: tEnergia = 100; misiles: tMaxMisil = 0;
\r
80 misilesDirigidos: tMaxMisilDirigido = 0; velMax: tLongitud = 0.2;
\r
81 retardoLaser: tTiempo = 1000; <I><FONT COLOR="Navy">{1 segundo}</FONT></I>
\r
82 retardoMisil: tTiempo = 60000; <I><FONT COLOR="Navy">{1 minuto}</FONT></I>
\r
83 retardoMisDir: tTiempo = 180000 <I><FONT COLOR="Navy">{3 minutos}</FONT></I>); overload;
\r
84 <I><FONT COLOR="Navy">{** Hace que se dispare un arma (todavía no está implementado), devolviendo la nueva
\r
85 municion disparada}</FONT></I>
\r
86 <B>function</B> <A HREF="#cNave.mDisparar">mDisparar</A>( dT: tTiempo; ov : cObjetoVolador = <B>nil</B> ): cArma; <B>virtual</B>;
\r
87 <I><FONT COLOR="Navy">{** Obtiene la cantidad de Misiles que le quedan a la nave}</FONT></I>
\r
88 <B>function</B> <A HREF="#cNave.mGetMisiles">mGetMisiles</A>: tMaxMisil;
\r
89 <I><FONT COLOR="Navy">{** Obtiene la cantidad de Misiles Dirigidos que le quedan a la nave}</FONT></I>
\r
90 <B>function</B> <A HREF="#cNave.mGetMisilesDirigidos">mGetMisilesDirigidos</A>: tMaxMisilDirigido;
\r
91 <I><FONT COLOR="Navy">{** Obtiene la velocidad máxima}</FONT></I>
\r
92 <B>function</B> <A HREF="#cNave.mGetVelMax">mGetVelMax</A>: tLongitud;
\r
93 <I><FONT COLOR="Navy">{** Método para establecer la velocidad}</FONT></I>
\r
94 <B>function</B> <A HREF="#cNave.mSetVelocidad">mSetVelocidad</A>( velocidad: cVector ): cObjetoVolador; <B>override</B>;
\r
95 <I><FONT COLOR="Navy">{** Método para establecer el modulo de la velocidad}</FONT></I>
\r
96 <B>function</B> <A HREF="#cNave.mSetVelModulo">mSetVelModulo</A>( velocidad: tLongitud ): cObjetoVolador; <B>override</B>;
\r
97 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.}</FONT></I>
\r
98 <B>function</B> <A HREF="#cNave.mPuedeDispararLaser">mPuedeDispararLaser</A>( ov : cObjetoVolador ): boolean;
\r
99 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.}</FONT></I>
\r
100 <B>function</B> <A HREF="#cNave.mPuedeDispararMisil">mPuedeDispararMisil</A>( ov : cObjetoVolador ): boolean;
\r
101 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.}</FONT></I>
\r
102 <B>function</B> <A HREF="#cNave.mPuedeDispararMisDir">mPuedeDispararMisDir</A>( ov : cObjetoVolador ): boolean;
\r
103 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
104 <I><FONT COLOR="Navy">{** Método heredado que devuelve un string con el estado del Objeto. Se utiliza para depurar
\r
105 y la información entregada depende del parámetro tDebugInfo.}</FONT></I>
\r
106 <B>function</B> <A HREF="#cNave.mGetDebugInfo">mGetDebugInfo</A>( debugLevel: tDebugInfo = DI_MINI ): <B>string</B>; <B>override</B>;
\r
107 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
108 <I><FONT COLOR="Navy">// SERIALIZACION </FONT></I>
\r
109 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.}</FONT></I>
\r
110 <B>function</B> <A HREF="#cNave.mSerializar">mSerializar</A>: <B>string</B>; <B>override</B>;
\r
111 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
112 serializado.}</FONT></I>
\r
113 <B>procedure</B> <A HREF="#cNave.mDesSerializar">mDesSerializar</A>( str: <B>string</B> ); <B>override</B>;
\r
116 <B>implementation</B>
\r
120 ObjetoPersistente,
\r
123 <I><FONT COLOR="Navy">{ cNave }</FONT></I>
\r
125 <I><FONT COLOR="Navy">{** Constructor
\r
126 @param pos Posicion inicial
\r
127 @param vel Velocidad inicial
\r
128 @param dim Dimensión (radio, en metros)
\r
129 @param pot Potencia (cantidad de daño que hace por intervalode tiempo)
\r
130 @param ene Energía (cantidad de daño que soporta antes de ser destruido)
\r
131 @param misiles Cantidad de misiles comunes
\r
132 @param misilesDirigidos Cantidad de misiles dirigidos
\r
133 @param velMax Velocidad máxima que puede alcanzar (modulo)
\r
134 @param retardoLaser Ratardo del arma antes de poder volver a disparar
\r
135 @param retardoMisil Ratardo del arma antes de poder volver a disparar
\r
136 @param retardoMisDir Ratardo del arma antes de poder volver a disparar}</FONT></I>
\r
137 <B>constructor</B> cNave.create(pos, vel: cVector; dim: tLongitud; pot,
\r
138 ene: tEnergia; misiles: tMaxMisil; misilesDirigidos: tMaxMisilDirigido;
\r
139 velMax: tLongitud; retardoLaser: tTiempo; retardoMisil: tTiempo;
\r
140 retardoMisDir: tTiempo);
\r
142 <B>if</B> vel <> <B>nil</B> <B>then</B>
\r
143 <B>if</B> vel.mGetModulo > velMax <B>then</B>
\r
144 vel.mSetModulo( velMax );
\r
145 <B>inherited</B> create( pos, vel, dim, pot, ene );
\r
146 aMisiles := misiles;
\r
147 aMisilesDirigidos := misilesDirigidos;
\r
148 aVelMaxima := velMax;
\r
149 aRetardoLaser := retardoLaser;
\r
150 aRetardoMisil := retardoMisil;
\r
151 aRetardoMisDir := retardoMisDir;
\r
152 aRetardoLaserCont := 0; <I><FONT COLOR="Navy">// lista para disparar </FONT></I>
\r
153 aRetardoMisilCont := 0; <I><FONT COLOR="Navy">// lista para disparar </FONT></I>
\r
154 aRetardoMisDirCont := 0; <I><FONT COLOR="Navy">// lista para disparar </FONT></I>
\r
157 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
158 <I><FONT COLOR="Navy">{** Devuelve el estado del objeto basandose en la cantidad de datos requeridos.
\r
159 @return Cadena de texto con el estado del Objeto.
\r
160 @param debugLevel Cantidad de información requerida}</FONT></I>
\r
161 <B>function</B> <A NAME=cNave.mGetDebugInfo>cNave.mGetDebugInfo</A>(debugLevel: tDebugInfo): <B>string</B>;
\r
163 result := <B>inherited</B> mGetDebugInfo( debugLevel );
\r
164 <B>if</B> debugLevel > DI_MINI <B>then</B>
\r
165 result := result + ' | Misiles: ' + IntToStr( aMisiles ) +
\r
166 ' | Misiles Dirigidos: ' + IntToStr( aMisilesDirigidos );
\r
168 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
170 <I><FONT COLOR="Navy">{** Devuelve la velocidad máxima
\r
171 @return Velocidad máxima (modulo)}</FONT></I>
\r
172 <B>function</B> <A NAME=cNave.mGetVelMax>cNave.mGetVelMax</A>: tLongitud;
\r
174 result := aVelMaxima;
\r
177 <I><FONT COLOR="Navy">{** Resta un misil}</FONT></I>
\r
178 <B>function</B> <A NAME=cNave.mRestarMisil>cNave.mRestarMisil</A>: cNave;
\r
180 aMisiles := aMisiles - 1;
\r
184 <I><FONT COLOR="Navy">{** Resta un misil dirigido}</FONT></I>
\r
185 <B>function</B> <A NAME=cNave.mRestarMisilDirigido>cNave.mRestarMisilDirigido</A>: cNave;
\r
187 aMisilesDirigidos := aMisilesDirigidos - 1;
\r
191 <I><FONT COLOR="Navy">{** Setea la velocidad máxima
\r
192 @param velMax Nueva velocidad máxima (modulo)}</FONT></I>
\r
193 <B>function</B> <A NAME=cNave.mSetVelMax>cNave.mSetVelMax</A>(velMax: tLongitud): cNave;
\r
195 aVelMaxima := velMax;
\r
199 <I><FONT COLOR="Navy">{** Chequea si todavía tiene misiles
\r
200 @return <i>true</i> si tiene misiles, <i>false</i> si no}</FONT></I>
\r
201 <B>function</B> <A NAME=cNave.mTieneMisil>cNave.mTieneMisil</A>: boolean;
\r
203 result := ( aMisiles > 0 ); <I><FONT COLOR="Navy">// Devuelve true si aMisiles es mayor que cero </FONT></I>
\r
206 <I><FONT COLOR="Navy">{** Chequea si todavía tiene misiles dirigidos
\r
207 @return <i>true</i> si tiene misiles dirigidos, <i>false</i> si no}</FONT></I>
\r
208 <B>function</B> <A NAME=cNave.mTieneMisilDirigido>cNave.mTieneMisilDirigido</A>: boolean;
\r
210 result := ( aMisilesDirigidos > 0 ); <I><FONT COLOR="Navy">// Devuelve true si aMisilesDirigidos es mayor que cero </FONT></I>
\r
213 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.
\r
214 @param np Nave Propia a la que quiere disparar
\r
215 @return <i>True</i> si está todo ok, <i>False</i> si no.}</FONT></I>
\r
216 <B>function</B> <A NAME=cNave.mPuedeDispararLaser>cNave.mPuedeDispararLaser</A>( ov : cObjetoVolador ): boolean;
\r
219 <B>if</B> aRetardoLaserCont <= 0 <B>then</B> <I><FONT COLOR="Navy">// Primero se fija que ya esté recargada el arma </FONT></I>
\r
220 <I><FONT COLOR="Navy">// 1200 es el alcance del laser. </FONT></I>
\r
221 <B>if</B> ov <> <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el ov es nil puede disparar, ni no lo es, chequea la distancia </FONT></I>
\r
222 <B>if</B> mGetDistancia( ov ) < 1200 <B>then</B><I><FONT COLOR="Navy">// Si la distancia a la np es menor que el alcance </FONT></I>
\r
224 <B>end</B> <B>else</B>
\r
228 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.
\r
229 @param np Nave Propia a la que quiere disparar
\r
230 @return <i>True</i> si está todo ok, <i>False</i> si no.}</FONT></I>
\r
231 <B>function</B> <A NAME=cNave.mPuedeDispararMisil>cNave.mPuedeDispararMisil</A>( ov : cObjetoVolador ): boolean;
\r
234 <I><FONT COLOR="Navy">// Primero se fija que ya esté recargada el arma y que todavia tenga municiones </FONT></I>
\r
235 <B>if</B> mTieneMisil <B>and</B> ( aRetardoMisilCont <= 0 ) <B>then</B>
\r
236 <I><FONT COLOR="Navy">// 1500 es el alcance del misil. </FONT></I>
\r
237 <B>if</B> ov <> <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el ov es nil puede disparar, ni no lo es, chequea la distancia </FONT></I>
\r
238 <B>if</B> mGetDistancia( ov ) < 1500 <B>then</B><I><FONT COLOR="Navy">// Si la distancia a la np es menor que el alcance </FONT></I>
\r
240 <B>end</B> <B>else</B>
\r
244 <I><FONT COLOR="Navy">{** Chequea que el enemigo este a distancia, que tenga municiones, etc.
\r
245 @param np Nave Propia a la que quiere disparar
\r
246 @return <i>True</i> si está todo ok, <i>False</i> si no.}</FONT></I>
\r
247 <B>function</B> <A NAME=cNave.mPuedeDispararMisDir>cNave.mPuedeDispararMisDir</A>( ov : cObjetoVolador ): boolean;
\r
250 <I><FONT COLOR="Navy">// Primero se fija que ya esté recargada el arma y que todavia tenga municiones </FONT></I>
\r
251 <B>if</B> mTieneMisilDirigido <B>and</B> ( aRetardoMisDirCont <= 0 ) <B>then</B>
\r
252 <I><FONT COLOR="Navy">// 2000 es el alcance del misil dirigido. </FONT></I>
\r
253 <B>if</B> ov <> <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el ov es nil puede disparar, ni no lo es, chequea la distancia </FONT></I>
\r
254 <B>if</B> mGetDistancia( ov ) < 2000 <B>then</B><I><FONT COLOR="Navy">// Si la distancia a la np es menor que el alcance </FONT></I>
\r
256 <B>end</B> <B>else</B>
\r
260 <I><FONT COLOR="Navy">{** Hace que se dispare un arma
\r
261 @param ov Objetivo del disparo
\r
262 @param dT Intervalo de tiempo
\r
263 @return Arma disparada (o <i>nil</i> si no se puede disparar ningún arma)}</FONT></I>
\r
264 <B>function</B> <A NAME=cNave.mDisparar>cNave.mDisparar</A>( dT: tTiempo; ov : cObjetoVolador ): cArma;
\r
266 result := <B>nil</B>; <I><FONT COLOR="Navy">// devuelve nil por defecto </FONT></I>
\r
267 mActualizarRetardadores( dT );
\r
268 <B>if</B> mPuedeDispararMisDir( ov ) <B>then</B>
\r
269 result := mCrearMisDirDisparado( ov )
\r
270 <B>else</B> <B>if</B> mPuedeDispararMisil( ov ) <B>then</B>
\r
271 result := mCrearMisilDisparado
\r
272 <B>else</B> <B>if</B> mPuedeDispararLaser( ov ) <B>then</B>
\r
273 result := mCrearLaserDisparado;
\r
276 <I><FONT COLOR="Navy">{** Obtiene la cantidad de Misiles que le quedan a la nave
\r
277 return Cantidad de misiles que le quedan a la nave}</FONT></I>
\r
278 <B>function</B> <A NAME=cNave.mGetMisiles>cNave.mGetMisiles</A>: tMaxMisil;
\r
280 result := aMisiles;
\r
283 <I><FONT COLOR="Navy">{** Obtiene la cantidad de Misiles que le quedan a la nave
\r
284 return Cantidad de misiles dirigidos que le quedan a la nave}</FONT></I>
\r
285 <B>function</B> <A NAME=cNave.mGetMisilesDirigidos>cNave.mGetMisilesDirigidos</A>: tMaxMisilDirigido;
\r
287 result := aMisilesDirigidos;
\r
290 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del láser}</FONT></I>
\r
291 <B>procedure</B> <A NAME=cNave.mRetardarLaser>cNave.mRetardarLaser</A>;
\r
293 aRetardoLaserCont := aRetardoLaser;
\r
296 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del misil dirigido}</FONT></I>
\r
297 <B>procedure</B> <A NAME=cNave.mRetardarMisDir>cNave.mRetardarMisDir</A>;
\r
299 aRetardoMisDirCont := aRetardoMisDir;
\r
302 <I><FONT COLOR="Navy">{** Resetea el contador del retardo del misil}</FONT></I>
\r
303 <B>procedure</B> <A NAME=cNave.mRetardarMisil>cNave.mRetardarMisil</A>;
\r
305 aRetardoMisilCont := aRetardoMisil;
\r
308 <I><FONT COLOR="Navy">{** Actualiza los retardadores
\r
309 @param dT Intervalo de tiempo a restarles}</FONT></I>
\r
310 <B>procedure</B> <A NAME=cNave.mActualizarRetardadores>cNave.mActualizarRetardadores</A>(dT: tTiempo);
\r
312 <B>if</B> aRetardoMisDirCont > 0 <B>then</B>
\r
313 aRetardoMisDirCont := aRetardoMisDirCont - dT;
\r
314 <B>if</B> aRetardoMisilCont > 0 <B>then</B>
\r
315 aRetardoMisilCont := aRetardoMisilCont - dT;
\r
316 <B>if</B> aRetardoLaserCont > 0 <B>then</B>
\r
317 aRetardoLaserCont := aRetardoLaserCont - dT;
\r
320 <I><FONT COLOR="Navy">{** Crea un láser (actualizando retardos)
\r
321 @return Nuevo láser}</FONT></I>
\r
322 <B>function</B> <A NAME=cNave.mCrearLaserDisparado>cNave.mCrearLaserDisparado</A>: cLaser;
\r
328 mRetardarLaser; <I><FONT COLOR="Navy">// Resetea el retardo </FONT></I>
\r
329 <I><FONT COLOR="Navy">// Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de </FONT></I>
\r
330 <I><FONT COLOR="Navy">// su tamaño en la direccion de i (para que no colisione con quien dispara). </FONT></I>
\r
331 vec := mGetI.mMultiplicar( mGetDimension * 1.5 );
\r
332 pos := mGetPosicion.mSumar( vec );
\r
333 <I><FONT COLOR="Navy">// vec tambien me va a servir como la dirección de la velocidad porque tiene la direccion de i </FONT></I>
\r
335 <I><FONT COLOR="Navy">// devuelve el arma disparada </FONT></I>
\r
336 result := cLaser.create( pos, vel );
\r
337 <I><FONT COLOR="Navy">// Libera memoria </FONT></I>
\r
342 <I><FONT COLOR="Navy">{** Crea un misil dirigido (actualizando retardos y restando un misil dirigido)
\r
343 @param ov Objetivo del misil dirigido
\r
344 @return Nuevo misil dirigido}</FONT></I>
\r
345 <B>function</B> <A NAME=cNave.mCrearMisDirDisparado>cNave.mCrearMisDirDisparado</A>( ov : cObjetoVolador ): cMisilDirigido;
\r
350 mRestarMisilDirigido;
\r
351 mRetardarMisDir; <I><FONT COLOR="Navy">// Resetea el retardo </FONT></I>
\r
352 <I><FONT COLOR="Navy">// Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de </FONT></I>
\r
353 <I><FONT COLOR="Navy">// su tamaño en la direccion de i (para que no colisione con quien dispara) </FONT></I>
\r
354 vec := mGetI.mMultiplicar( mGetDimension * 1.5 );
\r
355 pos := mGetPosicion.mSumar( vec );
\r
356 <I><FONT COLOR="Navy">// devuelve el arma disparada </FONT></I>
\r
357 result := cMisilDirigido.create( ov, pos );
\r
358 <I><FONT COLOR="Navy">// Libera memoria </FONT></I>
\r
363 <I><FONT COLOR="Navy">{** Crea un misil dirigido (actualizando retardos y restando un misil)
\r
364 @return Nuevo misil}</FONT></I>
\r
365 <B>function</B> <A NAME=cNave.mCrearMisilDisparado>cNave.mCrearMisilDisparado</A>: cMisil;
\r
371 mRestarMisil; <I><FONT COLOR="Navy">// Resta un misil </FONT></I>
\r
372 mRetardarMisil; <I><FONT COLOR="Navy">// Resetea el retardo </FONT></I>
\r
373 <I><FONT COLOR="Navy">// Se calcula la posicion a partir de la posicion de la nave propia y sumandole el 150% de </FONT></I>
\r
374 <I><FONT COLOR="Navy">// su tamaño en la direccion de i (para que no colisione con quien dispara) </FONT></I>
\r
375 vec := mGetI.mMultiplicar( mGetDimension * 1.5 );
\r
376 pos := mGetPosicion.mSumar( vec );
\r
377 <I><FONT COLOR="Navy">// vec tambien me va a servir como la dirección de la velocidad porque tiene la direccion de i </FONT></I>
\r
379 <I><FONT COLOR="Navy">// devuelve el arma disparada </FONT></I>
\r
380 result := cMisil.create( pos, vel );
\r
381 <I><FONT COLOR="Navy">// Libera memoria </FONT></I>
\r
386 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
388 @param str Cadena de texto con el objeto serializado.}</FONT></I>
\r
389 <B>procedure</B> <A NAME=cNave.mDesSerializar>cNave.mDesSerializar</A>(str: <B>string</B>);
\r
393 <B>inherited</B> mDesSerializar( str ); <I><FONT COLOR="Navy">// SIEMPRE el ID debe ser el PRIMER atributo </FONT></I>
\r
394 r := TRegExpr.create;
\r
395 <I><FONT COLOR="Navy">// MISILES </FONT></I>
\r
396 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
397 r.Expression := '<misiles>/s*(/d+)/s*</misiles>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
398 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
399 aMisiles := StrToInt( r.Match[1] )
\r
400 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
401 <B>raise</B> ESerializacion.create( 'No se encontro la cantidad de misiles' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
402 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
403 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
404 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
405 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer la cantidad de misiles utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
408 <I><FONT COLOR="Navy">// MISILESDIRIGIDOS </FONT></I>
\r
409 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
410 r.Expression := '<misilesdirigidos>/s*(/d+)/s*</misilesdirigidos>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
411 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
412 aMisilesDirigidos := StrToInt( r.Match[1] )
\r
413 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
414 <B>raise</B> ESerializacion.create( 'No se encontro la cantidad de misiles dirigidos' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
415 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
416 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
417 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
418 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer la cantidad de misiles dirigidos utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
421 <I><FONT COLOR="Navy">// VELMAXIMA </FONT></I>
\r
422 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
423 r.Expression := '<velmaxima>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</velmaxima>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
424 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
425 aVelMaxima := StrToFloat( r.Match[1] )
\r
426 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
427 <B>raise</B> ESerializacion.create( 'No se encontro la velocidad maxima' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
428 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
429 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
430 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
431 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer la velocidad maxima utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
434 <I><FONT COLOR="Navy">// RETARDOLASER </FONT></I>
\r
435 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
436 r.Expression := '<retardolaser>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardolaser>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
437 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
438 aRetardoLaser := StrToFloat( r.Match[1] )
\r
439 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
440 <B>raise</B> ESerializacion.create( 'No se encontro el retardo del laser' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
441 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
442 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
443 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
444 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el retardo del laser utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
447 <I><FONT COLOR="Navy">// RETARDOMISIL </FONT></I>
\r
448 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
449 r.Expression := '<retardomisil>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardomisil>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
450 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
451 aRetardoMisil := StrToFloat( r.Match[1] )
\r
452 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
453 <B>raise</B> ESerializacion.create( 'No se encontro el retardo del misil' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
454 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
455 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
456 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
457 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el retardo del misil utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
460 <I><FONT COLOR="Navy">// RETARDOMISDIR </FONT></I>
\r
461 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
462 r.Expression := '<retardomisdir>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardomisdir>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
463 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
464 aRetardoMisDir := StrToFloat( r.Match[1] )
\r
465 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
466 <B>raise</B> ESerializacion.create( 'No se encontro el retardo del misil dirigido' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
467 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
468 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
469 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
470 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el retardo del misil dirigido utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
473 <I><FONT COLOR="Navy">// RETARDOLASERCONT </FONT></I>
\r
474 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
475 r.Expression := '<retardolasercont>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardolasercont>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
476 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
477 aRetardoLaserCont := StrToFloat( r.Match[1] )
\r
478 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
479 <B>raise</B> ESerializacion.create( 'No se encontro el contador del retardo del laser' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
480 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
481 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
482 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
483 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del laser utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
486 <I><FONT COLOR="Navy">// RETARDOMISIL </FONT></I>
\r
487 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
488 r.Expression := '<retardomisilcont>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardomisilcont>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
489 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
490 aRetardoMisilCont := StrToFloat( r.Match[1] )
\r
491 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
492 <B>raise</B> ESerializacion.create( 'No se encontro el contador del retardo del misil' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
493 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
494 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
495 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
496 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del misil utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
499 <I><FONT COLOR="Navy">// RETARDOMISDIR </FONT></I>
\r
500 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
501 r.Expression := '<retardomisdircont>/s*([+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?)/s*</retardomisdircont>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
502 <B>if</B> r.Exec ( str ) <B>then</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
503 aRetardoMisDirCont := StrToFloat( r.Match[1] )
\r
504 <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
505 <B>raise</B> ESerializacion.create( 'No se encontro el contador del retardo del misil dirigido' ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
506 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
507 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
508 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
509 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el contador del retardo del misil dirigido utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
515 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.
\r
516 @return Cadena de texto con el objeto serializado.}</FONT></I>
\r
517 <B>function</B> <A NAME=cNave.mSerializar>cNave.mSerializar</A>: <B>string</B>;
\r
519 result := <B>inherited</B> mSerializar +
\r
520 '<misiles>' + IntToStr( aMisiles ) + '</misiles>' +
\r
521 '<misilesdirigidos>' + IntToStr( aMisilesDirigidos ) + '</misilesdirigidos>' +
\r
522 '<velmaxima>' + FloatToStrF( aVelMaxima, ffGeneral, 18, 0 ) + '</velmaxima>' +
\r
523 '<retardolaser>' + FloatToStrF( aRetardoLaser, ffGeneral, 18, 0 ) + '</retardolaser>' +
\r
524 '<retardomisil>' + FloatToStrF( aRetardoMisil, ffGeneral, 18, 0 ) + '</retardomisil>' +
\r
525 '<retardomisdir>' + FloatToStrF( aRetardoMisDir, ffGeneral, 18, 0 ) + '</retardomisdir>' +
\r
526 '<retardolasercont>' + FloatToStrF( aRetardoLaserCont, ffGeneral, 18, 0 ) + '</retardolasercont>' +
\r
527 '<retardomisilcont>' + FloatToStrF( aRetardoMisilCont, ffGeneral, 18, 0 ) + '</retardomisilcont>' +
\r
528 '<retardomisdircont>' + FloatToStrF( aRetardoMisDirCont, ffGeneral, 18, 0 ) + '</retardomisdircont>';
\r
531 <I><FONT COLOR="Navy">{** Método para establecer la velocidad}</FONT></I>
\r
532 <B>function</B> <A NAME=cNave.mSetVelModulo>cNave.mSetVelModulo</A>(velocidad: tLongitud): cObjetoVolador;
\r
534 <B>if</B> velocidad > aVelMaxima <B>then</B>
\r
535 velocidad := aVelMaxima;
\r
536 result := <B>inherited</B> mSetVelModulo( velocidad );
\r
539 <I><FONT COLOR="Navy">{** Método para establecer el modulo de la velocidad}</FONT></I>
\r
540 <B>function</B> <A NAME=cNave.mSetVelocidad>cNave.mSetVelocidad</A>(velocidad: cVector): cObjetoVolador;
\r
542 <B>if</B> velocidad.mGetModulo > aVelMaxima <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si sobrepasa el limite ... </FONT></I>
\r
543 mSetVelModulo( aVelMaxima ); <I><FONT COLOR="Navy">// Se le asigna el modulo como limite </FONT></I>
\r
544 mSetVelDir( velocidad ); <I><FONT COLOR="Navy">// Se le asigna la direccion </FONT></I>
\r
546 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// Si no sobrepasa el limite ... </FONT></I>
\r
547 result := <B>inherited</B> mSetVelocidad( velocidad ); <I><FONT COLOR="Navy">// Se asigna la nueva vel </FONT></I>
\r