La clase pasada vimos como crear un Runner muy básico, de hecho vamos a usar el mismo codigo con unos cambios menores, porque técnicamente son el mismo juego.

    Les recomiendo leer el contenido de la CLASE 15 antes de seguir con ésta clase, ya que usaré el mismo código con unas pequeñas modificaciones.


Elementos Gráficos

Para éste ejemplo usaremos éstas 4 imágenes, reemplazaremos el personaje con el pájaro, al enemigo por el tubo (haremos 3 tubos por cada ciclo), un fondo quieto y un fondo que se mueve. Pueden descargar los 4 archivos que están a continuación en la misma carpeta (pajaro.pngfondoFlappy.pngfondoFlappyQuieto.png y tubos.png).



Elementos Comunes Para Empezar

    Podemos empezar con el mismo código que usamos en la clase anterior, de hecho a partir de la línea 13 como se ve en la imagen de la derecha, agregué unas variables que voy a necesitas.

  Cont, es para crear valores nuevos para los tubos.
tb1, tb2, y tb3, son la posición vertical donde aparecerá la imagen del tubo, por lo tanto, si en él está el valor 300, entonces el huevo va desde 300-90 hasta 300+90, si el pájaro no pasa entre esos dos valores está muerto.
   Puntos=0 es el contador de puntos, cuando pasa existosamente por un obstaculo, el sistema incrementa el valor y lo pone en pantalla.



Modificando el Bucle
(While..EndWHILE)

Como hice en la clase pasada, invertí los colores del editor, no se asusten es más fácil poder ver como funcionan con las imágenes.

Línea 20: Puse el CLG que antes estaba al final de la línea 46, ya que si el personaje muere no quiero que el fondo desaparezca. 
Línea 21: puse el salto en TRUE para que el personaje empiece volando (y no en picada).
Línea 23: he cambiado el tamaño de las imágenes, por ello el recorrido de las imágenes fondoFlappy (línea 27 y 28) que tienen un tamaño original de 500x250, pero en tamaño 2 ocupan 1000x500 en la ventana de gráficos.
Línea 32: Se eliminó la segunda parte de la condición que en el ejemplo del runner preguntaba si el personaje estaba saltando, o sea que sólo podría saltar si se presionaba la barra espaciadora y no estaba saltando... en éste caso saltará en el aire sólo presionando la tecla espacio haciendo doble saltos o triples para que el pájaro suba.
Línea 33: cambié el valor -2 por el valor -0.7 para que tenga menos energía el ascenso.




Pájaro

Para agregar el pájaro usaremos la misma linea que antes:
imgload 100, s , 2, velocidad, "Pajaro"

Se agrega el tercer valor para la rotación, en éste casi es VELOCIDAD, por lo tanto el pájaro rotará en base a la variación de la velocidad.



Crear Tubos
(Enemigos)

En la línea 29, o sea antes de detectar la tecla presionada (tecla=key) decidí calcular la posición de los tubos y dibujarlos.
 Para ésto usamos un IF, preguntando si la variable CONT vale CERO (0)

 if cont = 0 then 
          tubo1 = 480 * rand()
          tubo2 = 480 * rand()
          tubo3 = 480 * rand()
endif

cont = cont + 1

Si es cierto, entonces se llenan los valores de tubo1, tubo2, y tubo 3 con 480*rand() lo que nos devuelve un valore aleatorio que no sera mayor a 480. A continuación agregamos el código que usamos para mover MALO hacia la izquierda (la pelotita enojada) pero esta vez le restamos 25 para que se desplace a la izquierda a ésa velocidad.
cont=cont+1 incrementa para que éste codigo no se vuelva a ejecutar en cada ciclo.

malo = malo - 25 
tb1= malo + 200
tb2 = malo + 800
tb3 = malo + 1400
if malo < -1600 then : malo = 1200 : cont = 0 : endif
imgload tb1 , tubo1 , 1 , "tubos"
imgload tb2 , tubo2 , 1 , "tubos"

imgload tb3 , tubo3 , 1 , "tubos" 

Como se ve en éstas líneas, utilizo malo para crear tb1, tb2 y tb3 a distintas distancias, y un IF que controla que si pasan los 3 hacia la izquierda de la pantalla vuelvan a dibujarse afuera de la pantalla, a la derecha. 
CONT=0 indica que requerimos 3 nuevos valores para las posiciones verticales, entonces en el próximo ciclo se activará el if explicado arriba que crea los valores de tubo1, tubo2 y tubo3.
Finalmente, los 3 IMGLOAD que dibuja los tubos en pantalla, como se ve en el vídeo, no detecta la colisión con los tubos pero sí contra el piso.




Detectar los Tubos

Necesitamos saber si nuestro pájaro está chocando contra uno de los tubos, para ello usaremos un if para evaluar si el tubo llego al pajaro o sea si tb1=100
    Si es cierto vivo=false y el cico termina, sino sumara un punto.


