Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programación de Videojuegos
con APP Inventor
Introducción
Este segundo manual ha sido creado como una continuación del manual “Programación Básica con
App Inventor”. En este segundo manual vamos a aplicar todos los conocimientos que hemos
adquirido en la programación básica para el diseño de videojuegos y aplicaciones con sensores,
también vamos a necesitar utilizar nuevos elementos pertenecientes al bloque de dibujo y animación
como los lienzos y los spriteimage y del bloque de sensores como el acelerómetro o el reloj.
El juego consiste en elegir uno de los botones que nos muestra por pantalla, jugaremos contra la
máquina que hará su elección utilizando una función aleatoria que elegirá un número comprendido
entre 1 y 3, a cada número le asociaremos una opción: piedra, papel o tijera. Por último
comprobaremos cuál es la opción ganadora, la que nosotros hemos elegido o la que ha generado la
máquina y sumaremos un punto al ganador. También hemos incluido un botón para reiniciar los
marcadores del juego. En la imagen siguiente se muestra la interfaz de nuestro primer ejemplo:
Los elementos más importantes que hemos utilizado para diseñar la interfaz son los siguientes:
1. Epuntosmaquina: Etiqueta que muestra los puntos obtenidos por la máquina, aumentará de
valor cada vez que la máquina gane una partida.
2. Epuntosusuario: Etiqueta que muestra los puntos obtenidos por el usuario, aumentará de
valor cada vez que el usuario gane una partida.
3. Lienzo1: Lienzo que contiene en su interior las spriteimage con cada una de las opciones
(piedra, papel o tijera)
4. SI_piedra,SI_papel,SI_tijera: Sprite Image que muestran cada una de las opciones. El evento
clic sobre estas Sprite iniciará la partida.
5. Ieleccionusuario, Ieleccionmaquina: Imágenes que muestran la opción elegida por el usuario
y la opción generada por la máquina de forma aleatoria. Para compararlas y saber quién es el
ganador de la partida.
6. Disposicionhorizontal1: Hemos colocado esta disposición vacía para separar el botón de
reinicio del juego y mejorar la presentación en pantalla.
7. Breiniciar: Botón que permite reiniciar el juego, pone a cero las puntuaciones.
En la imagen siguiente se muestran los bloques que hacen que funcione la interfaz de usuario.
Como podemos ver necesitamos dos variables globales que van a almacenar la elección del usuario
y la elección de la máquina. Cuando el usuario hace clic sobre la Sprite image de la piedra damos a
la variable elijeusuario el valor 1, cuando elije el papel toma el valor 2 y cuando elija la tijera damos
Programación de Videojuegos con App Inventor Mª Dolores Molina
el valor 3. En este bloque también se asigna el fichero que muestra la imagen asociada a la elección
del usuario y se llama al procedimiento “Comprobar”.
El procedimiento comprobar genera un número aleatorio comprendido entre 1 y 3, este valor será
asociado a la elección de la máquina, y pasará a comprobar mediante tres bloques “si,sino”
anidados las tres posibles opciones de elección por parte de la máquina. Dentro de cada bloque
“si,sino” encontraremos otros tres anidados para comprobar todas las opciones asociadas a la
elección del usuario. En la siguiente imagen se muestra parte de este procedimiento:
Solo nos faltaría codificar las acciones asociadas al botón reiniciar juego que consisten en poner a
cero las etiquetas Epuntosusuario y Epuntosmaquina y poner a vacío las imágenes Ieleccionusuario
e Ieleccionmaquina.
Con este ejemplo sencillo apenas hemos utilizado las propiedades asociadas a los lienzos y las
Sprite, si nos fijamos podríamos haber planteado este ejemplo con botones en los que coloquemos
como fondo las imágenes de cada una de las opciones del juego.
Programación de Videojuegos con App Inventor Mª Dolores Molina
Para crear este segundo ejemplo vamos a desarrollar la interfaz de usuario que se muestra en la
imagen siguiente:
1 Este ejemplo ha sido desarrollado a partir del vídeo que se encuentra en el siguiente enlace:
https://www.youtube.com/watch?v=KHG5ERiTB3c. Gracias a azaotl por el vídeo y los png para realizar el juego.
Programación de Videojuegos con App Inventor Mª Dolores Molina
Relojmoneda: Sensor reloj que va a controlar el tiempo que tarda la imagen de la moneda en
cambiar de posición para generar la aplicación. Al igual que en reloj anterior estableceremos el
intervalo del temporizador a 100 msg.
Además de estos elementos también tendremos que subir al proyecto, utilizando la ventana de
medios, las seis imágenes que permiten crear la animación de Mario (Mario1.png, Mario2.png,
Mario3.png imágenes de movimiento hacia la derecha, Mario4.png, Mario5.png, Mario6.png
imágenes de movimiento hacia la izquierda). Posteriormente en los bloques asociaremos los
nombres de estos seis ficheros a una lista que nos permitirá crear la animación del personaje.
Los bloques que necesitamos para hacer que nuestro juego funcione comienzan colocando las sprite
dentro del lienzo. Tenemos que indicar que para posicionar un elemento en un lienzo se utiliza un
eje de coordenadas cartesiano cuyo punto de origen (0,0) es la esquina superior izquierda del lienzo,
de forma que para mover una sprite hacia la derecha daremos valores positivos en el eje horizontal,
la coordenada x del sistema cartesiano, para mover la sprite hacia abajo tendremos que darle valores
positivos a la coordenada y del sistema cartesiano. La imagen siguiente muestra como se realiza la
ubicación de los elementos en el sistema cartesiano que se establece para trabajar con las imágenes
dentro de un lienzo.
Aunque en la imagen hemos mostrado posiciones con valores absolutos, es decir, le hemos dado
directamente valores a la coordenada x y a la coordenada y cuando comencemos a programar
nuestros bloques vamos a utilizar posiciones relativas, que van a venir dadas en función de la altura
y la anchura del lienzo. Esta forma de programar utilizando posiciones relativas nos va a segurar
que nuestro juego se va a ver bien independientemente del tamaño de pantalla que tenga el
dispositivo que estemos utilizando. La imagen siguiente muestra los bloques que hemos utilizado
para posicionar y establecer el tamaño del lienzo y los sprite que vamos a utilizar en nuestro juego.
Programación de Videojuegos con App Inventor Mª Dolores Molina
Solo los falta programar el funcionamiento de la moneda, los bloques necesarios se muestran en la
imagen siguiente:
Programación de Videojuegos con App Inventor Mª Dolores Molina
El sensor Relojmoneda está siempre activo y se dispara cada décima de segundo, en este bloque lo
que hacemos es aumentar la posición de la moneda en el eje vertical, el eje y, en 10. Cuando el
valor de y es mayor que la posición en y de la plataforma menos la altura de la moneda, es decir,
cuando la parte inferior de la moneda toca la plataforma llamamos al procedimiento
reiniciamoneda que coloca la moneda de nuevo en la parte superior de la pantalla, lo describiremos
con más detalle mas adelante.
El bloque Simoneda.EncolisionCon comprueba si la moneda está tocando a Mario con lo que se
aumentará en 10 el valor de la variable puntos y llama al procedimiento reiniciamoneda, si la
variable puntos supera el valor de 100 la partida termina y para ello paramos la animación de la
moneda y desactivamos los botones que nos permiten mover a Mario, de forma que los únicos
botones que nos quedan activos son los de salir del juego y reiniciar la partida.
Los dos bloques siguientes muestran el contenido del procedimiento reiniciamoneda que genera
una posición aleatoria para el valor en el eje horizontal de la x para la moneda, así conseguimos que
cuando la moneda se reinicie se mueva hacia la derecha o hacia la izquierda, también se muestran
los bloques asociados al evento Cuando.Breiniciar.Clic , botón que reinicia la partida y cuyo
contenido no necesita una explicación adicional.
Diseño: Los elementos que necesitamos añadir a nuestro proyecto se muestran en la siguiente
imagen.
2 Este ejemplo es una traducción incluido en los manuales de App Inventor que se encuentra en la siguiente
dirección: https://appinventor.mit.edu/explore/ai2/molemash-2
Programación de Videojuegos con App Inventor Mª Dolores Molina
Una vez que hemos añadido todos los componentes deberemos realizar los siguientes cambios en
sus propiedades:
Elemento Cambios
GameCanvas Cambia la propiedad ColorDeFondo a Verde. Cambia las propiedades Alto
y Ancho a 320px.
Hole1 Cambia X a 20 e Y a 60. (agujero de la esquina superior izquierda)
Hole2 Cambia X a 130 e Y a 60. (agujero central superior)
Hole3 Cambia X a 240 e Y a 60. (agujero de la esquina superior derecha)
Hole4 Cambia X a 75 e Y a 140. (agujero de la esquina inferior izquierda)
Hole5 Cambia X a 185 e Y a 140. (agujero de la esquina inferior derecha)
Mole Cambia la propiedad “Imagen” a topo.png. Cambia la propiedad “Z” a 2
para que el topo se muestre siempre el primero en la pila de elementos que
vemos en pantalla, ya que el resto de elementos tienen como valor por
defecto la propiedad Z con el valor 1.
ScoreTextLabel Cambia la propiedad “Texto” al valor “Puntuación:”
ScoreTextValue Cambia la propiedad “Texto” al valor “0”
Una vez hemos añadido todos los elementos necesarios para la creación de nuestro proyecto y
hemos modificado sus propiedades desde la pantalla de diseño, tenemos que modificar su
comportamiento desde el editor de bloques.
Bloques: En este apartado vamos a explicar cada una de la funciones que vamos a añadir desde el
editor de bloques.
1. Creamos la variable global holes de tipo lista. Esta variable va a almacenar el estado,
ocupado o libre, de cada una de las imágenes que forman los agujeros del juego.
2. Cuando la aplicación comience su ejecución:
a) Inicializar la lista de agujeros a valor vacío, es decir, ningún agujero estará ocupado por
el topo.
b) Establecer la propiedad “Imagen” a agujero.png para cada SpriteImage correspondiente
a los valores Hole1, Hole2, … , Hole5.
c) Llamar a la función MoveMole que vamos a crear a continuación.
4. Hacemos que el reloj “Moleclock” llame a la función MoveMole siempre que no haya
acabado el tiempo de juego. (a cada segundo).
En las siguientes imágenes podemos ver la estructura de todos los bloques que componen el
programa:
1. Variable global holes de tipo lista. La creamos con valor vacío y le asignaremos como
elementos cada uno de los agujeros del campo de juego cuando mostremos la pantalla
principal del programa.
3. Control del topo: Necesitamos diseñar tres procedimientos que realicen las siguientes
acciones
a) Mover el topo: El bloque de contenido asociado a esta acción realiza a su vez las
siguientes tareas:
• Elige aleatoriamente un agujero de la lista
• Muestra la imagen del topo en el agujero seleccionado.
b) Control del tiempo: Este bloque llama al procedimiento anterior cada vez que varíe el
contador del tiempo
Parámetro yAccel: Corresponde con el valor de cambio de aceleración en el eje Y, tal y como
hemos explicado anteriormente, si el dispositivo se inclina hacia arriba devuelve valores positivos y
nosotros sumaremos los valores devueltos para que la posición en y de la pelota vaya aumentando y
se mueva hacia abajo de la pantalla, al contrario si inclinamos el dispositivo hacia abajo devuelve
valores negativos y al sumarlo hará que disminuya el valor de la posición en y de la pelota
desplazándose hacia abajo.
Parámetro xAccel: Corresponde con el valor de cambio en la aceleración en el eje X, que como
hemos explicado anteriormente, si el dispositivo se inclina hacia la izquierda devuelve valores
positivos y nosotros lo restamos para que el valor de la coordenada en x de la pelota disminuya, al
contrario si inclinamos el dispositivo hacia la derecha devuelve valores negativos y al restarlo hará
que aumente el valor de la posición en x de la pelota.
Solo nos faltan programar el choque de la pelota con los obstáculos, tal y como se muestra en la
imagen siguiente:
Cuando la pelota colisiona con uno de los obstáculos
que hemos colocado en pantalla se comprueba si está
en la lista de los obstáculos verticales u horizontales,
para bloquear la coordenada correspondiente y que así
nuestra pelota no pase por encima, además se avisa al
usuario activando la vibración del dispositivo.
Cuando la pelota deja de estar en contacto con uno de los obstáculos se liberan las variables que
permiten mover las coordenadas de la pelota.
TextoAVoz1: Componente que lee una cadena de caracteres que le pasamos como parámetro.
Los bloques que necesitamos para programar este ejemplo se muestran en la imagen siguiente:
Cuando.Screen1.Inicializar: Añadimos un
bloque que lee un texto que nos indica que el
programa está abierto pero el sensor está
desactivado.
Cuando.S_Proximidad.ProximityChanged: Este
bloque se ejecuta en forma de bucle cada vez que
se detecta un cambio en valor del sensor de proximimidad. En este caso cuando el sensor devuelve
un valor menor o igual que cero llama a un bloque TextoAVoz que lee un texto que nos indica que
se ha detectado un obstáculo.
Bingles: Botón que llama al traductor con la cadena reconocida como entrada y devuelve el texto
traducido al inglés como salida.
Bfrances: Botón que llama al traductor con la cadena reconocida como entrada y devuelve el texto
traducido al francés como salida.
Etraducido: Etiqueta que muestra el valor devuelto por el traductor.
Traductor: Este elemento permite invocar los servicios del traductor Yandex. Recibe una cadena
como entrada y devuelve una cadena traducida como salida.
TextoaVoz: Lee una cadena de texto.
ReconocimientodeVoz: Realiza un reconocimiento de voz, es decir, graba un audio y lo convierte a
una cadena de caracteres.
Los bloques necesarios para programar este ejemplo se muestra en la imagen siguiente:
etiqueta Enumero para que se visualice en pantalla y podremos el número de teléfono al valor
reconocido. Si se ha producido un error se informa al usuario.
Cuando_Bllamar.Clic: Realizamos la llamada de teléfono al valor que habíamos asignado en el
bloque anterior.
Cuando_Llamadatelefono.PhoneCallEnded: Este bloque se ejecuta cuando termina la llamada de
teléfono, en este caso ponemos la etiqueta que almacena al número reconocido a blanco, para dejar
la pantalla dispuesta para otra nueva llamada.
mensaje de error al usuario. Si pulsamos nuevo usuario modificará los datos de usuario y contraseña
almacenados en el fichero por los nuevos valores que hayamos introducido.
Los elementos que necesitamos para la interfaz se muestran en la imagen siguiente:
Eusuario: Etiqueta que indica
dónde se almacena el nombre
de usuario.
Tusuario: Campo de texto que
va a almacenar el nombre del
usuario.
Econtraseña: Etiqueta que
indica dónde se almacena la
contraseña.
Tcontraseña: Campo de
contraseña, cuando escribimos
sobre él se muestran punto en
lugar de los caracteres que
hemos pulsado.
BotonInicio: Cuando pulsemos este botón se accede al fichero para comprobar el usuario y la
contraseña que hemos introducido.
BotonNuevo: Cuando pulsemos este botón se modificarán los datos del fichero con los datos que
hemos introducido.
Eerror: Etiqueta que muestra el mensaje de error en caso que el usuario y la contraseña no sean las
mismas que las que hemos almacenado en nuestro fichero.
Fusuario: Componente no visible que incluye en el programa los bloques necesarios para trabajar
con ficheros.
Programación de Videojuegos con App Inventor Mª Dolores Molina
Los bloques necesarios para programar este ejemplo se muestran en la imagen siguiente:
Ftexto: Es una variable global de tipo cadena que va a almacenar el nombre del fichero que vamos
a utilizar en nuestra aplicación.
Cuando_Botoninicio.Clic: Cuando pulsamos este botón accedemos al fichero para leer.
Cuando_Fusuario.Obtuvotexto: Este evento se ejecuta después de realizar una operación de lectura
sobre el fichero, la cadena leída se encuentra en la variable texto. Unimos en una sola cadena el
usuario y la contraseña ya que la hemos almacenado en una sola línea dentro del fichero.
Comprobamos que el texto introducido es el mismo que el que hemos leído en el fichero, si es así se
cierra la aplicación en caso contrario se avisa con un mensaje al usuario.
Cuando_Botonnuevo.Clic: Cuando pulsamos este botón se unen en una sola cadena el nombre de
usuario y la contraseña y se llama a la función que sobreescribe el fichero, es decir, lo que hubiese
antes se modifica y se cambia por los nuevos valores.
Gestión de errores
En el programa del ejemplo anterior no hemos controlados los posibles errores a la hora de trabajar
con ficheros, por ejemplo si pulsamos el botón iniciar sesión sin haber guardado previamente un
usuario y una contraseña el programa nos mostrará en pantalla una ventana con el código de error
2101 y un texto indicando que el fichero no existe.
Para gestionar algunos de los errores que nos aparecen en pantalla, tanto si son de ficheros como
sino, App Inventor incluye el bloque Cuando.Screen1.Error. Este bloque se ejecutará cuando se
produzca en la aplicación alguno de los errores que están controlados por ella y nos permitirá
determinar que acciones queremos que se ejecuten cuando el error sea detectado. Algunos de los
errores que se controlan desde este bloque son los siguientes:
• Errores que se producen en los componentes ficheros
• Errores que se producen en los componentes Bluetooth
• Errores que se producen en el componente de Twitter
• Errores que se producen en el componente de SoundRecorder
• LocationSensor - cuando LatitudeFromAddress o LongitudeFromAddress fallan.
• Player - al establecer la fuente en propiedades, falla.
• Sonido - al establecer la fuente en propiedades, falla, o bien, falla durante la reproducción.
• VideoPlayer - al establecer la fuente en propiedades, falla.
En el caso del ejemplo anterior podremos avisar al usuario de que no existe el fichero y pedirle que
lo cree primero. Para los errores que no están incluidos en el control de este bloque la aplicación
generará un mensaje por defecto que no podremos cambiar ni tampoco gestionar. Este bloque
incluye los siguientes parámetros :
Programación de Videojuegos con App Inventor Mª Dolores Molina
También deberemos habilitar el componente BotonInicio una vez que hayamos creado el fichero.
Como principal crearemos un proyecto con los siguientes elementos para la interfaz:
Este bloque lo añadiremos una vez que hayamos unido los dos proyectos en uno solo, habiendo
renombrado la pantalla principal del segundo proyecto como PantallaJuego.
Programación de Videojuegos con App Inventor Mª Dolores Molina
2. Completa el videojuego de Mario para que se juegue con dos monedas. Deben aparecer en
posiciones aleatorias de la parte superior de la pantalla y con un tiempo de retardo entre
ellas. Al final de la partida deberá aparecer una etiqueta o imagen de fin de partida en
pantalla, bloquear todos los botones y los movimientos de Mario menos el botón de reinicio
de partida.(B2.C2)
3. En el ejemplo del Caza Topo hemos definido una variable para el control de tiempo de la
partida, pero no la hemos programado. Añade a la interfaz los elementos necesarios para que
el usuario vea en pantalla el tiempo de partida que le queda (el contador irá hacia atrás), la
partida finalizará cuando el contador llegue a cero. Añade también un botón para reiniciar el
juego.
4. Modifica el ejemplo de la canica gravitatoria para que el usuario parta con 100 puntos al
inicio de la partida y pierda 10 puntos cada vez que la pelota toque uno de los obstáculos.
Añade un reloj para el control del tiempo de la partida que durará 1 minuto e irá hacia atrás.
La partida termina si se acaba el tiempo, el usuario se queda sin puntos o la pelota llega al
final del recorrido. (B2.C3)
6. Modifica el ejemplo de la aplicación manos libres para que almacene en un fichero los
números a los que hemos llamado. Añade a la interfaz un visor de lista que nos muestre las
llamadas almacenadas en el fichero. No olvides incluir la gestión de errores.
7. Modifica la pantalla principal del “videojuego de Mario con varias pantallas” para que
muestre el nombre y la puntuación obtenida por el último jugador que haya jugado una
partida. Deberás añadir a la ventana de juego una disposición horizontal que incluya una
etiqueta, un campo de texto para almacenar el nombre del jugador y un botón para grabar el
nombre que hemos solicitado y la puntuación obtenida utilizando un carácter separador
(/,@, \n, ...) en un solo fichero al que llamaremos mariopuntos.txt. Esta disposición estará
oculta y solo se mostrará cuando el usuario pulse el botón fin de partida, una vez que se
hayan grabado los datos el programa finalizará su ejecución. (B2.C4)
Programación de Videojuegos con App Inventor Mª Dolores Molina
Bibliografía
Instalación de App Inventor. https://sites.google.com/site/appinventormegusta/instalacion.