]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - doc/src-html/vista/Vista.pas
Se expanden keywords del svn.
[z.facultad/75.07/algowars.git] / doc / src-html / vista / Vista.pas
1 <HTML><HEAD>\r
2 <TITLE>File: vista.pas </TITLE>\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">\r
4 </HEAD>\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
7 <HR>\r
8 <PRE>\r
9 <I><FONT COLOR="Navy">{** Interpreta y dibuja los datos del modelo en un formulario<br> \r
10     <i>Cambios:</i> \r
11     <PRE> \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
29     </PRE>}</FONT></I> \r
30 <B>unit</B> Vista; \r
31  \r
32 <B>interface</B> \r
33  \r
34 <B>uses</B> \r
35   <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
36   Objeto, \r
37   <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
38   Windows, \r
39   SysUtils, \r
40   Graphics, \r
41   Forms, \r
42   Camara, \r
43   Tipos, \r
44   ObjetoVolador, \r
45   Espacio, \r
46   Armas, \r
47   Lista; \r
48  \r
49 <B>type</B> \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
52  \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
55     <B>private</B> \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
67     <B>protected</B> \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
88     <B>public</B> \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
117   <B>end</B>; \r
118  \r
119  \r
120 <B>implementation</B> \r
121  \r
122 <B>uses</B> \r
123   Camaras; \r
124  \r
125 <I><FONT COLOR="Navy">{ cVista }</FONT></I> \r
126  \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
131 <B>var</B> \r
132   obj:    tObjetosVoladores; \r
133   cam:    tCamaras; \r
134   bitmap: TBitmap; \r
135 <B>begin</B> \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
154     <B>end</B>; \r
155     aBitmaps[obj] := bitmap; \r
156   <B>end</B>; \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
165     <B>end</B>; \r
166     aBitmapsLocked[obj] := bitmap; \r
167   <B>end</B>; \r
168 <B>end</B>; \r
169  \r
170 <I><FONT COLOR="Navy">{** Destructor}</FONT></I> \r
171 <B>destructor</B> cVista.destroy; \r
172 <B>var</B> \r
173   obj: tObjetosVoladores; \r
174   cam: tCamaras; \r
175 <B>begin</B> \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
181   <B>end</B>; \r
182   <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
183   aListaProy.free; \r
184   <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
185 <B>end</B>; \r
186  \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
191 <B>var</B> \r
192   rect:   TRect; \r
193   tam:    integer; \r
194 <B>begin</B> \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
205 <B>end</B>; \r
206  \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
211 <B>var</B> \r
212   rect:    TRect; \r
213   tam:     integer; \r
214 <B>begin</B> \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
225 <B>end</B>; \r
226  \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
231 <B>var</B> \r
232   i:  integer; \r
233   pProy: tPProy; \r
234   <I><FONT COLOR="Navy">{$IFNDEF DebugAlgoWars}</FONT></I> \r
235   aListaProy: cLista; \r
236   <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
237 <B>begin</B> \r
238   <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I> \r
239   <I><FONT COLOR="Navy">// Libera la lista vieja </FONT></I>\r
240   aListaProy.free; \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
257     <B>end</B>; \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
262     <B>end</B>; \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
265     <B>end</B>; \r
266   <B>end</B>; \r
267 <B>end</B>; \r
268  \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
272 <B>begin</B> \r
273  <B>if</B> aFormulario.ClientWidth > aFormulario.ClientHeight <B>then</B> \r
274     result := aFormulario.ClientHeight \r
275   <B>else</B> \r
276     result := aFormulario.ClientWidth; \r
277     <I><FONT COLOR="Navy">//result:=409; </FONT></I>\r
278 <B>end</B>; \r
279  \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
286 <B>begin</B> \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
293 <B>end</B>; \r
294  \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
301 <B>begin</B> \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
307 <B>end</B>; \r
308  \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
315 <B>begin</B> \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
321 <B>end</B>; \r
322  \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
326 <B>begin</B> \r
327   aFormulario := oForm; \r
328   aRegion := CreateEllipticRgn( 0, 0, mGetFormLado, mGetFormLado ); \r
329 <B>end</B>; \r
330  \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
336 <B>var</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
340 <B>begin</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
347   <B>end</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
363     <B>end</B>; \r
364   <B>end</B>; \r
365 <B>end</B>; \r
366 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I> \r
367  \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
370 <B>var</B> \r
371   rect: TRect; \r
372   bitm: TBitMap; \r
373 <B>begin</B> \r
374   rect.Left   := 100; \r
375   rect.top    := 150; \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
386   bitm.free; \r
387 <B>end</B>; \r
388  \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
393 <B>begin</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
405   <B>end</B>; \r
406 <B>end</B>; \r
407  \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
413 <B>begin</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
422   <B>end</B>; \r
423 <B>end</B>; \r
424  \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
427 <B>begin</B> \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
429   mCambiarCalidad; \r
430 <B>end</B>; \r
431  \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
434 <B>begin</B> \r
435   <B>if</B> aAltaCalidad <B>then</B> <I><FONT COLOR="Navy">// Si no estan seteados como de alta calidad... </FONT></I>\r
436   mCambiarCalidad; \r
437 <B>end</B>; \r
438  \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
442 <B>var</B> \r
443   obj: tObjetosVoladores; \r
444 <B>begin</B> \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
450 <B>end</B>; \r
451  \r
452 <B>procedure</B> <A NAME=cVista.mCambiarCamara>cVista.mCambiarCamara</A>(cam : tCamaras); \r
453 <B>begin</B> \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
455     aCamara := cam; \r
456 <B>end</B>; \r
457  \r
458 <B>function</B> <A NAME=cVista.mGetCamaraStr>cVista.mGetCamaraStr</A>: <B>string</B>; \r
459 <B>begin</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
469   <B>end</B>; \r
470 <B>end</B>; \r
471  \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
477 <B>begin</B> \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
487   <B>end</B>; \r
488 <B>end</B>; \r
489  \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
492 <B>var</B> \r
493   cam: tCamaras; \r
494 <B>begin</B> \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
498   <B>else</B> \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
503         aCamara := cam \r
504     <B>else</B> <I><FONT COLOR="Navy">// si esta todo normal... </FONT></I>\r
505         aCamara := cam \r
506 <B>end</B>; \r
507  \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
511 <B>begin</B> \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
516   <B>end</B>; \r
517 <B>end</B>; \r
518  \r
519 <B>end</B>. \r
520 </PRE>\r
521 </BODY>\r
522 </HTML>\r