arduino-scratch

20 - Primer videojoc: Pong (1 jugador)

Finalitat

Anem a fer que un objecte es moga de manera autònoma per l’escenari. Per aconseguir-ho utilitzarem la categoria de blocs «Sensors» i crearem diversos programes per a un objecte.

Material

Imatge Descripció
Arduino Uno o compatible amb S4A i amb el firmware per S4A carregat.
Una protoboard
Cables de connexió
Un potenciòmetre

Una mica d’història

Fa molt de temps (1972-1976), els xiquets i els no tan xiquets es divertien amb la primera generació de consoles.

Eren aparells molt senzills d’usar, bastava amb connectar-los a la tele i posar-se a jugar. Els controls eren simplement rodes o clavilles distribuïdes normalment per la caixa de la pròpia consola.

Tenien un o diversos jocs gravats en la memòria i no podies comprar més jocs, perquè no tenien cap suport per a això. Però va haver-hi un joc que va sobreeixir per damunt de tots, el Pong, una espècie de tennis molt simplificat. No hi havia un sistema d’aquella primera generació que no incloguera un joc tipus Pong.

pantalla televisio pong

Quan en el nadal de 1975 Atari va comercialitzar la seua pròpia versió del Pong, es va convertir en un èxit immediat. Consistia bàsicament en una carcassa amb connexió a la televisió i dues rodes com a controls. Més tard van eixir versions que incloïen fins a 16 variacions d’aquest joc (que eren pràcticament el mateix) i infinitat de consoles clòniques.

Consola Atari pong

El que farem en aquesta lliçó és utilitzar el que hem aprés per a fer la nostra pròpia versió de Pong amb Arduino per a un jugador i de pas aprendre unes quantes coses pel camí. En la següent lliçó ho farem per a dos jugadors.

Tenint en compte que en el seu moment costava uns 100€ (que ara equivaldrien a quasi 400 €, el mateix que una consola d’última generació), supose que si li hagueres dit a algú en aquella època que un xiquet podria fabricar el seu propi Pong a casa com farem nosaltres, t’haguera mirat com a un marcià.

Versió de pong per a un jugador

La idea és simular una espècie de frontó, on controlarem una barra per a fer rebotar una pilota i impedir que se’ns escape. Com manejarem la barra amb un potenciòmetre, el muntatge serà el mateix que en la lliçó 11.

Esquema de muntatge

Dibuixem una barra, l’ajustem a la grandària que vulguem i la programem perquè es posicione i es moga de la mateixa manera que en la lliçó 11.

posicio-x-barra

Per a fer la pilota crearem un nou objecte, com ja sabem d’altres sessions, i li farem una disfressa. Per a programar el moviment de la pilota utilitzarem alguns blocs nous i una nova manera d’enfocar els nostres programes.

Divideix i guanyaràs

Fins ara, sempre que hem programat un objecte ho hem fet tot en una única seqüència d’instruccions. No obstant això, a mesura que els programes es compliquen pot ser-nos útil dividir-ho en diversos programes, de manera que cadascun d’ells ens solucione una part concreta del problema.

El primer que farem és posicionar la pilota d’en la part superior de l’escenari i en el centre de l’eix X. Utilitzarem el bloc “anar a x: … y: … “.

posicio-pilota-pong

En aquest mateix programa (funció) anem també a donar-li a la pilota la direcció inicial i la velocitat a la qual es mourà.

Per a donar-li la direcció inicial utilitzarem el bloc de “Moviments” “apunta en direcció”. Si despleguem les opcions d’aqueix bloc veurem al fet que direcció corresponen els valors.

direccio-objecte

direccio-pilota

La velocitat li la donarem amb el bloc de “Moviment” “moure … passos” i la creació d’una variable anomenada «velocitat». Jo li posaré perquè comence amb 4. Haurem de ficar-la en un bloc “per sempre” o només es mouria 4 passos una vegada i es pararia.

bloc-moure-4-passos

