https://foro.gambas-es.org/viewtopic.php?f=1&t=6933
-----------------------------------
Shell
Viernes, 27 Abril 2018, 13:30

El Importante Uso De Banderas
-----------------------------------
Buenos días!

En el ejemplo del "generador de lluvia". Se presentan dos formas de resolver el mismo problema.
El autor del libro lo resuelve con el uso de banderas pero también hace referencia que se puede
resolver con el uso de "else".

Este es como se hace en Gambas, aprovechando el tiempo Unix.
La idea del problema es averiguar cuando una gota de lluvia pasa de la altura de la ventana para eliminarla del grupo
que forma "el chaparrón" o también si está sobre el personaje Mike. Cuando la gota de lluvia está sobre Mike
se debe almacenar ese momento de tiempo para luego compararlo con el momento que ya no le llueve encima. 
Van a ser muchas las gotas que les va a caer.

Esto es con el uso de banderas.
[code linenumbers=false syntax=gambas]
  i = 0 
  While i < unanube.chaparron.Length       
    unanube.chaparron[i].Mover()
    unanube.chaparron[i].dibujar()
    bandera = False 
    If unanube.chaparron[i].fueradepantalla() Then bandera = True   
    If unMike.TocadoPor(unanube.chaparron[i]) Then 
      bandera = True           
      unMike.tiempodeimpacto = ModuloTiempo.SegundosDesdeEpoch()
    Endif  
    If bandera 
      unanube.chaparron.Remove(i)
      i -= 1
    Endif
    i += 1   
  Wend
[/code]

Y ahora este mismo problema pero sin el uso de banderas.
Lo hice rápidamente.

[code linenumbers=false syntax=gambas]
 i = 0
  While i < unanube.chaparron.Length
    unanube.chaparron[i].Mover()
    unanube.chaparron[i].dibujar()
    If unanube.chaparron[i].fueradepantalla() Then
      unanube.chaparron.Remove(i)
      i -= 1
    Else If unMike.TocadoPor(unanube.chaparron[i]) Then
      unMike.tiempodeimpacto = ModuloTiempo.SegundosDesdeEpoch()
      unanube.chaparron.Remove(i)
      i -= 1      
    Endif
    i += 1
  Wend
[/code]

¿ Qué os parece sin banderas ?. Se repite código. En las dos condiciones se debe eliminar una gota de lluvia.
Y es lo que se repite de esta forma.

Ahora ya sabemos que puede ser más practico el uso de banderas cuando en nuestra condicional se van
a repetir las mismas instrucciones. En este caso son dos condiciones distintas que acaban haciendo lo mismo
eliminar los objetos gotas de lluvia del array chaparrón que pertenece a la nube. :-)

Saludos


-----------------------------------
Shell
Viernes, 27 Abril 2018, 13:53

Re: El Importante Uso De Banderas
-----------------------------------
Una cuestión que podría hacer:

En la condicional se observan dos opciones o condiciones.
- La gota de lluvia ha pasado de la ventana
- La gota de lluvia esta sobre Mike.

Bien. Cuando hablamos de crear una condicional múltiple.
¿ Debemos referirnos siempre a que algo cumpla una cosa u otra ó se puede considerar otro algo que cumpla otra condición ?.  :roll: 
En este caso:

[code linenumbers=false syntax=gambas]
If unanube.chaparron[i].fueradepantalla() Then
unanube.chaparron.Remove(i)
i -= 1
Else If unMike.TocadoPor(unanube.chaparron[i]) Then
....
[/code]

He mezclado la condición del array de la nube y luego en el Else If no hice referencia a otra condición de la misma  (unanube.chaparron[i]) 
y comprobé la condición del objeto Mike.

¿ Es eso una forma habitual de crear una condicional ?.

Saludos


