2 <TITLE>File: vista.pas </TITLE>
\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">
\r
5 <BODY BGCOLOR="#FFFFFF">
\r
6 <A NAME=vista.pas><CENTER><H3>vista.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">{** Interpreta y dibuja los datos del modelo en un formulario<br>
\r
12 10/11/00: Se maneja la excepción para evitar usar la camara cuando el cameraman fue destruido (ECameramanDestruido).
\r
13 Esta es propagada (por ahora) para que el controlador (formulario) frene el timer
\r
14 02/12/00: Se mejoran los graficos usando transparencias en los bitmaps y se da la opcion de presentar
\r
15 los graficos con transparencias (alta calidad) o no (a través del atributo aAltaCalidad y
\r
16 los métodos mSetAltaCalidad, mSetBajaCalidad y mCambiarCalidad).
\r
17 Se mejora la performance gracias a la nueva implementación de mDibujar, ya que los
\r
18 bitmas se cargan una sola vez en memoria (en un array aBitmaps) en vez de cargarse
\r
19 y liberarse cada vez que se actualiza la pantalla como sucedía anteriormente.
\r
20 Se implementa el soporte de visualización de un objeto volador lockeado (utilizando
\r
21 otra lista de bitmaps con los gráficos de los objetos lockeados, aBitmapsLockeados).
\r
22 08/12/00: Se agregan múltiples cámaras: Derecha, Izquierda, Arriba, Abajo, Atrás, Del Misil. Para hacerlo
\r
23 se agragega un array de camaras y un atributo que indica la camara actual. Tambien se agregan
\r
24 métodos para cambiar la cámara actual, etc.
\r
25 Se arregla el destructor que no liberaba todos los objetos.
\r
26 09/12/00: Se reemplaza la vista del misil por una mas general (vista del arma) que permite ver a traves de
\r
27 cualquier arma disparada. Se implementa correctamente esta vista.
\r
28 Se agrega una vista tipo mapa.
\r
35 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
37 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
50 tArrayBitmaps = <B>array</B> [OV_NAVEPESADA..OV_MISDIR] <B>of</B> TBitmap;
\r
51 tArrayCamaras = <B>array</B> [CAMARA_FRONTAL..CAMARA_ARMA] <B>of</B> cCamara;
\r
53 <I><FONT COLOR="Navy">{** Interpreta y dibuja los datos del modelo en un formulario}</FONT></I>
\r
54 cVista = <B>class</B><I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>( cObjeto )<I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
56 aFormulario: TCustomForm; <I><FONT COLOR="Navy">// Formulario en el cual dibuja </FONT></I>
\r
57 aRegion: HRgn; <I><FONT COLOR="Navy">// Región del formulario en la que dibuja </FONT></I>
\r
58 aCamara: tCamaras; <I><FONT COLOR="Navy">// Cámara seleccionada actualmente </FONT></I>
\r
59 aCamaras: tArrayCamaras; <I><FONT COLOR="Navy">// Multiples cámaras </FONT></I>
\r
60 aBitmaps: tArrayBitmaps; <I><FONT COLOR="Navy">// Lista con los bitmaps </FONT></I>
\r
61 aBitmapsLocked: tArrayBitmaps; <I><FONT COLOR="Navy">// Lista con los bitmaps </FONT></I>
\r
62 aAltaCalidad: boolean; <I><FONT COLOR="Navy">// Indica si las imagenes se ven con transparencias. </FONT></I>
\r
63 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
64 aListaProy: cLista; <I><FONT COLOR="Navy">// Lista de objetos proyectados (se guarda para poder </FONT></I>
\r
65 <I><FONT COLOR="Navy">// implementar el método mGetDebugInfo </FONT></I>
\r
66 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
68 <I><FONT COLOR="Navy">{** Obtiene el lado menor del formulario}</FONT></I>
\r
69 <B>function</B> <A HREF="#cVista.mGetFormLado">mGetFormLado</A>: integer;
\r
70 <I><FONT COLOR="Navy">{** Convierte el tamaño obtenido de la cámara a uno proporcional en píxeles}</FONT></I>
\r
71 <B>function</B> <A HREF="#cVista.mGetTam">mGetTam</A>( proy: tPProy ): integer;
\r
72 <I><FONT COLOR="Navy">{** Convierte la componente en x obtenida de la cámara a una proporcional en píxeles}</FONT></I>
\r
73 <B>function</B> <A HREF="#cVista.mGetX">mGetX</A>( proy: tPProy ): integer;
\r
74 <I><FONT COLOR="Navy">{** Convierte la componente en y obtenida de la cámara a una proporcional en píxeles}</FONT></I>
\r
75 <B>function</B> <A HREF="#cVista.mGetY">mGetY</A>( proy: tPProy ): integer;
\r
76 <I><FONT COLOR="Navy">{** Dibuja un ObjetoVolador}</FONT></I>
\r
77 <B>procedure</B> <A HREF="#cVista.mDibujarOV">mDibujarOV</A>( proy: tPProy );
\r
78 <I><FONT COLOR="Navy">{** Dibuja el ObjetoVolador lockeado por la nave propia}</FONT></I>
\r
79 <B>procedure</B> <A HREF="#cVista.mDibujarOVLockeado">mDibujarOVLockeado</A>( proy: tPProy );
\r
80 <I><FONT COLOR="Navy">{** Muestra un mensaje de game over}</FONT></I>
\r
81 <B>procedure</B> <A HREF="#cVista.mGameOver">mGameOver</A>;
\r
82 <I><FONT COLOR="Navy">{** Convierte un tipo tObjetosVoladores al nombre del archivo que guarda su bitmap}</FONT></I>
\r
83 <B>function</B> <A HREF="#cVista.mObjetoVoladorToFilename">mObjetoVoladorToFilename</A>( obj: tObjetosVoladores ): <B>string</B>;
\r
84 <I><FONT COLOR="Navy">{** Convierte un tipo tObjetosVoladores al nombre del archivo que guarda su bitmap lockeado}</FONT></I>
\r
85 <B>function</B> <A HREF="#cVista.mObjetoVoladorLockedToFilename">mObjetoVoladorLockedToFilename</A>( obj: tObjetosVoladores ): <B>string</B>;
\r
86 <I><FONT COLOR="Navy">{** Crea una cámara según el tipo}</FONT></I>
\r
87 <B>function</B> <A HREF="#cVista.mCrearCamara">mCrearCamara</A>( cam: tCamaras; ov: cObjetoVolador ): cCamara;
\r
89 <I><FONT COLOR="Navy">{** Constructor}</FONT></I>
\r
90 <B>constructor</B> create( formulario: TCustomForm; ov: cObjetoVolador; calidad: boolean = true );
\r
91 <I><FONT COLOR="Navy">{** Dibuja todos los Objetos Voladores que ve la cámara}</FONT></I>
\r
92 <B>procedure</B> <A HREF="#cVista.mDibujarVista">mDibujarVista</A>( oEspacio: cEspacio );
\r
93 <I><FONT COLOR="Navy">{** Define el formulario en donde dibujar}</FONT></I>
\r
94 <B>procedure</B> <A HREF="#cVista.mSetForm">mSetForm</A>( oForm: TCustomForm );
\r
95 <I><FONT COLOR="Navy">{** Setea gráficos de alta calidad}</FONT></I>
\r
96 <B>procedure</B> <A HREF="#cVista.mSetAltaCalidad">mSetAltaCalidad</A>;
\r
97 <I><FONT COLOR="Navy">{** Setea gráficos de baja calidad}</FONT></I>
\r
98 <B>procedure</B> <A HREF="#cVista.mSetBajaCalidad">mSetBajaCalidad</A>;
\r
99 <I><FONT COLOR="Navy">{** Invierte la calidad de los gráficos. Es decir, si estaban en baja los pone
\r
100 en alta y vice versa.}</FONT></I>
\r
101 <B>procedure</B> <A HREF="#cVista.mCambiarCalidad">mCambiarCalidad</A>;
\r
102 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
103 <I><FONT COLOR="Navy">{** Método heredado que devuelve un string con el estado del Objeto. Se utiliza para depurar
\r
104 y la información entregada depende del parámetro tDebugInfo.}</FONT></I>
\r
105 <B>function</B> <A HREF="#cVista.mGetDebugInfo">mGetDebugInfo</A>( debugLevel: tDebugInfo = DI_MINI ): <B>string</B>; <B>override</B>;
\r
106 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
107 <I><FONT COLOR="Navy">{** Permite realizar el cambio de camara}</FONT></I>
\r
108 <B>procedure</B> <A HREF="#cVista.mCambiarCamara">mCambiarCamara</A>( cam: tCamaras );
\r
109 <I><FONT COLOR="Navy">{** Cambia a la siguiente cámara}</FONT></I>
\r
110 <B>procedure</B> <A HREF="#cVista.mCamaraSiguiente">mCamaraSiguiente</A>;
\r
111 <I><FONT COLOR="Navy">{** Devuelve que camara esta activa}</FONT></I>
\r
112 <B>function</B> <A HREF="#cVista.mGetCamaraStr">mGetCamaraStr</A>: <B>string</B>;
\r
113 <I><FONT COLOR="Navy">{** Crea la cámara del arma}</FONT></I>
\r
114 <B>procedure</B> <A HREF="#cVista.mCrearCamaraDeArma">mCrearCamaraDeArma</A>( a: cArma );
\r
115 <I><FONT COLOR="Navy">{** Destructor}</FONT></I>
\r
116 <B>destructor</B> destroy; <B>override</B>;
\r
120 <B>implementation</B>
\r
125 <I><FONT COLOR="Navy">{ cVista }</FONT></I>
\r
127 <I><FONT COLOR="Navy">{** Constructor
\r
128 @param formulario Formulario en donde dibujará la vista
\r
129 @param ov Objeto Volador en el cual montar la cámara}</FONT></I>
\r
130 <B>constructor</B> cVista.create(formulario: TCustomForm; ov: cObjetoVolador; calidad: boolean);
\r
132 obj: tObjetosVoladores;
\r
136 <B>inherited</B> create;
\r
137 <B>for</B> cam := CAMARA_FRONTAL <B>to</B> pred( CAMARA_ARMA ) <B>do</B>
\r
138 aCamaras[cam] := mCrearCamara( cam, ov );
\r
139 aCamaras[CAMARA_ARMA] := <B>nil</B>;
\r
140 aCamara := CAMARA_FRONTAL;
\r
141 aAltaCalidad := calidad;
\r
142 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
143 aListaProy := <B>nil</B>;
\r
144 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
145 mSetForm( formulario );
\r
146 <I><FONT COLOR="Navy">// Carga gráficos Comunes </FONT></I>
\r
147 <B>for</B> obj := OV_NAVEPESADA <B>to</B> OV_MISDIR <B>do</B> <B>begin</B>
\r
148 bitmap := TBitmap.create;
\r
149 <B>with</B> bitmap <B>do</B> <B>begin</B>
\r
150 LoadFromFile( mObjetoVoladorToFilename( obj ) );
\r
151 TransparentColor := clBlack;
\r
152 TransparentMode := tmFixed;
\r
153 Transparent := aAltaCalidad;
\r
155 aBitmaps[obj] := bitmap;
\r
157 <I><FONT COLOR="Navy">// Carga gráficos Lockeados </FONT></I>
\r
158 <B>for</B> obj := OV_NAVEPESADA <B>to</B> OV_NAVEPROPIA <B>do</B> <B>begin</B>
\r
159 bitmap := TBitmap.create;
\r
160 <B>with</B> bitmap <B>do</B> <B>begin</B>
\r
161 LoadFromFile( mObjetoVoladorLockedToFilename( obj ) );
\r
162 TransparentColor := clBlack;
\r
163 TransparentMode := tmFixed;
\r
164 Transparent := aAltaCalidad;
\r
166 aBitmapsLocked[obj] := bitmap;
\r
170 <I><FONT COLOR="Navy">{** Destructor}</FONT></I>
\r
171 <B>destructor</B> cVista.destroy;
\r
173 obj: tObjetosVoladores;
\r
176 <B>for</B> cam := CAMARA_FRONTAL <B>to</B> CAMARA_ARMA <B>do</B>
\r
177 aCamaras[cam].free;
\r
178 <B>for</B> obj := OV_NAVEPESADA <B>to</B> OV_MISDIR <B>do</B> <B>begin</B>
\r
179 aBitmaps[obj].free;
\r
180 aBitmapsLocked[obj].free;
\r
182 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
184 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
187 <I><FONT COLOR="Navy">{** Dibuja un ObjetoVolador
\r
188 @param proy Puntero a un elemento del tipo tProyeccion con los datos de la proyeccion
\r
189 de un determinado objeto volador (proporcionado por la cámara)}</FONT></I>
\r
190 <B>procedure</B> <A NAME=cVista.mDibujarOV>cVista.mDibujarOV</A>(proy: tPProy);
\r
195 tam := mGetTam(proy);
\r
196 rect.Left := mGetX(proy);
\r
197 rect.top := mGetY(proy);
\r
198 rect.right := rect.left + tam;
\r
199 rect.bottom := rect.top + tam;
\r
200 <I><FONT COLOR="Navy">// crea una region de dibujo //solo bmp </FONT></I>
\r
201 <I><FONT COLOR="Navy">// asigna la region anterior </FONT></I>
\r
202 SelectClipRgn( aFormulario.canvas.handle, aRegion );
\r
203 <I><FONT COLOR="Navy">// dibuja el bmp entero entre los puntos de rect o rect1 </FONT></I>
\r
204 aFormulario.canvas.StretchDraw( rect, aBitmaps[proy^.oOV.mDibujar] );
\r
207 <I><FONT COLOR="Navy">{** Dibuja el ObjetoVolador lockeado por la nave propia
\r
208 @param proy Puntero a un elemento del tipo tProyeccion con los datos de la proyeccion
\r
209 de un determinado objeto volador (proporcionado por la cámara)}</FONT></I>
\r
210 <B>procedure</B> <A NAME=cVista.mDibujarOVLockeado>cVista.mDibujarOVLockeado</A>(proy: tPProy);
\r
215 tam := mGetTam(proy);
\r
216 rect.Left := mGetX(proy);
\r
217 rect.top := mGetY(proy);
\r
218 rect.right := rect.left + tam;
\r
219 rect.bottom := rect.top + tam;
\r
220 <I><FONT COLOR="Navy">// crea una region de dibujo //solo bmp </FONT></I>
\r
221 <I><FONT COLOR="Navy">// asigna la region anterior </FONT></I>
\r
222 SelectClipRgn( aFormulario.canvas.handle, aRegion );
\r
223 <I><FONT COLOR="Navy">// dibuja el bmp entero entre los puntos de rect </FONT></I>
\r
224 aFormulario.canvas.StretchDraw( rect, aBitmapsLocked[proy^.oOV.mDibujar] );
\r
227 <I><FONT COLOR="Navy">{** Dibuja todos los Objetos Voladores que ve la cámara
\r
228 @param oEspacio Espacio del cual obtener la lista de objetos a interpretar por la cámara
\r
229 para dibujarlos}</FONT></I>
\r
230 <B>procedure</B> <A NAME=cVista.mDibujarVista>cVista.mDibujarVista</A>( oEspacio: cEspacio );
\r
234 <I><FONT COLOR="Navy">{$IFNDEF DebugAlgoWars}</FONT></I>
\r
235 aListaProy: cLista;
\r
236 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
238 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
239 <I><FONT COLOR="Navy">// Libera la lista vieja </FONT></I>
\r
241 aListaProy := <B>nil</B>;
\r
242 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
243 <I><FONT COLOR="Navy">//mantiene el circulo negro </FONT></I>
\r
244 aFormulario.canvas.brush.Color := clblack;
\r
245 aFormulario.canvas.ellipse( 0, 0, mGetFormLado, mGetFormLado );
\r
246 <B>if</B> aCamaras[aCamara] = <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si es la camara es nil </FONT></I>
\r
247 mCamaraSiguiente; <I><FONT COLOR="Navy">// Selecciona la camara siguiente </FONT></I>
\r
248 <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>
\r
249 aListaProy := aCamaras[aCamara].mProcesar( oEspacio.mGetObjetos );
\r
250 <B>for</B> i := 0 <B>to</B> aListaProy.Count - 1 <B>do</B> <B>begin</B>
\r
251 pProy := aListaProy.items[i];
\r
252 <I><FONT COLOR="Navy">// Si el objeto volador lockeado por la nave propia es el actual... </FONT></I>
\r
253 <B>if</B> oEspacio.mGetNavePropia.mGetLockeado = pProy^.oOV <B>then</B>
\r
254 mDibujarOVLockeado( aListaProy.items[i] ) <I><FONT COLOR="Navy">// lo dibuja de una forma distinta </FONT></I>
\r
255 <B>else</B> <I><FONT COLOR="Navy">// si no... </FONT></I>
\r
256 mDibujarOV( aListaProy.items[i] ); <I><FONT COLOR="Navy">// lo dibuja de la forma normal </FONT></I>
\r
258 <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>
\r
259 on e: ENavePropiaDestruida <B>do</B> <B>begin</B>
\r
260 mGameOver; <I><FONT COLOR="Navy">// Muestra el mensaje de GAME OVER </FONT></I>
\r
261 <B>raise</B>; <I><FONT COLOR="Navy">// Propaga la excepcion </FONT></I>
\r
263 on e: ECameramanDestruido <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si fue destruido el cameraman </FONT></I>
\r
264 mCamaraSiguiente; <I><FONT COLOR="Navy">// pasa a la siguiente </FONT></I>
\r
269 <I><FONT COLOR="Navy">{** Obtiene el lado menor del formulario
\r
270 @return El alto o el ancho del formulario, dependiendo de cual sea menor}</FONT></I>
\r
271 <B>function</B> <A NAME=cVista.mGetFormLado>cVista.mGetFormLado</A>: integer;
\r
273 <B>if</B> aFormulario.ClientWidth > aFormulario.ClientHeight <B>then</B>
\r
274 result := aFormulario.ClientHeight
\r
276 result := aFormulario.ClientWidth;
\r
277 <I><FONT COLOR="Navy">//result:=409; </FONT></I>
\r
280 <I><FONT COLOR="Navy">{** Convierte el tamaño obtenido de la cámara a uno proporcional en píxeles
\r
281 @param proy Puntero a un elemento del tipo tProyeccion con los datos de la proyeccion
\r
282 de un determinado objeto volador (proporcionado por la cámara)
\r
283 @return Tamaño del objeto en píxeles (tamaño del lado del cuadrado que se usará para
\r
284 dibujar el bitmap)}</FONT></I>
\r
285 <B>function</B> <A NAME=cVista.mGetTam>cVista.mGetTam</A>(proy: tPProy): integer;
\r
287 <I><FONT COLOR="Navy">// Se calcula tomando un valor de la supuesta cabina de 1/2 metro, a partir de ahi es una </FONT></I>
\r
288 <I><FONT COLOR="Navy">// regla de 3 simple. </FONT></I>
\r
289 <I><FONT COLOR="Navy">// NOTA: como los objetos quedan demasiado grandes, en vez de tomarse 1/2 metro, se toma mas pequeña </FONT></I>
\r
290 <I><FONT COLOR="Navy">// La dimension se multiplica por 2 porque es el radio de la nave </FONT></I>
\r
291 <I><FONT COLOR="Navy">// TAM = tam * (dim * 2) * (lado / 2) / 25 (metros) = tam * dim * lado / 25 </FONT></I>
\r
292 result := round( proy^.tam * proy^.oOV.mGetDimension * mGetFormLado / 25 );
\r
295 <I><FONT COLOR="Navy">{** Convierte la componente en x obtenida de la cámara a una proporcional en píxeles
\r
296 @param proy Puntero a un elemento del tipo tProyeccion con los datos de la proyeccion
\r
297 de un determinado objeto volador (proporcionado por la cámara)
\r
298 @return Componente en X del objeto en píxeles (x de la esquina superior izquierdadel
\r
299 cuadrado que se usará para dibujar el bitmap)}</FONT></I>
\r
300 <B>function</B> <A NAME=cVista.mGetX>cVista.mGetX</A>(proy: tPProy): integer;
\r
302 <I><FONT COLOR="Navy">// Se calcula por medio de una regla de 3 simple teniendo en cuenta los tamaños maximos y se le </FONT></I>
\r
303 <I><FONT COLOR="Navy">// resta la mitad del tamaño porque se dibuja a partir de la esquina superior izquierda, no a </FONT></I>
\r
304 <I><FONT COLOR="Navy">// partir del centro como es en el modelo. </FONT></I>
\r
305 result := round( proy^.x * (mGetFormLado / 2) / aCamaras[aCamara].mGetRadioPantalla + mGetFormLado / 2 ) -
\r
306 mGetTam( proy ) <B>div</B> 2;
\r
309 <I><FONT COLOR="Navy">{** Convierte la componente en y obtenida de la cámara a una proporcional en píxeles
\r
310 @param proy Puntero a un elemento del tipo tProyeccion con los datos de la proyeccion
\r
311 de un determinado objeto volador (proporcionado por la cámara)
\r
312 @return Componente en Y del objeto en píxeles (y de la esquina superior izquierdadel
\r
313 cuadrado que se usará para dibujar el bitmap)}</FONT></I>
\r
314 <B>function</B> <A NAME=cVista.mGetY>cVista.mGetY</A>(proy: tPProy): integer;
\r
316 <I><FONT COLOR="Navy">// Se calcula por medio de una regla de 3 simple teniendo en cuenta los tamaños maximos y se le </FONT></I>
\r
317 <I><FONT COLOR="Navy">// resta la mitad del tamaño porque se dibuja a partir de la esquina superior izquierda, no a </FONT></I>
\r
318 <I><FONT COLOR="Navy">// partir del centro como es en el modelo. </FONT></I>
\r
319 result := round( proy^.y * (mGetFormLado / 2) / aCamaras[aCamara].mGetRadioPantalla + mGetFormLado / 2 ) -
\r
320 mGetTam( proy ) <B>div</B> 2;
\r
323 <I><FONT COLOR="Navy">{** Define el formulario en donde dibujar
\r
324 @param oForm Formulario en el cual dibujará la vista}</FONT></I>
\r
325 <B>procedure</B> <A NAME=cVista.mSetForm>cVista.mSetForm</A>(oForm: TCustomForm);
\r
327 aFormulario := oForm;
\r
328 aRegion := CreateEllipticRgn( 0, 0, mGetFormLado, mGetFormLado );
\r
331 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
332 <I><FONT COLOR="Navy">{** Devuelve el estado del objeto basandose en la cantidad de datos requeridos.
\r
333 @return Cadena de texto con el estado del Objeto.
\r
334 @param debugLevel Cantidad de información requerida}</FONT></I>
\r
335 <B>function</B> <A NAME=cVista.mGetDebugInfo>cVista.mGetDebugInfo</A>( debugLevel: tDebugInfo ): <B>string</B>;
\r
337 i: integer; <I><FONT COLOR="Navy">// contador </FONT></I>
\r
338 proy: tPProy; <I><FONT COLOR="Navy">// variable temporal para obtener info de la proyeccion </FONT></I>
\r
339 camInfo: <B>string</B>;
\r
341 result := 'Cámara: ' + #13 + #10;
\r
342 <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>
\r
343 camInfo := aCamaras[aCamara].mGetDebugInfo( debugLevel );
\r
344 <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>
\r
345 on e: ECameramanDestruido <B>do</B>
\r
346 camInfo := e.<B>Message</B>;
\r
348 result := result + camInfo;
\r
349 <I><FONT COLOR="Navy">// Genera el string con el estado del Espacio </FONT></I>
\r
350 <B>if</B> aListaProy <> <B>nil</B> <B>then</B> <B>begin</B>
\r
351 <B>for</B> i := 0 <B>to</B> aListaProy.Count - 1 <B>do</B> <B>begin</B>
\r
352 proy := aListaProy.Items[i];
\r
353 result := result + #13 + #10 +
\r
354 'ObjetoVolador Proyectado ' + IntToStr( i ) + ': ' + proy^.oOV.ClassName +
\r
355 ' | X: ' + IntToStr( mGetX( proy ) ) +
\r
356 ' | Y: ' + IntToStr( mGetY( proy ) ) +
\r
357 ' | Tam: ' + IntToStr( mGetTam( proy ) );
\r
358 <B>if</B> debugLevel > DI_NORMAL <B>then</B>
\r
359 result := result + #13 + #10 +
\r
360 'X (cámara): ' + FloatToStrF( proy^.x, ffNumber, 5, 5 ) +
\r
361 ' | Y (cámara): ' + FloatToStrF( proy^.y, ffNumber, 5, 5 ) +
\r
362 ' | Tam (cámara): ' + FloatToStrF( proy^.tam, ffNumber, 5, 5 );
\r
366 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
368 <I><FONT COLOR="Navy">{** Muestra un mensaje de game over}</FONT></I>
\r
369 <B>procedure</B> <A NAME=cVista.mGameOver>cVista.mGameOver</A>;
\r
376 rect.right := 300;
\r
377 rect.bottom := 250;
\r
378 <I><FONT COLOR="Navy">// crea una region de dibujo //solo bmp </FONT></I>
\r
379 <I><FONT COLOR="Navy">// asigna la region anterior </FONT></I>
\r
380 SelectClipRgn( aFormulario.canvas.handle, aRegion );
\r
381 <I><FONT COLOR="Navy">// dibuja el bmp entero entre los puntos de rect o rect1 </FONT></I>
\r
382 bitm := TBitMap.create;
\r
383 bitm.LoadFromFile( 'bitmaps/gameover.bmp' );
\r
384 aFormulario.canvas.StretchDraw( rect, bitm );
\r
385 <I><FONT COLOR="Navy">// canvas.stretchdraw(rect1,bitm); </FONT></I>
\r
389 <I><FONT COLOR="Navy">{** Convierte un tipo tObjetosVoladores al nombre del archivo que guarda su bitmap
\r
390 @param obj Tipo de objeto volador
\r
391 @return Nombre del archivo que almacena el bitmap que lo representa}</FONT></I>
\r
392 <B>function</B> <A NAME=cVista.mObjetoVoladorToFilename>cVista.mObjetoVoladorToFilename</A>(obj: tObjetosVoladores): <B>string</B>;
\r
394 <B>case</B> obj <B>of</B>
\r
395 OV_METEORITO: result := 'bitmaps/meteorito.bmp';
\r
396 OV_LASER: result := 'bitmaps/laser.bmp';
\r
397 OV_MISIL: result := 'bitmaps/misil.bmp';
\r
398 OV_MISDIR: result := 'bitmaps/misildirigido.bmp';
\r
399 OV_NAVEPROPIA: result := 'bitmaps/navepropia.bmp';
\r
400 OV_NAVEPESADA: result := 'bitmaps/navepesada.bmp';
\r
401 OV_NAVELIVIANA: result := 'bitmaps/naveliviana.bmp';
\r
402 OV_NAVEESPIA: result := 'bitmaps/naveespia.bmp';
\r
403 OV_NAVESUICIDA: result := 'bitmaps/navesuicida.bmp';
\r
404 <B>else</B> result := 'bitmaps/desconocido.bmp';
\r
408 <I><FONT COLOR="Navy">{** Convierte un tipo tObjetosVoladores al nombre del archivo que guarda su bitmap lockeado
\r
409 @param obj Tipo de objeto volador
\r
410 @return Nombre del archivo que almacena el bitmap que lo representa}</FONT></I>
\r
411 <B>function</B> <A NAME=cVista.mObjetoVoladorLockedToFilename>cVista.mObjetoVoladorLockedToFilename</A>(
\r
412 obj: tObjetosVoladores): <B>string</B>;
\r
414 <B>case</B> obj <B>of</B>
\r
415 OV_METEORITO: result := 'bitmaps/meteorito_l.bmp';
\r
416 OV_NAVEPROPIA: result := 'bitmaps/navepropia_l.bmp';
\r
417 OV_NAVEPESADA: result := 'bitmaps/navepesada_l.bmp';
\r
418 OV_NAVELIVIANA: result := 'bitmaps/naveliviana_l.bmp';
\r
419 OV_NAVEESPIA: result := 'bitmaps/naveespia_l.bmp';
\r
420 OV_NAVESUICIDA: result := 'bitmaps/navesuicida_l.bmp';
\r
421 <B>else</B> result := 'bitmaps/desconocido_l.bmp';
\r
425 <I><FONT COLOR="Navy">{** Setea gráficos de alta calidad}</FONT></I>
\r
426 <B>procedure</B> <A NAME=cVista.mSetAltaCalidad>cVista.mSetAltaCalidad</A>;
\r
428 <B>if</B> <B>not</B> aAltaCalidad <B>then</B> <I><FONT COLOR="Navy">// Si no estan seteados como de alta calidad... </FONT></I>
\r
432 <I><FONT COLOR="Navy">{** Setea gráficos de baja calidad}</FONT></I>
\r
433 <B>procedure</B> <A NAME=cVista.mSetBajaCalidad>cVista.mSetBajaCalidad</A>;
\r
435 <B>if</B> aAltaCalidad <B>then</B> <I><FONT COLOR="Navy">// Si no estan seteados como de alta calidad... </FONT></I>
\r
439 <I><FONT COLOR="Navy">{** Invierte la calidad de los gráficos. Es decir, si estaban en baja los pone
\r
440 en alta y vice versa.}</FONT></I>
\r
441 <B>procedure</B> <A NAME=cVista.mCambiarCalidad>cVista.mCambiarCalidad</A>;
\r
443 obj: tObjetosVoladores;
\r
445 aAltaCalidad := <B>not</B> aAltaCalidad;
\r
446 <B>for</B> obj := OV_NAVEPESADA <B>to</B> OV_MISDIR <B>do</B>
\r
447 aBitmaps[obj].Transparent := aAltaCalidad;
\r
448 <B>for</B> obj := OV_NAVEPESADA <B>to</B> OV_NAVEPROPIA <B>do</B>
\r
449 aBitmapsLocked[obj].Transparent := aAltaCalidad;
\r
452 <B>procedure</B> <A NAME=cVista.mCambiarCamara>cVista.mCambiarCamara</A>(cam : tCamaras);
\r
454 <B>if</B> aCamaras[cam] <> <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si esta creada es camara, la cambia </FONT></I>
\r
458 <B>function</B> <A NAME=cVista.mGetCamaraStr>cVista.mGetCamaraStr</A>: <B>string</B>;
\r
460 <B>case</B> aCamara <B>of</B>
\r
461 CAMARA_FRONTAL: result := 'Cámara Frontal';
\r
462 CAMARA_LATDER: result := 'Cámara Lateral Derecha';
\r
463 CAMARA_LATIZQ: result := 'Cámara Lateral Izquierda';
\r
464 CAMARA_TRASERA: result := 'Cámara Trasera';
\r
465 CAMARA_ARRIBA: result := 'Cámara Superior';
\r
466 CAMARA_ABAJO: result := 'Cámara Inferior';
\r
467 CAMARA_MAPA: result := 'Mapa del Escenario';
\r
468 CAMARA_ARMA: result := 'Cámara en el Arma';
\r
472 <I><FONT COLOR="Navy">{** Crea una cámara según el tipo
\r
473 @param cam Tipo de Cámara
\r
474 @param ov Portador de la cámara
\r
475 @return Nueva cámara creada}</FONT></I>
\r
476 <B>function</B> <A NAME=cVista.mCrearCamara>cVista.mCrearCamara</A>(cam: tCamaras; ov: cObjetoVolador): cCamara;
\r
478 <B>case</B> cam <B>of</B>
\r
479 CAMARA_FRONTAL: result := cCamaraFrontal.create( ov, 1 ); <I><FONT COLOR="Navy">// Se la crea con un poco mas de angulo que el comun </FONT></I>
\r
480 CAMARA_LATDER: result := cCamaraLatDer.create( ov, 1 ); <I><FONT COLOR="Navy">// Se la crea con un poco mas de angulo que el comun </FONT></I>
\r
481 CAMARA_LATIZQ: result := cCamaraLatIzq.create( ov, 1 ); <I><FONT COLOR="Navy">// Se la crea con un poco mas de angulo que el comun </FONT></I>
\r
482 CAMARA_TRASERA: result := cCamaraTrasera.create( ov, 1 ); <I><FONT COLOR="Navy">// Se la crea con un poco mas de angulo que el comun </FONT></I>
\r
483 CAMARA_ARRIBA: result := cCamaraArriba.create( ov, 1 ); <I><FONT COLOR="Navy">// Se la crea con un poco mas de angulo que el comun </FONT></I>
\r
484 CAMARA_ABAJO: result := cCamaraAbajo.create( ov, 1 ); <I><FONT COLOR="Navy">// Se la crea con un poco mas de angulo que el comun </FONT></I>
\r
485 CAMARA_MAPA: result := cCamaraMapa.create( ov, 1 ); <I><FONT COLOR="Navy">// Se la crea con un poco mas de angulo que el comun </FONT></I>
\r
486 CAMARA_ARMA: result := cCamaraFrontal.create( ov, 1 ); <I><FONT COLOR="Navy">// Se la crea con un poco mas de angulo que el comun </FONT></I>
\r
490 <I><FONT COLOR="Navy">{** Cambia a la siguiente cámara}</FONT></I>
\r
491 <B>procedure</B> <A NAME=cVista.mCamaraSiguiente>cVista.mCamaraSiguiente</A>;
\r
495 cam := succ( aCamara ); <I><FONT COLOR="Navy">// Pasa a la próxima </FONT></I>
\r
496 <B>if</B> cam > CAMARA_ARMA <B>then</B> <I><FONT COLOR="Navy">// Si se paso del ultimo ... </FONT></I>
\r
497 aCamara := CAMARA_FRONTAL <I><FONT COLOR="Navy">// Vuelve a la primera </FONT></I>
\r
499 <B>if</B> cam = CAMARA_ARMA <B>then</B> <I><FONT COLOR="Navy">// Si es la camara del misil... </FONT></I>
\r
500 <B>if</B> aCamaras[aCamara] = <B>nil</B> <B>then</B> <I><FONT COLOR="Navy">// Si no esta activa... </FONT></I>
\r
501 aCamara := CAMARA_FRONTAL <I><FONT COLOR="Navy">// Vuelve a la camara frontal </FONT></I>
\r
502 <B>else</B> <I><FONT COLOR="Navy">// si esta todo normal... </FONT></I>
\r
504 <B>else</B> <I><FONT COLOR="Navy">// si esta todo normal... </FONT></I>
\r
508 <I><FONT COLOR="Navy">{** Crea la cámara del arma
\r
509 @param ov Objeto Volador portador de la camara}</FONT></I>
\r
510 <B>procedure</B> <A NAME=cVista.mCrearCamaraDeArma>cVista.mCrearCamaraDeArma</A>(a: cArma);
\r
512 <B>if</B> a <> <B>nil</B> <B>then</B> <B>begin</B>
\r
513 <B>if</B> aCamaras[CAMARA_ARMA] <> <B>nil</B> <B>then</B>
\r
514 aCamaras[CAMARA_ARMA].free;
\r
515 aCamaras[CAMARA_ARMA] := mCrearCamara( CAMARA_ARMA, a );
\r