En la imagen verde y roja, ilustré las zonas que detecta el segund IF interno, donde lo que está por encima de la abertura y por debajo de ella es técnicamente el área roja donde el personaje muere. La posición s del personaje (vertical) no puede ser menos a tubo1-90 ni mayor a tubo1+90, cualquier otro valor está dentro del área verde.

En verde, al centro, está el area por la cual el personaje puede pasar. 

Se repite el procedimiento para los o 2 tubos, abajo la estructura completa (juntando las líneas con " : " )

 if tb1= 100 then          #detecta el tubo 1
    if s< tubo1 - 90 or s> tubo1 + 90 then : vivo = false : else : puntos = puntos + 1 : endif
endif
if tb2= 100 then          #detecta el tubo 2
    if s< tubo2 - 90 or s> tubo2 + 90 then : vivo = false : else : puntos = puntos + 1 : endif
endif
if tb3= 100 then          #detecta el tubo 3
    if s< tubo3 - 90 or s> tubo3 + 90 then : vivo = false : else : puntos = puntos + 1 :endif

endif



Dibujar los puntos


El contador de puntos, decidí ponerlo en la parte duperior derecha, con una pequeña sombra roja. Lower(puntos) convierte el valor numérico a alfanumérico.

                 color darkred
        font "impact", 85, 25
        text 703 , 13 , lower(puntos)
                                    
                color orange
        font "impact", 85, 25
        text 700 , 10 , lower(puntos)



#CodigoCompleto del Flappy Basic
cls : clg : fastgraphics : graphsize 800,500
x = 500
y = 500
a = 0
bicho = 0
malo = 500
vivo = true
salto = false
tecla = 0
velocidad = -0.9 #velocidad del salto
aceleracion= 0.09 #la fuerza del salto
s=350 # Posición vertical del personaje
cont = 0
tb1 = 0
tb2 = 0
tb3 = 0 #posicion verical de los 3 tubos
puntos = 0
WHILE (vivo = true)
         CLG  
         salto = true
         a = a - 10
         if a <= -1000 then : a = 0 : endif
                                                                                                    #Dibuja los fondos
         imgload 400 , 250 , 4 , "fondoFlappyQuieto"
         color yellow : circle 550 , 160 , 100 #dibuja el Sol
         imgload (x+ a) , 250 , 2 , "fondoFlappy"
         imgload (x+a+1000) , 250 , 2 , "fondoFlappy"
                                                                                                    #Dibuja al pájaro
         imgload 100, s ,2, velocidad, "Pajaro"
         if cont = 0 then #inventa la altura de los 3 tubos
                  tubo1 = 480 * rand()
                  tubo2 = 480 * rand()
                  tubo3 = 480 * rand()
         endif
         cont = cont + 1
                                                                                                    #Dibujar los 3 tubos
         malo = malo - 25 #enemigo - Tubo
         tb1= malo + 200
         tb2 = malo + 800
         tb3 = malo + 1400
         if malo < -1600 then : malo = 1200 : cont = 0 : endif
         imgload tb1 , tubo1 , 1 , "tubos"
         imgload tb2 , tubo2 , 1 , "tubos"
         imgload tb3 , tubo3 , 1 , "tubos"
                                                                    # Si choco el tubo 1 muere, sino suma 1 punto
         if tb1= 100 then
            if s< tubo1 - 90 or s> tubo1 + 90 then : vivo = false : else : puntos = puntos + 1 :                   endif
         endif
                                                                    # Si choco el tubo 2 muere, sino suma 1 punto
         if tb2= 100 then
                  if s< tubo2 - 90 or s> tubo2 + 90 then : vivo = false : else : puntos = puntos + 1 : endif
         endif
                                                                    # Si choco el tubo 3 muere, sino suma 1 punto
         if tb3= 100 then
if s< tubo3 - 90 or s> tubo3 + 90 then : vivo = false : else : puntos = puntos + 1 :endif
         endif
                                                                    # Dibuja el contador de puntos, Arriba a la Derecha
         color darkred
         font "impact", 85, 25
         text 703 , 13 , lower(puntos)
         color orange
         font "impact", 85, 25
         text 700 , 10 , lower(puntos)
                                                                    # Detecta la tecla presionada y calcula la velocidad
         tecla = key
         if (tecla=32) then     # VUELA
                  salto = true
                  velocidad = -0.7
         endif
         if (salto = true) then
                  velocidad=velocidad + aceleracion
                  s = s + velocidad*20
         endif
         if s > 480 then                                         # Si toca el piso esta muerto
                  s = 480
                  velocidad = 0
                  salto = false
                  vivo = false
         endif
        refresh : pause 0.03
ENDWHILE
                                                                         # Dibuja la pantalla final
color darkred : font "impact" , 80,40 : text 63,153 , "PAJARO MUERTO"
color red : font "impact" , 80,40 : text 60,150 , "PAJARO MUERTO"
refresh