En aquesta mateixa funció farem que la pilota rebote en tocar les vores de l’escenari utilitzant el bloc de “Moviment” “rebotar si està tocant una vora”.

bloc-rebotar-vora

En una nova funció farem que la pilota rebote si toca la barra. Els blocs que s’utilitzen perquè interactuen els objectes en l’escenari estan en la categoria “Sensors”.

Començarem la funció amb el bloc de control de la bandera verda i el bloc “per sempre si …”.

Com a condició li posarem el bloc de “Sensors” “tocant …?”, i en el menú desplegable seleccionarem Barra, o el nom que hàgem posat a fi de la barra.

tocant-barra-pong

Farem que si pilota toca la barra rebote com si fora una paret, però li afegirem una mica d’aleatorietat per a evitar quedar-nos atrapats en situacions sense fi i afegir-li una mica de dificultat al joc.

Per a calcular el rebot utilitzarem el bloc “direcció”, que és una variable que guarda el valor de la direcció de moviment de l’objecte, en aquest cas la pilota.

Perquè actue com una paret, la direcció en rebotar ha de ser 180º (vertical cap avall) menys la direcció que portava abans.

Li afegirem una mica d’aleatorietat sumant-li un número a l’atzar entre -30 i 30.

bloc-atzar-rebot

Una vegada haja canviat de direcció, farem que es moga 4 passos una única vegada, per a evitar que detecte diversos tocs amb la barra en comptes d’un només.

bloc-moure-rebot

Ja tenim programat el funcionament dels objectes, però per a convertir-lo en un videojoc cal donar-li una mica d’emoció i sobretot fer que puguem perdre.

La manera més senzilla de detectar quan la pilota ens ha sobrepassat és pintar en el fons de l’escenari una ralla de qualsevol color que no siga el de les barres ni la pilota, i fer que si la pilota toca aqueix color s’acabe el joc.

escenari-ratlla-perdre

Crearem una nova funció per a detectar si la pilota toca la línia, i si la toca, detindre tots els programes.

Utilitzarem una estructura semblant a la qual detecta si toca la barra, però usant el bloc de “Sensors” “tocant el color …?”.

Si fem clic en el quadrat amb el color ens eixirà una icona de comptagotes. Seleccionem el color que volem en l’escenari, en aquest cas el roig de la línia que hem pintat i el color del quadre del bloc canviarà.

Dins de la condició col·loquem el bloc de “Control” “detindre tot”.

Bloc-detindre-tot

Afegint una mica de dificultat

Complicarem una mica més tant el programa com el videojoc en si, fent que la velocitat de la pilota vaja pujant a mesura que passa el temps i que quan perdem se’ns mostre el temps que hem aconseguit aguantar.

En comptes de donar-li una velocitat fixa a la pilota, li assignarem el valor d’una variable “velocitat” a la qual fixarem a l’inici un valor de 4 (o el que vulguem). Això ho inclourem en la funció en la qual fixàvem les condicions inicials.

moure-variable

Ara li afegirem una altra funció que faça que puge la velocitat dos passos cada deu segons. Utilitzarem el bloc de “Sensors” “cronòmetre”, que és una variable que guarda el temps que ha passat des de vam obrir o creem un projecte.

Farem que si el valor del “cronòmetre” és major que “límit” li sume dos a la variable “velocitat” i li sume 10 al valor del límit perquè torne a pujar la velocitat deu segons després.

funcio-aumenta-velocitat

Ja només ens queda programar que quan perdem se’ns mostre en pantalla quant temps hem aguantat.

En la funció en la qual detenim els programes, farem que abans pare la pilota i ens mostre el valor del cronòmetre. Utilitzarem el bloc de “Aparença” “digues … durant … segons”, li assignem el valor del cronòmetre i fem que el mostre durant 5 segons.

funcio-fi-pong

D’aquesta forma la programació de l’objecte Bola ens quedaria així.

funcions-pong

pong-un-programa

jugant-pong-1-jugador

Conceptes importants

Veure també