Hola bienvenidos a un capítulo nuevo de este máster en Arduino desde cero hasta nivel profesional y
ahora vamos a hacer nuestro propio videojuego.
La verdad que nos vamos a divertir pero además ya saben es solo una excusa para que aprendamos a dominar
esa chispa.
Es como les digo es como una especie de intuición de sexto sentido que empieza a crecer en nuestro interior
a medida que practicamos este sexto sentido que nos permite materializar esas ideas.
Por qué en un primer momento es fácil imaginar la pantalla de nuestro videojuego que tenga una pelotita
una barrita abajo que se mueve.
Eso fue lo que me pasó a mí.
Y después viene el problema cómo lo hago cómo resuelvo el cursor de abajo cómo resopló la pelotita qué
problema se me van presentando.
Esa intuición es la que vas a ir desarrollando y vas a ver que de un momento a otro no te vas a dar
cuenta se va a transformar como andar en bici.
Como los cambios del auto no estás pensando si pones primera segunda o tercera sale sola bueno qué contento
voy a estar cuando me enteré que llegaron a ese nivel.
Por cierto cuando terminemos esto del videojuego me encantaría ver sus versiones no dejen de subir fotos
compartirlas por todos lados está en mis redes sociales publicadas en algún lado creo que en mi perfil
vamos a compartir y a disfrutar de este videojuego a fondo.
Bueno lo primero que quiero mostrarles es cómo vamos a conectar todo el hardware para hacer nuestro
videojuego.
Entonces vamos a empezar por la pantalla.
Ya hemos conectado otra.
No tiene mayor dificultad.
SCL a cinco SDA a cuatro y cinco voltios a veces se vean que los estoy sacando de la proto Ghor que
a su vez está conectada a los 5 voltios del Arduino y Gene de a tierra o masa de Arduino.
Acuérdense siempre de verificar de que su display soporte 5 voltios
vamos con el potenciómetro que estoy haciendo estoy conectando la pata derecha del pote a positivo porque
yo quiero que su valor se incremente cuando los giro para la derecha.
Si no me funcionara al revés quedar invertido el sistema la pata izquierda A negativo y la central que
es la pata del cursor en la que voy a llevar a cero.
Luego tenemos la pata 2 por la que vamos a sacar señales acústicas entonces la conecto a un Bushehr
piezoeléctrico y el negativo del Bushehr directamente al negativo del Arduino como verán en las fotos
o videos que vamos a trabajar en la placa que yo me armé yo puse un LED acá en paralelo con su resistencia
de protección por supuesto porque quiero que cada vez que suena el Bushehr el led parpadee le dé un
lindo efecto.
Creen ustedes si lo ponen o no.
Y por último de El PIN 3 saco un pulsador y llevo su extremo opuesto a más listo no reviste mayor misterio.
Pregunta Por qué saca el pulsador del PIN 3 y no otro pin
solo saco del PIN 3.
Porque acá tengo interrupciones de hardware se acuerdan.
Entonces me va a ser útil para no tener que estar pensando si el pulsador está apretado o no directamente
cuando se pulsa disparó una interrupción.
Bueno vamos al código y empecemos a divertirnos.
Bueno paso obligado es que peguemos acá yo me traje ya del proyecto anterior.
Las librerías ya sabemos cómo instalarlas desde Arduino lo que hicimos es ir al programa Incluir librerías
gestionar librerías y la fuimos buscando.
De hecho esto es un clásico que me encuentre con un programa que me pasaron que está buenísimo seguramente
pero o librerías para instalar dos opciones ahogarme en un vaso de agua y no hacer nada porque tiene
librerías que no conozco o la opción que yo le recomiendo se fijan cuál es la librería en primer lugar
trato de compilar cómo hacerlo.
Bueno yo las tengo en la librería pero si no lo estuviera intento compilar me va a dar error porque
falta una librería.
Vamos entonces ahí sí miedo me vengo a las librerías al gestor de librerías y voy poniendo los nombres
a ver Freed que hay un montón porque es un fabricante de módulos Frith FX me está pidiendo.
Listo.
Ahí lo encontré en primer lugar le instalo.
No permitamos que un proyecto nos domine.
Acá los dueños somos nosotros.
Bueno entonces yo no voy a tener que instalarlas porque para el proyecto anterior cuando estuvimos haciendo
el sistema de control de temperaturas ya teníamos esto.
Paso 1 vamos a declarar el display Fruit se ve usando la librería que acabamos de instalar.
63 13:06 Display y teníamos que pasarle el pin de reset de nuestro Display.
Pero no estoy play.
Si vos tenés el mismo que tengo yo no tiene Ping de reset entonces para no desperdiciar un pin que no
vamos a usar le poníamos menos uno y listo.
Vamos a comentar esto.
Bueno logramos Display un problema menos si vamos
pasemos a declarar pines de nuestro hardware que tenemos tenemos el potencial potenciómetro entonces
se acuerdan que siempre Veidt para declarar los pines lo haces con Hint no pasa nada pero tenés que
ser consciente que andamos muy jugados con la memoria.
Y yo no quiero desperdiciar memoria nada.
Entonces a los pines Bullitt esta costumbre te dura para siempre mucho mejor.
Te voy a poner Pin y decir que es igual a dónde lo habíamos conectado.
Confirmamos esto es bueno tenerlo mano siempre y cuando lo conectamos a cero al central del potenciómetro
vuelve el código
A-cero listo Veidt.
Yo le llamo LED porque tengo un LED conectado.
Ustedes podrían poner Bushehr pero es lo mismo el LED y Bushehr de acá en más.
Es la misma cosa y lo tenemos en el PIN 2.
Y después tengo Bayt el botón que lo voy a llamar Botón Inicio juego lo tengo conectado en el PIN 3
que la interrupción dos y tres son interrupciones.
Pero me interesa sobretodo que el pulsador me quede sin interrupción para poder tomar acciones cuando
los apriete tenemos los pines declarados y pasamos al declarar las variables globales pero vamos a ir
declarando de a poco a medida que la vayamos necesitando y vayamos creando este este lío en el que nos
hemos metido así vamos a poner variables globales o sea variables que van a poder ser usadas dentro
de todo el programa usabas modificadas mostraba lo que haga falta.
Y como primera medida sé que voy a necesitar
Bullitt tamaño cursor bueno el cursor.
Yo le llamo la rayita que vamos a dibujar abajo a la que se mueve de izquierda a derecha.
Y acaba de declarar el tamaño con el que quiero que empiece el chiste que se me está ocurriendo es que
cada vez que lográs que la pelotita o el punto en realidad peguen el cursor para que se vaya poniendo
difícil el cursor se tiene que ir achicando.
Entonces este tamaño es del tamaño inicial a partir de que arranca tendría que achicarse ya.
Y otra cosa fundamental también va a ser un boite la posición de este curso
vamos a dejarlo en cero.
Por ahora vamos a ver si necesitamos que tenga otro bala Bueno con esto ya nos podemos ir arreglando
yo calculo que nos va a ser de utilidad después no pero ahora sí sería el punto en que arranquemos el
puerto sería el porqué vamos a necesitar ir viendo cómo funciona esto por dentro para que nos salga
bien si no va a ser como trabajar a ciegas.
Yo no sé si arrancaría ya el display.
La verdad es que yo una vez que estoy acá quiero probar vamos a probar que comportamiento tiene el botón
el potenciómetro que vamos y anda todo bien.
Entonces podría decir seria el punto 20 LNE y directamente Analog
a cero.
Probemos
que tengo el error acá que es
hoy tendría que estar bien.
Vamos a grabar
otro acá
y ahora sí está funcionando.
Bueno llevo toda la derecha casi bueno esto es típico del potenciómetro no le pidamos demasiado lo que
no me gusta mucho es que está medio ruidoso mi potenciómetro normal usando cables largos también veo
que cuando llego a cero no llega totalmente a 0 pero no se preocupen voy a cambiar de potenciómetro.
Por ahora le echo la culpa al mismo corte momentáneamente y ya volví cambié el potenciómetros no era
el potenciómetro y menos mal que se acuerdan cuando vimos las Protágoras que yo les dije hay proyectos
que mira las pero todas son muy lindas pero yo no estoy diciendo que este proyecto no sea para ProTour
pero es un clásico donde se empiezan a lucir las contras que tienen cuando desarrollamos un prototipo
todos llenos de cables y buenos eran los cabecitas de ajardinamiento todavía los sigo moviendo yo acá
estoy tocando con la mano moviendo un poco los cables y estos cables sitos como bien chinos que son
y es como que tienen fecha de vencimiento de la Plata también de tanto enchufar o desenchufar las chapas
los contactos se empiezan a abrir los cables empiezan a generar falso contacto entonces bueno hay que
ser precavidos y no saber de qué esto puede suceder.
Tenerlo presente todavía nos siguen llegando hasta el cero pero igual nos podemos arreglar perfectamente.
Bueno ya tenemos subsanado el problema de potenciómetro y vamos a seguir entonces vamos a empezar por
dibujar
el cursor inferior vamos a crear una función que se llama Arbey dibujo cursor y a la que le vamos a
pasar la posición a donde se va a dibujar esa posición.
Como se que va a ser un valor pequeño lo guardo en un bit y le voy a decir voz de posicionas y dentro
de esta función pos quiere decir la posición
entonces recordemos algo a lo ancho el display tiene 128 pixeles arranca del cero al 127 y de alto arranca
del cero hasta el 63 acá abajo.
Entonces a qué altura quiero el cursor.
Yo lo que quiero lo más abajo posible entonces lo vamos a hacer en la fila 63 que es la última fila
y quiero dibujar la línea que se mueve de izquierda a derecha y el ancho de esa línea es el tamaño que
habíamos determinado barrio.
Entonces bueno vamos a dibujar una línea en la posición 63
entonces vamos con display punto duro.
Era la función para dibujar líneas y le tengo que pasar dos coordenadas con esas coordenadas vamos a
hacer un punto donde empieza la línea y un punto a donde termina la línea.
Bueno supongamos vamos a hacer una línea que empieza
en la coordenada 0 63.
Eso quiere decir que empieza.
Cuál sería el punto 0 63.
Vamos en el eje X busco el punto cero.
Sería este de acá y ahora en el eje y tengo que buscar el 63.
Listo.
La 63 es un punto que está acá.
Y después lo a pasar otros dos puntos que es el otro extremo de la línea.
Bueno yo quiero una línea que tenga por ejemplo
toda la pantalla que sea que sea toda la pantalla de ancho.
Entonces voy a dibujar
127 63.
Cuál es el 127 63.
El punto que está acá.
Por qué 127.
Y bueno porque te tengo que irme hasta casa en la posición 127 pero en cuanto a altura me voy hasta
la 63 entonces ahí ya pasé las dos coordenadas los dos puntos que van a determinar este segmento o esta
línea.
Y por último le tengo que pasar el color.
Quiero que sea de color blanco bueno pero esto no lo va a dibujar.
Falta que diga display punto display
ya tenemos la función que nos va a dibujar una línea.
Por ahora no le estamos dando uso a la posición.
Simplemente quiero ver si funciona y dibujar la línea en el Z.
Nos falta una línea muy importante que es para iniciar nuestro Display y ponerle la dirección que ya
habíamos averiguado que tenía en un tutorial anterior.
Y después lo que yo hago es le pongo el display y punto Display y display punto Clear Display para que
no me aparezca ese splash screen que se llama que es esa presentación de Frith que sale la flor con
el logo no tengo ganas de momento de hacerle propaganda a la fruta entonces Display.
Otra vez falta todavía ya con eso estoy seguro que no va a salir la propaganda y por último me estaría
faltando dibujar cursores le tengo que pasar un número porque me lo está pidiendo pero no lo voy a usar
como para ver si se dibuja la línea.
Voy a grabar
bueno como ven sale inclinada la línea.
Bueno es porque yo acá queriendo o sin querer puse 60.
Entonces el segundo punto salía un poco más alto al aumentar este valor lo llevo más abajo en este caso
a la última fila del display y miren al tener los dos iguales me aseguro de que la línea va a salir
de derecha la voy a probar solo por placer vamos a ver si sale derecho de línea pero si
lo conseguimos tenemos la línea de derecha cómo haríamos entonces para que salga más pequeña
eso haría que salga la mitad de tamaño porque este es el primer punto.
Este es el segundo punto y el segundo punto lo estoy poniendo a mitad de camino.
Miren cómo sale
ven cómo puedo controlar entonces el tamaño de la línea estableciendo los puntos.
Es muy fácil si vamos avanzando Bono a ver cómo puedo transmitirles la idea.
Ahora necesito que la línea más allá de que tenga un tamaño determinado también se mueva.
Entonces vamos por partes cómo vamos a hacer para que tenga un tamaño determinado el tamaño nos lo iba
a dar este tamaño inicial tamaño cursor tamaño cursor.
Entonces vamos a hacer lo siguiente.
En definitiva el tamaño lo va a dar este segundo punto que es el punto que trazo más hacia la derecha.
Vamos a hacer así como es una convención que nosotros tomamos el tamaño lo voy a regular corriendo el
punto de la derecha nos ponemos de acuerdo vos y yo que lo vamos a hacer así que puede hacerse de otra
manera.
No me cabe la menor duda pero bueno vamos a probar este camino si nos va mal volvemos y arrancamos.
Por otro lado entonces yo biopoder de decir este es el punto que tengo que variar.
Este era el que teníamos en 127 para hacer una línea completa.
Lo bajamos a 63 para hacer una línea a mitad de camino.
Entonces directamente en vez de poner 63 voy a poner tamaño cursor tendría que salir una línea de Quanta
de 30 píxeles vamos a probar.
Ahora nos tiene que obedecer esta línea tiene que cambiar su posición a medida de que yo le doy diferentes
valores a este a esta variable pos entonces cómo hago.
Yo podría decir que con este punto voy a controlar la posición.
El punto inicial es el que voy a mover de un lado para el otro para que se corra toda la línea.
Entonces ya sabemos que los 63 van a quedar siempre fijos porque el 63 es lo que me regula la altura
de la línea en mi videjuego la línea queda siempre a la misma altura pero quizás en el tuyo esto pueda
cambiar.
Tenerlo en cuenta para más adelante entonces vamos a modificar este valor que es a donde empieza la
izquierda de la línea el punto inicial lo vamos a hacer que sea comandado por vos que es pos pos es
el valor que le vamos a pasar a esta función dibuja el cursor con la posición en qué posición quiero
que aparezca.
Entonces le estoy diciendo el cursor que aparezca a partir de la posición 23.
Entonces ya no voy a arrancar desde el inicio de la imagen ver la línea ya no va a arrancar desde acá
como arrancaba recién sino a contar 23 y recién a partir de acá va a salir.
Vamos a probarlo que puede pasar a ver a cargo
y como vemos tenemos al hijo menor de los cursores salió chiquito por qué salió así y lo que pasa es
que como yo corrí el punto inicial yo corrí el punto inicial de mi cursor pero el punto final lo dejé
en tamaño cursor no lo corrí.
Entonces se me achicó la línea el punto final de la línea el punto desde la derecha también lo voy a
tener que correr tanto como indique posición.
Cómo voy a hacer eso.
Es muy fácil es así.
Voy a decir que el punto final va a ser igual a la posición que yo esté ordenando más el tamaño de la
línea y ahí se nos va a quedar todo el tamaño completo.
Vamos a ver si anda ahora tendría que respetarnos y hacer siempre el cursor de 30 pixeles no importa
la posición que le pidamos.
Yo estoy grabando
ya aparece en la posición 23 el cursor del tamaño que le habíamos pedido probemos si le pedimos otra
posición de pedir en la posición 100.
Si se corre más hacia la derecha
bueno parece un lujo esto está funcionando y muy bien.
Sigamos adelante.
Ahora voy a querer algo que es la misión de este juego y es que cuando mueve el potenciómetro proporcionalmente
se desplace el cursor.
Entonces voy a crear acá dentro de una variable que le voy a llamar valor por ahora no sé si después
la renombrar
íbamos a capturar el valor del potenciómetro que en definitiva es lo que es lo que estoy mostrando acá
miren de cero a 1024 de cero a 1024.
El problema es que el display solo muestra valores que van o la posición horizontal muestra valores
que van del cero al 127 y yo acá tengo otra escala me voy a pasar de largo.
Quieren que lo probemos así de una vez como Anás.
Para mí esto va a andar muy mal.
Pero bueno hagamos Veidt valor va a ser igual a análogo Rib a cero hoy capturo el valor que tiene el
potenciómetro en ese momento y después lo que voy a hacer es irme a dibuja
Curb cursor y le voy a pasar valor.
Entonces le voy a pasar números de 0 a 1024.
Ya se imaginan el resultado.
Esto no va a funcionar porque puse una letra pero también no va a funcionar por otro motivo.
Mira
bueno tómalo todo mal.
En primer lugar veo que cuando empiezo a mover no sé qué estará dibujando pero cuando empiezo a mover
el potenciómetro de un lado a otro se empieza a dibujar una línea completa y se pierde el efecto del
cursor.
Bueno esto es porque cada vez que yo dibujo nuevo cursor tendría que borrar el cursor anterior y si
borro toda la pantalla para hacer esto no solamente tomaría mucho tiempo y se perdería ese efecto de
fluidez sino que me estaría borrando lo que quiero dibujar arriba en el videojuego así que cómo lo puedo
hacer.
Y se me ocurre hacerlo de una manera drástica pero efectiva iba a ser display punto de la outline estoy
dibujando una línea nueva antes de dibujar el cursor que necesito iba a ser una línea que va arrancar
abajo por supuesto siempre nivel 63 porque ahí dibujamos los cursores que va arrancar desde el cero
y si va ir hasta el 127
siempre nivel 63 porque la quiero abajo pero va a ser de color negro entonces estoy borrando cualquier
cosa que haya ahí.
Antes de dibujar nuestro cursor voy a grabar y ahora vamos a ver qué efecto tenemos
bueno cómo ven el cursor pasa varias veces por el Frente a la pantalla en un recorrido total del potenciómetro
y claro porque me estoy pasando de largo con 127 de Máximo ya recorrí todo el ancho de la pantalla.
Entonces vamos a tener que procesar un poco este valor y cómo lo vamos a hacer con nuestra consabida
función mapa y la razonemos juntos.
Ahora voy a decir qué valor debía cambiar el valor qué nombre le he puesto este nombre va a ser que
caiga en redundancia durante todo el video entonces le voy a poner valor cursor algo que me ayuda.
Bueno entonces vamos a decir qué valor cursor va a ser igual y vamos a usar Mapp para adaptar los valores
que vayamos obteniendo y lo primero que le pasaba es el valor fuente entonces eso sería valor cursor
el número de entrada.
Luego le tengo que pasar el menor valor que puede tener valor cursor que va a ser cero.
Cuál es el mayor que podría tener.
Va a ser 1024 de donde estoy sacando esto y de esta prueba.
Toda la derecha 1020.
Esto es culpa del pote y toda la izquierda cero a cero.
Ya les dije por los cables a ustedes les puede pasar lo mismo
luego que qué otra cosa tenía que pasar acá tengo que pasarle el valor menor que puedo obtener en la
pantalla.
Cuál es la posición menor que puedo tener en el cursor la posición cero que es cuando está acá y a la
izquierda y cuál es la posición máxima que puedo tener.
La 127 toda la derecha entonces algo que quiero hacer es este seria el print me lo voy a traer acá abajo
para poder husmear cómo se comporta valor cursores ya no me interesa más el valor del potenciómetro.
Es lógico que se vaya fuera de la pantalla el cursor.
Y es porque cuando yo le paso el valor 128 que es el valor máximo a dibujar a dibujo el cursor
128 es el valor que yo pongo acá en esta parte en el punto inicial de la raya.
Por ende cuando esto valga 128 el punto inicial de nuestro cursor va a estar completamente a la derecha.
Entonces el punto final a dónde va a dónde va a terminar y fuera de la pantalla.
Entonces este 127 como máximo que yo estoy diciéndole AMAP es mentira yo necesito que sea 127 menos
el tamaño del cursor.
Esa va a ser mi posición máxima para dejar siempre espacio a que se dibuje la parte derecha del cursor.
Entonces es tan simple como poner acá 127 menos tamaño cursor aunque ahora no se va de la pantalla.
Probemos lo
bueno.
Ahora si ya tenemos el cursor funcionando puede que necesite ajuste que necesite mejorarse.
Este código no es perfecto.
Puede ser que se esté haciendo un poquito eso.
Bueno ya ustedes lo van a ir calibrando y detectando esos ajustes finos.
Lo importante es que ya tenemos el cursor que responde a nuestras órdenes bueno vamos a dibujar lo que
yo llamo baula por decir un perdigón.
El puntito lo que ustedes quieran decir pero bueno yo por el momento lo voy a llamar baula.
Entonces yo voy a necesitar crear otras variables uno va a ser Vitta bala X por ahora igual a cero bait
bala y por ahora es igual a cero.
Qué van a hacer esto.
Estas variables van a ser las posiciones la coordenada x e y griega de El puntito bueno entonces me
voy a creer otra función que va a ser raid mueve la y va a recibir también una posición.
Entonces para probar esta función simplemente apeló a una función que usamos en otro capítulo que es
la de dibujar un punto y en vez de pasarle números para determinar las coordenadas ya el espacio las
variables que ahora están en cero entonces es que tengo cero y un cero y quiero dibujar entonces un
punto en estas coordenadas de color blanco.
Obviamente después display punto display para que se muestre si no no se va a mostrar nada y lo que
voy a hacer es llamarlo acá en el ZetaP una sola vez a la función dibujar no era mueve bala le de a
una posición ficticia no se lo voy a pasar por las dudas para que no me da error nomás y ahora no lo
vamos a usar.
Pruebo y tendría que ver un punto bien arriba a la izquierda.
Empecemos a adelantar un poco más rápido este tema.
Yo necesito que cada vez que la bala baje de posición en manera me estoy refiriendo al eje griega tenga
algún desplazamiento aleatorio para hacerle un poco de dificultad del juego.
Qué chiste tendría verbales que bajan de derecho.
Entonces acabo de apelar al siguiente recurso voy a decir que baula x o sea la posición horizontal de
nuestro punto o mejor dicho voy a decir que vale x es igual a x más y usar una función que es random.
La promesa Arduino es para generar números aleatorios.
Entonces a la posición que ya tenga porque estoy modificando la variable le voy a sumar un random un
número aleatorio que va a ir de entre los menos 5 hasta los más 5 o cercarlo y no va a elegir un número
al azar entre menos 5 y más 5 entonces esto va a hacer que tiemble esta bala cada vez que va bajando
pero puede suceder que varias veces seguidas toque suma suma suma suma y la posición de la bala se nos
vaya de la pantalla.
Yo no quiero es como yo no puedo controlar los números al azar puede ser que toquen 10 veces seguidas
suma y le sume 10 veces seguidas 5 5 5 y se termine yendo de la pantalla la bala entonces lo que quiero
decir es que si bala X es mayor que 127 que es el tamaño total de la pantalla que no le sigue sumando
que haga que valga X sea igual a 127 o sea jamás va a superar los 127.
Gracias a este IFF hasta que en algún momento tocará restã o un número negativo y ahí empezará a bajar.
Yo ya corté por lo sano pero también tendría que hacer lo mismo con lo opuesto que si empieza a restar
restar restar por cuestiones del azar yo quiero entonces que si X a ser menor a 1 se agarre a bala X
y la deje directamente en 0 listo ya puse límites nuestra bala nunca se va a ir ni al ni demasiado a
la izquierda para irse ni demasiado a la derecha cada vez que yo llame a este mueve bala ya vamos a
ver cada cuánto lo llamamos pero cada vez que yo llamo a esta función yo voy a querer que valga y griega
aumente porque quiero que la bala vaya bajando fila por fila.
Entonces esto es tan fácil como decir bala y más más que sería lo mismo que Valyria igual que la bala
griega más uno bueno lo hacemos en la versión corta y ahora se viene algo que es un rompecabezas
yo tengo que detectar
que es difícil pero vamos a razonar yo tengo que detectar cuando la bala llega al mismo nivel del cursor
y al mismo tiempo tengo que detectar si está tocando el cursor o si está cayendo en un lugar donde el
cursor no está bueno.
Cómo lo vamos a hacer esto es probable que sean de esas cosas que hay que pensar varias veces buscarle
la vuelta por qué es lo que me llevó a mí me tomó varios intentos que me saliera pero salió y lo hice
de la siguiente manera Fui razonando así si porque yo voy a querer detectar algo entonces ya se va unir
lo primero que quiero saber si la bala llegó a la última fila a la altura del cursor.
Si no llego ahí no tiene ningún sentido ponerme a ver si va a tocar o no va a tocar el cursor.
Entonces voy a decir si baula y griega es igual a 63.
Listo ya sé que llegó al fondo entonces al mismo tiempo quiero comprobar otra condición y para eso uso
el operador anda entonces ya van a tener que cumplirse dos condiciones ya uno no una sola para que este
ir se concrete entonces voy a decir que si la alegría es igual a 63
que la posición x de la bala es mayor es mayor.
Que posición.
Y acá ustedes me dirán pero cómo esperan este posición y esta posición ahora la posición de la bala
no esta posición es la posición del cursor.
Ya van a ver que a este mueve bala yo lo que le paso es la posición del cursor porque avala las posiciones
de la bala son bala X y bala y griega y éstas corren por si sola están en caída libre.
Esta va a ir aumentando y moviéndose solas.
Yo jamás voy a controlar el movimiento de la bala.
Para dónde va entonces a esta mueve bala.
A esta posición apelan a esta función.
Yo le estoy pasando la posición del cursor o sea el punto izquierdo del cursor.
Entonces sigamos haciendo nuestra condición si la posición x de la bala el punto horizontal con el que
dibujamos la bala es mayor que la posición.
Bueno ya sé que la bala está a la derecha del cursor de la primera posición del cursor en la posición
izquierdo del cursor digamos está la derecha bien ya es un paso y si al mismo tiempo
bala x es menor que la posición que tiene el cursor menos el tamaño del cursor quiere decir que la bala
está entremedio de los puntos que delimitan a nuestro cursor.
En definitiva acabo de hacer una función que lo corrobora es que si está a la misma altura y que si
al mismo tiempo la bala está a la derecha de la parte inicial del cursor y si la bala también está a
la izquierda de la parte final del cursor quiere decir que la bala está en el medio y acá tengo un error.
Es más está bueno si esto sucede voy a crear una nueva variable que se vuelva a llamar bait un traje
arrancar en cero por supuesto.
Entonces ya si esto sucede empiezo con los procedimientos de anotar un punto.
Para eso voy a hacer que el puntaje suba 1
también voy a ser que va a la y griega se vuelve a cero porque quiero que otra vez suba para generar
una nueva bala que la X.
Igual a 30.
Yo estoy poniendo 30 porque no quiero que la bala otra vez se genere desde una posición cero.
Vamos a ver como va saliendo esto también
bueno cómo hago para probar esto.
Me vio venir el loop y vio poner dibuja
cuando era mueve bala y esta función me pedía que le pase la posición en la que estaba el cursor.
Así que fácilmente le puedo decir Balor cursor porque ya lo tengo grabada la tengo grabada acá en la
posición actual del cursor para que se le tenía que pasar la posición del cursor y bueno para que la
función mueva la supiera si el impacto se produjo en el cursor o fuera del cursor vamos a ver así en
vivo.
Si esto sale que puede estar lleno de errores si lo que les dije Acá sigamos probando
mejor.
No les digo el error
no pasó nada sigamos
en algún lado escuché que la Coca Cola se descubrió por error.
Vieron cómo se está dibujando.
Si bien no vamos a aprovechar ese efecto que es como una rama que baja.
Bueno ya aprendimos algo.
Esto nos puede servir para otro videojuego o por otra modalidad del videojuego como deja esa estela
de puntos pero nosotros no queremos que nos pase eso.
No sólo queremos que el punto sea único.
Por qué sale esta estela de puntos.
Porque lo que pasa es que cuando dibujamos un nuevo pixel nos estamos borrando el píxel anterior vamos
a solucionar esto
y lo vamos a hacer de la siguiente manera.
Después de las variables baula X a la y griega voy a poner dos variables más que se van a llamar casi
igual solo que con el prefijo Ant anterior y ya que estamos acá como posición inicial yo quiero que
la bala cuando arranque arranque en el medio y no desde una izquierda o la derecha.
Entonces dejo las cuatro variables iguales 64 0 64 cero este cero que es la altura quiero que arranque
bien de arriba y acá en estas variables voy a guardar la posición anterior que tuvo la bala para borrarla
cuando dibujé la nueva posición.
Como vamos a hacer esto.
Después de dibujar la bala lo que voy a hacer acá es Ant bala x igual a bala X.
O sea ya guardo en la posición anterior la posición que dibujé en esta bala que acabo de dibujar y lo
mismo hago con Valey griega
listo ya tenemos las posiciones anteriores.
Entonces esto es tan fácil como hacer lo siguiente copio esto lo pego más arriba vi dibujar otro pixel
pero acá voy a poner
y acabamos con negro porque quiero borrar entonces yo cada vez que esté dibujando una nueva bala al
mismo tiempo voy a estar dibujando una bala de color negro en la posición a donde lleve dibujado la
bala anterior y esto va a ir borrando nuestras balas antiguas.
Vamos a ver si funciona y hoy lo tenemos.
Miren cómo va increíble sigamos adelante.
Bueno ya teníamos detectado cuando cuando acertamos en el blanco cuando la bala golpeaba el cursor ahora
quiero detectar cuando no golpee cuando pase de largo para restar vidas.
Entonces eso ya me está diciendo que necesitamos una variable nueva que se va a llamar vidas.
Y bueno acá vamos a poner con cuanto arranca nuestro nuestro juego cinco vidas eso después lo manejan
ustedes
me vuelvo a la función dibujaba.
Entonces puedo decir
que si esto sucede sumó un puntaje
pero también puedo decir que si bala griega tiene un valor mayor a 64 es porque se pasó de largo.
Total no me tengo que preocupar porque si pega en el cursor nunca va a superar los 64 por lo que estoy
haciendo es resetear bala y va a volver a arrancar pero si supera los 64 es porque esto no se cumplió.
O sea que la bala no acertó en el cursor.
O mejor dicho yo no acerté con el cursor en la bala.
Entonces lo primero que hago es vida menos menos.
Ya te estoy restando una vida por haber perdido
y nuevamente tengo que resetear la posición de la bala.
Entonces copio y pego por acá de todos modos nosotros no vamos a notar los efectos de estas de estas
funciones por qué no estamos dibujando nuestro tablero de puntajes entonces vamos a hacer eso ahora
vamos a crear una función que se va a llamar dibuja puntaje no va a recibir nada ni va a devolver nada
algo que no me quiero olvidar es lo siguiente cada vez que aumenta de puntaje para complicarte la vida
quiero que tamaño cursor se achique esto sigamos entonces acá no es tan simple como empezar a dibujar
caracteres o letras como lo hacíamos
ponía en la posición del cursor en cero cero para que arranque bien arriba.
Voy a aceptar esto de color blanco el carácter con fondo negro ninguna complicación de momento y con
esta línea lo que hago es imprimir arriba la letra P de puntaje.
Ustedes pongan la que le parezca más la conversión a string de El valor que tengamos almacenado en la
variable puntaje para que esto se vea que tenía que poner display punto Display.
También quiero que suene algo entonces pongo Tom Bueno yo le había puesto LED a mi Bushehr.
No quiero confundirlos.
Da lo mismo porque yo en el mismo Pin tengo conectado el LED y el Bushehr así se enciende el LED cada
vez que suena como me quedó buff.
Ahora el PIN 2 entonces Town es una función de Arduino que genera tonos es muy simple y le voy a pasar
el PIN te pide que le pases el PIN por donde tienes conectado el Bushehr.
Luego cuánto quieres que dure ese tono.
Bueno yo quiero que dure pero no en la duración sino en la frecuencia.
Quiero que sea de 5000 Gertz tono medio agudo y cuánto va a durar y quiero que sea corto entonces le
pongo 100 milisegundos.
Listo y tenemos un pequeño bip.
Cada vez que golpeé la balita en el cursor pero algo que también quiero hacer es que tenga niveles que
vayan salteando niveles.
Más adelante veremos si al superar un nivel hacemos que sea cada vez más rápido o lo que querramos complicar
o cambiar de juego eso ya queda a criterio de ustedes.
Entonces a mí me gustaría que cada 5 veces que acertase o sea cada 5 puntos que subamos a un nivel entonces
vamos a crear más variables.
Voy a necesitar una variable global llamada nivel que vamos a arrancar en el nivel cero y vamos a crear
otra variable que yo les voy a poner cuenta puntos y me vas a decir pero si llevamos una variable que
se llama puntaje no no. Este es un cuenta puntos porque yo quiero ir llevando aparte.
Cuántas veces sumamos 5 puntos 5 puntos para ir subiendo el nivel.
Este también va a arrancar en cero y miren cómo lo voy a usar cada vez que tenga un puntaje positivo
que se sume 1 a la variable puntaje
volvamos a acá a donde impacta la bala.
Acá estábamos acumulando lo que sucedía cada vez que impacte la bala sumamos 1 en el puntaje pero también
va a subir uno encuentra puntos más y viene a decir si cuenta puntos es mayor a 5 yo cada 5 puntos quiero
subir a un nivel 50 puntos es mayor a 5 nivel más más que me subo a un nivel y cuenta puntos lo vuelvo
a cero.
Listo para seguir contando de 5 a 5 y cada vez que cuenta 5 me sube el nivel.
Listo un problema un problema menos.
Sigamos con con el tema de mostrar nuestros
puntajes bueno dibuja un puntaje entonces sería propicio acá también
llamar cada vez que sumamos un punto por las dudas que hayamos subido de nivel.
Desde acá puedes llamar a dibuja
nivel y esa función y no la tenemos la tenemos que hacer entonces para hacerla.
Para hacerlo es muy fácil agarro dibujo puntaje y clonar la copia y le pego me pongo acá dibuja nivel
en vez de que aparezca una pe quiero que aparezca una n al nivel voy a poner más o menos a la mitad
de la pantalla.
Entonces el cursor en vez de en cero voy a hacer que arranque en el 58 que sería más o menos a la mitad
de la pantalla.
Y tendremos que hacerle un tonito diferente cuando cuando subimos de nivel porque la verdad que ya no
es algo más especial entonces puedo hacer esto.
Bueno estoy agregando delays entre los tonos para que suene distinto y voy a ir cambiando también la
frecuencia para que tenga alguna gracia el sonido que hace
cuatro tontitos simpáticos cada vez que subamos de nivel bueno va tomando color esto
quiero probar esto pero me doy cuenta de que acá
vamos a seguir Bonachea con pilas y kg. vamos a ver cómo se comporta esta entonces lo probaba y me doy
cuenta de que no aparece el tablero de puntos y eso es porque yo tengo que dibujarlo entonces cuando
lo quiero dibujar y cada vez que haya una modificación en el montaje.
Si no lo quieren entonces una vez que ya cambié el valor processes todo lo que tenía que procesar.
Lo último que hago es si llamarã dibuja puntaje para que aparezca en pantalla y se actualice logrado
y lo voy a probar.
Bueno me doy cuenta de dos problemas.
En primer lugar hasta que no golpeã por primera vez la bala en el cursor no se dibuja el puntaje el
tablero entonces lo que yo haría es una vez que se termine el ZetaP por única vez dibujar el puntaje.
De paso nos tendría que dibujar el nivel no no lo voy a dibujar porque el nivel sólo se dibuja si el
cuenta 5 con más de 5 así que también voy a forzar que dibuje el nivel.
Así ya de entrada cuando arranca ya veo las dos veo las dos cosas a ver.
Bueno ahora se hizo más evidente el problema solucionamos una de que ahora sí aparece el puntaje y el
nivel apenas empieza pero se nos empeora otras endefinitiva pero no sirve porque nos damos cuenta que
el problema está acá en algo de esto hace que esté fallando ya lo acabo de ver.
Tan simple como esto yo les digo que dibuje el nivel como yo copie esta función para colocarla y miren
lo que me pasó me olvidé dibuja nivel acá.
O sea que cuando se termina de ejecutar todo esto dibuja nivel volvió a llamar IGES es sonido molesto
que se repite se repite y queda encerrado en un bucle infinito.
Fuera de esto fuera a Dios vamos a ver si una
como vemos va queriendo andar tenemos algunos problemas pero es normal.
Así se cerraron los juegos quizás en mi caso sea un poco más marcado porque estoy haciendo dos cosas
estoy desarrollando un juego grabando un video haciendo un curso y bueno es más difícil y se es más
propenso a tener errores.
Estoy aumentando puntaje nivel en un tiempo por qué sucede eso.
Busquemos busquemos y se trata de lo mismo.
Como ya había clonado acaba nível me había quedado clonado esto me apure demasiado grabo.
Bueno ya cuenta bien el nivel cuenta viene el puntaje.
Sigamos ya en la recta final ya falta poco.
Bueno funciona bien bastante bien así que ahora podemos pisar un poco el acelerador y ya resolver los
últimos pasos.
Entonces lo que yo haría y voy a tratar de no equivocarme esta vez es copiar dibuja nivel.
Lo vamos a clonar aka y lo vamos a llamar dibuja vidas
esto lo voy a querer dibujar un poco más hacia la derecha le voy a poner 104.
A ver como sale si hace falta lo retomamos.
Esto igual le voy a poner la corta de vidas y acá no me voy a olvidar de poner vidas dice ella me dibuja
el valor de vidas hacia la de arriba a la derecha.
Genial.
Bueno los tonos porque estamos perdiendo una vida me gustaría hacerlo todos menos graves van a poner
500 600 al revés 1000.
Vamos a ver el efecto que se nos viene algo abajo 800 500 y después lo retocan hasta que quede bien
y sea acorde está todo fenómeno.
Pero necesito detectar cuando se me acaban las vidas así que aprovecho acá cada vez que le dibujo es
porque tengo una vida menos.
Ya vamos a ver cómo hacemos eso entonces mi decir si vidas es igual a cero.
O sea que se nos acabaron las vidas.
Hoy quiero que pierda entonces vamos a decir que vidas va a ser igual a 5.
Por qué hago esto y porque ya perdió.
Así que bueno vuelvo el valor de vidas a la normalidad para el próximo juego el nivel lo vuelvo a cero
para que vuelva arrancar también en cero.
El tamaño del cursor también lo voy a volver a 30 que era como arrancaba.
Por qué no se olviden de que el cursor se ha ido achicando cada vez que ganábamos un punto voy a borrar
la pantalla display punto Clear Display Mones acá.
Copio y pego de otra función.
Entonces lo tengo listo
pongo el cursor a esta altura es un poco más abajo que arranque viene a la izquierda un poco más abajo
y le pongo el game over.
Perdiste lo que podría ser también es hacer un tono
largo grave porque perdiste de 2500.
Si ustedes mejoran todos los tonos me lo pasan porque me gustaría tenerlo.
Voy a dejar un billete de mil milisegundos y acá aparece una variable nuevo nueva perdón que es la variable
Juliana a una variable que se va a llamar inicia juego.
Por eso quiero saber cuando esto tiene que arrancar o detenerse va.
Esta variable va a arrancar con el valor Fool's yo no quiero que arranque de entrada al juego solo cuando
yo le digo que tenga que arrancar
eso sería toda mi función por ahora si lo probamos lo que va a suceder es que el juego va a funcionar
y cuando perdamos va a aparecer mover y va a quedar ahí hasta que yo resetea la placa Arduino y a ver
si tengo algún error para ir corrigiendo.
Bien perfecto.
Más bien lo que sí estaría faltando acá es que esto no se va a llamar nunca.
Cuando lo tengo que digo que dibujara esto.
Esto lo voy a tener que dibujar cada vez que perdemos una vida donde perdimos las vidas acá acá estoy
perdiendo una vida.
Entonces listo después de perder una quiero dibujar esto dibuja vidas pero también quiero dibujar las
vidas en otro lado y es en esa etapa.
Apenas arrancamos porque si no no vamos a ver las vidas hasta que perdamos una dibuja vidas.
Listo.
Sigamos adelante.
Bueno quiero agregar algunos detalles que agregar esta línea de acá que se le llama una semilla aleatoria
y de que se trata de esto sucede que en realidad los números aleatorios que generamos para mover la
bala de nuestro videojuego no son tan aleatorios.
En definitiva luego de muchas repeticiones empieza a aparecer un patrón y vamos a ver que la bala siempre
hace los mismos movimientos.
Entonces es una manera de que sean más aleatorios y no se repitan los patrones es utilizando como número
inicial para la lógica de la generación de esta función Random lo que se llama como Random shift es
una semilla aleatoria y cómo podemos obtener realmente un valor al azar.
Lo vamos a sacar leyendo lo que tenga la entrada analógica a dos como no tenemos conectado nada y es
más yo les propongo que conecten un cable Arduino y lo dejen al aire como si fuera una antena.
Por ahí vamos a captar un montón de ruido y el ruido que es son un montón de valores al azar entonces
esto va a reforzar para que la bala tenga un movimiento más errático y no tan predecible.
Entonces agregó este random y algo que nos falta es esto está arrancando derechos no nos preguntilla
arranca el juego.
A mí me gustaría que tengamos la posibilidad de que arranque detenido entonces vamos a hacer lo siguiente
apenas caemos en el Loop.
Voy a decir si inicia el juego es igual a Fool's o sea que no hay que iniciar el juego
genera una espera de un segundo
y me voy a copiar de la función que hicimos el game over.
Igual nada más que lo que cambio es reemplazar Game Over por Press Start.
Luego voy a hacer un Weyl o sea mientras inicie el juego le voy a decir sea igual a efforts
delay 100.
Repasemos esto cómo va a funcionar cuando arranque por primera vez iniciar juego vale Fool's es igual
a falso.
Entonces va a caer acá adentro se va a ejecutar esto me va a mostrar en pantalla presione Start que
a futuro va a ser nuestro pulsador y luego va a volver a preguntar si mi juego es igual a fouls.
Obviamente que va a ser igual a Foals porque no lo hemos cambiado ni ningún momento te vas a dedicar
a ser que a esperar 100 milisegundos.
No va a hacer nada va a quedar trabado acá esperando hasta que esta variable cambie.
Entonces ahora tenemos que hacer que esta variable cambie cuando presionamos el botón.
Entonces vamos a declarar acá en el ZetaP la interrupción se acuerdan.
Ataud se interrumpe para agregar y dar de alta una interrupción por hardware que la teníamos el PIN
3 le pasamos el PIN.
De esta manera tenemos conectado el pulsador.
Cuando caiga la señal o sea cuando presionemos el botón.
Vamos a llamar a la función cambia estado inicial juega una función de nombre medio larga le puse pero
no importa.
Ustedes usen el nombre que quieran pero qué pasaba.
Necesitamos ponerle una resistencia Pulp porque eso estoy midiendo cuando caiga la señal.
Se acuerdan las resistencias Pulp dos opciones o le ponemos una resistencia física al pulsador.
No quiero hacer eso o activamos la resistencia pulp que ya tiene ese pin.
Cómo lo hacíamos de la siguiente manera Pimod botón Inicio juego.
Lo declaramos como entrada porque vamos a censar el valor digital del pulsador y le habilitamos la resistencia
Pulp para que cuando no esté apretado esté en alto y cuando presiona el botón se vaya a cero.
Y ahí es momento de llamar a esta función cambia estado inicial juego entonces esta compleja función.
Miren lo que a hacer esta función de complejo si no es la más difícil de sus vidas pegan el palo cambia
estado inicia juego.
Es una función que va a ser la difícil tarea de
inicia juego igual a truco.
Se acabó el reto.
Claro porque en cuanto presiona el botón Inicio el juego se pone en Tru y en qué estado estaba nuestro
videojuego.
Nuestro videojuego había quedado encerrado acá en el club en este Weyl me decía presioné estar y entró
en este guay y quedó encerrado acá hasta cuándo iba a estar encerrado hasta que inicie el juego dejará
de ser fouls cuando pase a Tru cuando va a suceder eso cuando presiona el botón y se ejecute esta función.
Vamos a ir probando para ver qué nos falta si está todo más o menos decente.
Bueno empecemos con los errores.
Primer error había desenchufado la placa porque me molestaban los sonidos que salían de el videojuego.
Subiendo.
Vamos a ver cómo se comporta
y las vidas no aparecieron cuando eso quería.
No sé por qué.
Veamos si me voy del ZetaP zETAp tendrían que haber aparecido ya vamos a solucionar esto no se preocupa
me preocupa por sobretodo el que no hayan aparecido y que no haya desaparecido esto.
Entonces es probable que cuando inicie el juego se ponga en Tru lo que tenga que hacer es borrar toda
la pantalla borrar toda la pantalla y todo esto que tengo acá que dibuja la vida que dibuja el nivel
y que dibuja el puntaje por primera vez.
Cuando recién arrancamos ya no lo quiero hacer en el ZetaP lo quiero hacer cuando arranque el juego
después de que pasó True entonces lo vamos a hacer ahí.
Veamos si cambian algo.
Tengo otro error.
Bueno esto se está repitiendo constantemente está mal esto nuevo acá cuando esto se ponga dentro vamos
a salir de este bucle y se va a ejecutar lo que venga a continuación.
Acá quería poner ahora veamos como sale esto.
Bueno aparentemente el último problema que nos queda es que después de aparecer Game Over
la pantalla se borra correctamente espera a los 3 segundos pero el juego por detrás sigue funcionando
y eso es muy fácil de arreglar lo que tenemos es que poner la variable inicia juego igual igual a Fool's.
Entonces después de perder en el Loop veamos qué va a pasar en el Loop va a caer nuevamente en esta
sección se va a borrar va a decir presiona estar y todo debería iniciarse de nuevo.
Bueno vamos a probarlo
bueno como ven ya funciona bastante bien es un punto de partida hay muchas cosas para mejorar y seguramente
para cambiar hasta acá llegamos con el videojuego.
No se olviden de compartir sus versiones me encantaría verlas.
Bueno gracias por acompañarme en este largo e intenso capítulo.
Nos vemos en la próxima clase.
Chau chau.