62
TUTORIAL DIARIO DÍA 2

TUTORIAL DIARIO DÍA 2 · 2016-05-11 · El nombre de la componente, Screen1, que ver as en el panel que contiene el listado de los componentes de la app. ... dispondr as los objetos

  • Upload
    vonhu

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

TUTORIAL DIARIODÍA 2

Introduccion

Bienvenido al segundo dıa del taller Programa Tus Ideas.

Los juegos y las aplicaciones de fuerte contenido audiovisual pueden ser una forma muy

apropiada de introducir a tus alumnos a los conceptos basidos de la programacion en el Taller

de Aplicaciones. De hecho, una gran cantidad de las aplicaciones movilles mas populares hoy

en dıa son juegos. El dıa de hoy veremos como programar este tipo de aplicaciones en App

Inventor.

Comenzaremos a trabajar con el componente Lienzo, que permite dibujar lıneas y cırculos,

y mostrar imagenes y animaciones. En el primer tutorial desarrollaras una aplicacion estilo

“Paint”, donde puedes tomar una foto con la camara y luego editarla usando lıneas, cırculos y

distintos colores. Luego, aprenderas a programar animaciones basicas implementado el juego

Atrapa el Topo, inspirado por el clasico juego mecanico del mismo nombre. En tercer

lugar, presentamos un breve tutorial para programar el clasico juego Pong .

El resto de este documento consiste en material de apoyo sobre los siguientes conceptos

fundamentales: el componente Lienzo, el uso de temporizadores, y como programar usando

variables (donde se ensena el concepto de variables locales). En conjunto, estos componentes

de AppInventor permiten programar juegos bastante sofisticados.

1

1. tutorial: pintafotos

1. Tutorial: PintaFotos

En este tutorial presentaremos el componente Lienzo para crear aplicaciones con graficos

y animaciones simples en 2 dimensiones (2D). Construiremos la aplicacion PintaFotos que

permite al usuario dibujar en la pantalla usando distintos colores, usando una imagen de

fondo y dibujando sobre ella.

Un dato historico: PintaFotos fue uno de los primeros programas desarrollados para

demostrar el potencial de los computadores, en la decada de 1970. En aquel entonces, hacer

algo tan simple como esta aplicacion de dibujo era algo muy complejo, y los resultados

no eran perfectos. Pero ahora, con AppInventor, cualquiera puede rapidamente armar una

aplicacion de dibujo bastante buena, lo que sirve de excelente punto de partida para luego

hacer juegos 2D.

La interfaz de usuario de PintaFotos se muestra en la Figura 1.1.

Figura 1.1: Interfaz de usuario aplicacion PintaFotos

En esta aplicacion podras:

Banar tu dedo en un tarro de pintura virtual para dibujar en este color.

Arrastrar tu dedo en la pantalla para dibujar una lınea.

2

1. tutorial: pintafotos

Tocar la pantalla para hacer puntos.

Usar el boton de abajo para limpiar la pantalla.

Agrandar o achicar el tamano de los puntos con los botones abajo.

Sacar una foto con la camara y luego dibujar encima de esta foto.

Que Aprenderas

Siguiendo este tutorial aprenderas a:

Usar el componente Lienzo para dibujar.

Manejar las funcionalidades “touch” y “arrastrar” en la pantalla del equipo.

Configurar la disposicion de los componentes en la pantalla.

Usar los controladores de eventos que reciben argumentos o parametros.

Definir variables para recordar cosas como el tamano de un punto elegido por el usuario

para dibujar.

Para Empezar

Asegurate que tu computador y telefono estan configurados para usar AppInventor. Crea

un nuevo proyecto y nombralo PintaFotos. Abre el Editor de Bloques y comprueba que

puedes probar tu aplicacion en tu dispositivo mediante la conexion USB. Consulta con tu

tutor ante cualquier problema.

Para empezar, ve al panel de propiedades a la derecha del Disenador y cambia el tıtulo

de la pantalla a “PintaFotos”. Deberıas ver este cambio reflejado en el telefono, con el nuevo

tıtulo apareciendo en la barra de tıtulos de tu app.

Si estas preocupado por confundir el nombre de tu proyecto con el nombre de la pantalla,

¡no te preocupes! Hay tres nombres claves en AppInventor:

El nombre que eliges para tu proyecto mientras trabajes en el. Tambien sera el nombre

de la aplicacion cuando la quieras publicar. Nota que puedes hacer click en “Archivo”

y seleccionar “Guardar Como” en el Disenador para crear una nueva version o cambiar

el nombre de un proyecto.

3

1. tutorial: pintafotos

El nombre de la componente, Screen1, que veras en el panel que contiene el listado

de los componentes de la app. No puedes cambiar este nombre en esta version de

AppInventor.

El tıtulo de la pantalla, el que ves en la barra de tıtulo del telefono. Empieza siendo

Screen1, que es el tıtulo que usaste en HolaGatito. Pero lo puedes cambiar, como

lo hicimos en PintaFotos.

Disenando los Componentes

Para crear la app usaras los siguientes componentes:

Tres componentes Boton para seleccionar pintura roja, azul o verde y un componente

DisposicionHorizontal para organizarlos.

Un componente Boton para limpiar el dibujo, y otros dos para cambiar el tamano de

los puntos.

Un componente Lienzo, que es la superficie para dibujar. El Lienzo tiene una pro-

piedad ImagenDeFondo, que configuraremos como gatito.png desde el tutorial Hola

Gatito. Mas adelante, modificaras la app para que la imagen de fondo pueda ser una

foto sacada por el usuario.

Crea los Botones de Colores

Primero, crea los 3 botones de color usando las siguientes instrucciones:

Arrastra un Boton al Visor y cambia su Texto a “Rojo”, y su ColorDeFondo tam-

bien a rojo.

En la lista de Componentes, selecciona el Boton1 y presiona “Cambiar Nombre” para

cambiar su nombre por BotonRojo. Observa que no se puede poner espacios en los

nombres de los componentes, entonces es comun poner en mayuscula la primera letra

de cada palabra en el nombre.

De la misma manera, crea dos botones adicionales para azul y verde, nombrados

BotonAzul y BotonVerde respectivamente. Ponlos debajo del boton rojo. Chequea

tu trabajo comparandolo con la Figura 1.2.

4

1. tutorial: pintafotos

Figura 1.2: El Visor con los tres botones creados.

¡Importante! Observa que en este proyecto cambias los nombres de los componentes en vez

de dejarlos con sus nombres por defecto, como lo hiciste en Hola Gatito. El usar nombres

mas significativos hace que tus proyectos sean mas faciles de leer, y realmente ayuda en el

momento de pasar al Editor de Bloques cuando tendras que referirte a los componentes por

su nombre. A partir de ahora y en el resto del taller usaremos la convencion de que cada

nombre de componente empiece por su tipo (por ejemplo: BotonRojo).

¡Prueba tu aplicacion! Conecta tu aplicacion a tu dispositivo y verifica que funcione

correctamente.

Usando los Componentes de Disposicion para una Mejor Presentacion

Ahora deberıas tener tres botones alineados verticalmente. Sin embargo para esta app,

vas a necesitar que esten en fila horizontal arriba de la pantalla, como en la Figura 1.3. Para

ello debes usar el componente DisposicionHorizontal.

Figura 1.3: Los tres botones en disposicion horizontal.

5

1. tutorial: pintafotos

1. Desde la categorıa “Disposicion” en la Paleta, arrastra un componente DisposicionHo-

rizontal y ponlo debajo de los botones.

2. En el panel de Propiedades, cambia el Ancho de DisposicionHorizontal a la opcion

“Ajustar al contenedor” para llenar todo lo ancho de la pantalla.

3. Mueve los tres botones uno despues del otro al interior de la DisposicionHorizon-

tal. Truco: Veras una lınea vertical azul que indica donde ira el elemento que estas

arrastrando.

Si miras en la lista de componentes del proyecto, veras tres botones listados bajo el

componente DisposicionHorizontal, lo que muestra que se trata de sus subcomponentes.

Asimismo, observa que todos los componentes estan listados bajo el componente Screen1.

¡Prueba tu Aplicacion! Deberıas ver tus tres botones en una fila horizonal en la pantalla,

a pesar de que puedan verse un poco diferente a como se ven en el Disenador. Por ejemplo,

el borde de DisposicionHorizontal no aparece en el dispositivo.

En general, se usan los componentes de “Disposicion” como opciones de diseno para crear

disposiciones simples, verticales, horizontales o en tablas. Tambien puedes crear disposiciones

mas complejas insertando componentes de disposicion unos dentro de otros.

Agregar el Lienzo

El lienzo es el lugar donde el usuario dibuja cırculos y lıneas. Agregalo, y configura el

archivo gatito.png , usado en Hola Gatito, como su ImagenDeFondo.

Desde la categorıa “Dibujo y Animacion” de la Paleta, arrastra un Lienzo hacia el

Visor. Cambia su nombre a LienzoDeDibujo. Configura su Ancho como “Ajustar al

Contenedor” y su Alto a 300 pixeles.

Recuerda que puedes descargar el archivo gatito.png desde ProgramaTusIdeas/Dia1/

HolaGatito.

Configura la ImagenDeFondo del LienzoDeDibujo con el archivo gatito.png . Si es

necesario, debes subir el archivo.

6

1. tutorial: pintafotos

Cambia el ColorDePintura en el LienzoDeDibujo al color rojo para que cuando

el usuario inicie la app pero todavıa no ha presionado ningun boton, sus dibujos sean

rojos. Comprueba si lo que has hecho es parecido a la Figura 1.4.

Figura 1.4: El LienzoDeDibujo con la imagen gatito.png como ImagenDeFondo.

Agregar los Botones Inferiores y el Componente Camara

1. Desde la Paleta, arrastra un nuevo componente DisposicionHorizontal y ponlo abajo

del lienzo.

2. Luego arrastra dos componentes Boton adicionales en el Visor y ponlos dentro del

DisposicionHorizontal que acabas de agregar. Cambia el nombre del primer boton

por BotonCamara y su Texto a “Sacar Foto”. Cambia el nombre del segundo boton

por BotonLimpiar y su Texto por “Limpiar”.

3. Arrastra dos botones mas y colocalos al lado derecho del BotonLimpiar.

4. Nombra los nuevos botones como BotonGrande y BotonPequeno, y pon su Texto

como “Grande” y “Pequeno” respectivamente.

7

1. tutorial: pintafotos

5. Desde la seccion Medios de la Paleta, arrastra un componente Camara hacia el Visor.

Aparecera en la seccion de los componentes no-visibles.

Una vez completados estos pasos, tu aplicacion deberıa verse como en la Figura 1.5.

Figura 1.5: Interfaz de usuario completa para PintaFotos

¡Prueba tu Aplicacion! ¿Aparece la foto del gatito debajo de los botones de la primera

fila? ¿Aparece la ultima fila de botones abajo?

Agregar Comportamiento a los Componentes

El proximo paso es definir como se comportan los componentes. Crear un programa de

pintura puede parecer un desafıo insuperable, pero quedate tranquilo! AppInventor te facilita

el trabajo: existen bloques muy faciles de usar para manejar las funcionalidades de touch y

arrastre, y para dibujar y sacar fotos.

8

1. tutorial: pintafotos

En el Disenador, agregaste un componente Lienzo llamado LienzoDeDibujo. Como

todos los componentes de ese tipo, LienzoDeDibujo tiene un evento Tocar y un evento

Arrastrado. Programaras el evento LienzoDibujo.Tocar de tal manera que llame a la fun-

cion LienzoDibujo.DibujarCırculo. Programaras el evento LienzoDibujo.Arrastrado

de tal manera que llame a la funcion LienzoDibujo.DibujarLınea. Programaras luego los

botones para configurar la propiedad ColorDePintura usando el bloque poner LienzoDi-

bujo.ColorPintura, y para limpiar el LienzoDeDibujo; y finalmente, programaras como

cambiar la ImagenDeFondo del lienzo por una foto sacada con la camara del dispositivo.

Agregar el Evento Tocar para Dibujar un Punto

Primero, dispondras los objetos de manera que cuando tocas el LienzoDeDibujo, se

dibuje un punto en el lugar del lienzo que toques:

1. En el Editor de Bloques, selecciona el LienzoDeDibujo, y arrastra el bloque Lienzo-

DeDibujo.Tocado al Visor. El bloque tiene parametros para x e y, y SpriteTocado,

como ilustrado en la Figura 1.6. Estos parametros entregan informacion sobre la ubi-

cacion del evento “tocar la pantalla” hecho por el usuario.

Figura 1.6: El evento viene con informacion sobre la ubicacion del toque en la pantalla

Nota. Si completaste la aplicacion Hola Gatito, ya estas familiarizado con los eventos

de Boton.Click, pero no con los eventos del lienzo. Los eventos Boton.Click son

bastante sencillos porque no hay nada mas que saber del evento aparte del hecho que

ocurrio. Algunos controladores de eventos, sin embargo, vienen con informacion sobre

los argumentos para llamar al evento. El evento LienzoDibujo.Tocar te entrega las

coordenadas x e y del toque dentro del LienzoDeDibujo. Tambien te dice si un

objeto dentro del LienzoDeDibujo (lo que se conoce como Sprite) fue tocado, pero

este punto se abordara mas adelante. Las coordenadas x e y son los argumentos que

usaremos para grabar donde el usuario toco la pantalla, de manera de poder dibujar

el punto en este lugar.

9

1. tutorial: pintafotos

2. Arrastra un bloque LienzoDeDibujo.DibujarCırculo desde el bloque y ponlo dentro

del controlador de eventos LienzoDeDibujo.Tocar, como se ilustra en la Figura 1.7.

Figura 1.7: Cuando el usuario toca el lienzo, la aplicacion dibuja un cırculo

Por el lado derecho del bloque LienzoDeDibujo.DibujaCırculo, veras tres espacios

vacıos por completar con los argumentos siguientes: x, y, y r. Los x e y especifican

la ubicacion donde el cırculo se va a dibujar, y r determina el radio (o tamano) del

cırculo.

El signo amarillo con el punto de exclamacion a la izquierda inferior de la pantalla

aparecera con un 1 cuando un espacio todavıa permanece vacıo. Construiremos los

bloques para completar esto despues.

Este controlador de evento puede confundir un poco porque el evento LienzoDeDi-

bujo.Tocar tambien tiene una x y una y. Solamente acuerdate que la x y la y para el

evento LienzoDeDibujo.Tocar te dice donde toco el usuario, mientras que el x e y

para el evento LienzoDeDibujo.DibujarCırculo son espacios abiertos para que tu

definas donde se dibujara el cırculo. Dado que quieres que el cırculo aparezca donde toco

el usuario, conectaras los valores x e y desde el LienzoDeDibujo.Tocar de la misma

forma que los valores de los parametros x e y en LienzoDeDibujo.DibujarCırculo.

Nota. Puedes acceder a los valores del evento al pasar el mouse sobre los parametros

en el bloque “Cuando”. Al hacerlo, apareceran los bloques tomar y poner a. Arrastra

el bloque tomar x y conectalo como el valor faltante en para x en LienzoDeDibu-

jo.DibujarCırculo, como se ilustra en la Figura 1.8.

10

1. tutorial: pintafotos

Figura 1.8: Para acceder al parametro de un evento, arrastra un bloque tomar desde elbloque LienzoDeDibujo.Tocar

3. Arrastra los bloques tomar x y tomar y y conectalos en los espacios abiertos en el

bloque LienzoDeDibujo.DibujarCırculo, como se ilustra en la Figura 1.9.

Figura 1.9: La aplicacion sabe donde dibujar (x,y), pero todavıa necesitamos especificar cuangrande deberıa ser el cırculo.

4. Ahora necesitas especificar el radio del cırculo a dibujar. El radio se mide en pixeles,

que es el punto mas pequeno que puede ser dibujado en la pantalla. Por ahora, ponle

como valor el numero 5: haz click en una zona blanca de la pantalla y tipea 5, luego

presiona Enter para crear automaticamente un bloque numerico, y conecta este bloque

en el espacio para el parametro r. Cuando hagas esto, el signo amarillo en la esquina

inferior se pondra en 0 nuevamente, dado que todos los espacios abiertos habran sido

completados. La Figura 1.10 muestra como debiera verse el controlador de eventos

LienzoDeDibujo.Tocar.

11

1. tutorial: pintafotos

Figura 1.10: Cuando el usuario toca el LienzoDeDibujo, un cırculo de radio 5 sera dibujadoen las coordenadas (x, y) correspondientes.

Nota. Al poner un 5 en el Editor de Bloques y luego presionar Enter, habras usado

lo que se llama tipeo de bloques. Si empiezas a tipear, el editor de bloques muestra un

listado de bloques cuyos nombres corresponden a lo que estas tipeando. Si tipeas un

numero, crea un bloque numerico.

¡Prueba tu Aplicacion! Usa tu dispositivo para probar lo que has desarrollado

hasta ahora. Al tocar el LienzoDeDibujo, tu dedo deberıa dejar un punto en cada

lugar que toques. Los puntos seran rojos si configuraste la propiedad del LienzoDe-

Dibujo.ColorDePintura como color rojo en el Disenador (sino sera negro, que es el

color por defecto).

Agregar el Evento de Arrastre para Dibujar una Lınea

Luego, agregaras el controlador de eventos de arrastre. La diferencia entre un touch y un

arrastre es la siguiente:

Un touch es cuando pones tu dedo en la pantalla y solo lo levantas para tocar, sin

desplazarlo.

Un arrastre es cuando pones tu dedo en la pantalla y lo mueves al mantener contacto

con la pantalla.

En un programa de pintura, cuando arrastras tu dedo en la pantalla se dibuja una lınea

igual al camino que sigue tu dedo. Lo que estas haciendo en realidad es dibujar cientos de

12

1. tutorial: pintafotos

pequenas lıneas rectas; cada vez que mueves tu dedo, incluso un poco, extiendes la lınea

desde la ultima posicion de tu dedo hacia su nueva posicion.

1. En el Editor de Bloques, desde la seccion del LienzoDeDibujo, arrastra el bloque

LienzoDeDibujo.Arrastrado al espacio de trabajo. Deberıas ver el gestionador de

eventos tal como en la Figura 1.11.

Figura 1.11: Un evento de arrastre tiene mas argumentos que un evento de touch.

El evento LienzoDibujo.Arrastre viene con los siguientes argumentos:

XInicial, YInicial: la posicion de tu dedo donde empieza el arrastre.

XActual, YActual: la posicion actual de tu dedo.

XPrevio, YPrevio: la posicion inmediatamente anterior de tu dedo.

SpriteArrastrado: un booleano, sera verdad si el usuario hace el arrastre direc-

tamente sobre un imagen Sprite. En el taller no usaremos este argumento.

2. Arrastra el bloque LienzoDeDibujo.DibujarLınea dentro del bloque LienzoDeDi-

bujo.Arrastrado como se muestra en la Figura 1.12.

Figura 1.12: Agregando la habilidad de dibujar lıneas

El bloque LienzoDeDibujo.DibujarLınea tiene cuatro argumentos, dos para cada

punto que determina la lınea: un punto es (x1, y1), mientras que (x2, y2) es el otro.

¿Puedes adivinar que valores corresponden a cada argumento? Recuerda que el evento

13

1. tutorial: pintafotos

LienzoDeDibujo.Arrastrado se activara cada vez que arrastres tu dedo en el Visor,

por lo tanto la aplicacion dibuja una pequena lınea cada vez que mueves tu dedo, desde

(XPrevio, YPrevio) hacia (XActual, YActual). Agreguemos esto a nuestro bloque

LienzoDeDibujo.DibujarLınea:

3. Arrastra los bloques tomar para los argumentos que vas a necesitar. Los valores

XPrevio e YPrevio deberıan ir conectados en los espacios para los argumentos x1

e y1, respectivamente, como se ilustra en la Figura 1.13.

Figura 1.13: Cuando el usuario arrastre el dedo, la aplicacion dibujara una lınea desde elpunto anterior hacia el actual.

¡Prueba tu Aplicacion! Arrastra tu dedo en la pantalla para dibujar lıneas y cur-

vas. Toca la pantalla para dibujar puntos.

Agregar Controladores de Eventos para Botones

La aplicacion que has construido hasta ahora permite al usuario dibujar, pero siempre

estos dibujos usan el color rojo. El proximo paso consiste en agregar controladores de eventos

para los botones de colores, para que el usuario pueda cambiar el color de la pintura, y otro

para el BotonLimpiar para que pueda limpiar la pantalla y ası volver a empezar a dibujar.

En el Editor de Bloques:

1. Arrastra el bloque BotonRojo.Click al espacio de trabajo.

2. Arrastra el bloque poner LienzoDeDibujo.ColorDePintura y conectalo en las ac-

ciones del bloque BotonRojo.Click.

3. Abre la seccion “Colores” y arrastra el bloque de color rojo para conectarlo con el

bloque poner LienzoDeDibujo.ColorDePintura.

14

1. tutorial: pintafotos

4. Repite los pasos anteriores para los botones azul y verde.

5. El ultimo boton por configurar es el BotonLimpiar. Para limpiar el lienzo de dibujo

debes utilizar el bloque LienzoDeDibujo.Limpiar. Confirma que tus bloques se ven

como en la Figura 1.14.

Figura 1.14: Cuando el usuario hace click en los botones de colores cambia el color paradibujar en el lienzo. Hacer click en “Limpiar”, borra el contenido del lienzo.

Permitir al Usuario Tomar un Foto

Las aplicaciones hechas con AppInventor pueden interactuar con las funcionalidades de

los dispositivos Android, incluyendo la camara. Para personalizar la aplicacion, se permite

al usuario fijar la imagen de fondo de su dibujo con una foto tomada con la camara.

1. El componente Camara contiene dos bloques claves. El bloque Camara.TomarFoto

inicia la aplicacion de camara del telefono. El evento Camara.DespuesDeTomarFo-

to se activa cuando el usuario termino de sacar la foto. Agregaras bloques en el contro-

lador de eventos Camara.DespuesDeTomarFoto para configurar el LienzoDeDi-

bujo.ImagenDeFondo con la foto que fue sacada. Abre la seccion de BotonCamara

y arrastra el controlador de evento BotonCamara.Click hacia el espacio de trabajo.

2. Arrastra el bloque Camara1.TomarFoto y ponlo en el controlador BotonCama-

ra.TomarFoto.

3. Arrastra el controlador de eventos Camara1.DespuesDeTomarFoto al espacio de

trabajo.

15

1. tutorial: pintafotos

4. Arrastra el bloque poner LienzoDeDibujo.ImagenDeFondo y ponlo en las acciones

de Camara1.DespuesDeTomarFoto.

5. Camara1.DespuesDeTomarFoto tiene un argumento llamado imagen, que es la

foto recien sacada. Puedes referirte a ella, con un bloque “tomar” desde el bloque

Camara1.DespuesDeTomarFoto. Conecta la imagen como el argumento para el

bloque poner LienzoDeDibujo.ImagenDeFondo.

Los bloques deberıan ser parecidos a la Figura 1.15.

Figura 1.15: Cuando se saca la foto, se configura como la imagen de fondo del lienzo.

¡Prueba tu Aplicacion! Haz una prueba al hacer click en “Tomar Foto” y saca una

foto. El gatito deberıa cambiar por la foto que acabas de sacar, y luego podras dibujar

encima de la foto que sacaste.

Cambiar el Tamano del Punto

El tamano de los puntos dibujados en el LienzoDeDibujo se determina al llamar a

LienzoDeDibujo.DibujarCırculo, donde el argumento de radio esta configurado en 5.

Para cambiar el grueso de la lınea, puedes cambiar el valor de r. Para probar esto, intenta

cambiar el 5 por un 10 y pruebalo en el telefono para ver como aparece.

El unico tamano que el usuario podra usar es el que tu indicas como argumento para

el radio del cırculo. ¿Pero que pasa si el usuario quiere cambiar el tamano de los puntos?

Vamos a modificar el programa de manera que el usuario—no solo el programador—pueda

cambiar el tamano de los puntos. Lo haremos de tal manera que cuando el usuario haga click

en un boton llamado “Grandes”, el tamano sera 8, y cuando hara click en un boton llamado

“Pequenos”, sera 2.

16

1. tutorial: pintafotos

Para usar distintos valores en el argumento radio, la aplicacion necesita saber cual que-

remos aplicar. Necesitamos pedirle usar un valor especıfico, y tiene que memorizar este valor

de manera a poder seguir usandolo. Cuando tu aplicacion necesita guardar algo en memoria

que no sea una propiedad, puedes definir una variable. Una variable es una celda de memoria.

Es como un balde donde puedes almacenar datos variables, como el tamano del punto.

Empezamos por definir una variable Tama~noPunto:

1. En el Editor de Bloques, desde la seccion “Variables”, arrastra un bloque Inicializar

global nombre. Cambia el texto “nombre” por “TamanoPunto”.

2. Fıjate que el bloque Inicializar global TamanoPunto tiene un espacio abierto. Ahı

es donde puede especificar el valor inicial de la variable, o su valor por defecto al iniciar

la aplicacion. Para esta aplicacion, inicializa el Tama~noPunto en 2 creando un bloque

con el numero 2, y conectandolo en Inicializar global TamanoPunto como se ilustra

en la Figura 1.16.

Figura 1.16: Inicializar variable global Tama~noPunto con valor 2.

Usar las Variables

Ahora, queremos cambiar el argumento de LienzoDeDibujo.DibujarCırculo en el

controlador de eventos LienzoDibujo.Tocar para que uses el valor Tama~noPunto en vez de

usar siempre un numero fijo. (Puede dar la ilusion que fijamos Tama~noPunto en 2 porque lo

inicializamos de esta manera, pero veras en un minuto como podemos cambiar Tama~noPunto

y asi cambiar el tamano del punto que se dibuja.)

1. Arrastra un bloque “tomar” desde LienzoDeDibujo.DibujarCırculo. Deberıas ver

un bloque tomar global TamanoPunto que indica el valor de la variable.

2. Anda al controlador de eventos LienzoDeDibujo.Tocar y arrastra el bloque del

numero 5 fuera del espacio r y ponlo en el papelero. Luego reemplazalo con el bloque

tomar global TamanoPunto (Ver Figura 1.17). Cuando el usuario toca el lienzo, la

aplicacion determinara ahora el radio a partir de la variable Tama~noPunto.

17

1. tutorial: pintafotos

Figura 1.17: Ahora el tamano de cada cırculo depende de lo que esta guardado en la memoriade la variable TamanoPunto.

Cambiar los valores de las variables

Aquı es donde la magia de las variables opera. La variable Tama~noPunto permite al

usuario elegir el tamano del cırculo, y tu controlador de eventos dibujara el cırculo en fun-

cion de esto. Desarrollaremos el comportamiento al programar los controladores de eventos

BotonPequeno.Click y BotonGrande.Click.

1. Arrastra un controlador de eventos BotonPequeno.Click al espacio de trabajo. Lue-

go arrastra desde la categorıa “Variables” un bloque poner a, selecciona “global Ta-

manoPunto” como referencia y conectalo a BotonPequeno.Click. Finalmente, crea

un bloque numero 2 y conectalo al bloque poner global TamanoPunto.

2. Haz un controlador de eventos similar para BotonGrande.Click, pero configura el

Tama~noPunto en 8. Ambos gestionadores de eventos deberıan aparecer en el editor de

bloques, como en la Figura 1.18.

Figura 1.18: Hacer click en los botones cambia el tamano del punto. Los toques que siguenseran con este tamano de punto.

¡Prueba tu Aplicacion! Intenta hacer click en los botones de tamano y luego toca el

lienzo. ¿Se dibujan cırculos de distintos tamanos? ¿Las lıneas? El tamano de las lıneas no

18

1. tutorial: pintafotos

deberıa cambiar porque programaste Tama~noPunto solamente para ser usado en el bloque de

DibujarCırculo. En base a esto, ¿podrıas ahora cambiar tus bloques para que el usuario

tambien pueda cambiar el tamano de la lınea? (Nota que el lienzo tiene una propiedad

llamada AnchodeLinea)

La App Completa: PintaFotos

La Figura 1.19 ilustra el codigo completo de la aplicacion PintaFotos:

Figura 1.19: Grupos de bloques para PintaFotos.

Resumen

Las ideas claves que hemos visto en este tutorial son las siguientes:

El componente Lienzo te permite dibujar en un lienzo. Tambien es sensible a eventos

“touch” y de arrastre, los cuales puedes aprovechar para desarrollar funcionalidades

para dibujar.

Puedes usar componentes de disposicion en la pantalla para organizar tus componentes

en lugar de ponerlos todos uno debajo del otro.

Algunos controladores de eventos vienen con informacion sobre el evento, como las

coordenadas de donde la pantalla fue tocada. Esta informacion esta representada por

19

2. discusion y ejercicios de personalizacion

argumentos. Cuando arrastras un controlador de eventos que tiene argumentos, Ap-

pInventor crea ıtems “poner a” y “tomar”, dentro del bloque seleccionado, para ası

poder referirse a estos argumentos.

Crear variables al usar bloques poner global nombre, desde la categorıa “Variables”.

Las variables permiten guardar informacion en memoria, como el tamano del punto,

que no esta guardado en una propiedad de un componente.

Para cada variable que definas, AppInventor automaticamente provee una referencia

“tomar global” que entrega el valor de la variable, y una referencia “poner global a”

para cambiar el valor de la variable. Para acceder a esto, arrastra un bloque “poner a”

o “tomar” desde el mismo bloque donde declaras la variable.

El componente Lienzo tambien se puede usar para programar animaciones como las que

ves en juegos en 2D.

2. Discusion y Ejercicios de Personalizacion

Preguntas/Discusion

1. En el Lienzo, los controladores de eventos Tocar y Arrastrado, mostrados abajo en

la Figura 2.1, tienen parametros de evento. Nombra cada parametro e indica lo que

representa.

Figura 2.1: Grupos de bloques para PintaFotos.

20

2. discusion y ejercicios de personalizacion

2. Los parametros de evento son distintos de los parametros para llamar funciones. ¿Como

se llaman los parametros para llamar funciones en el controlador de eventos de la ???

¿Quien especifica los parametros de funcion? Quien especifica parametros de eventos?

3. ¿Cual es el proposito de definir una variable para el Tamano de Punto en la App Pinta

Fotos? Si quieres permitir cambiar el grosor de las lıneas, ¿necesitaras una variable?

4. Define lo que es una variable. ¿Cuales son sus puntos en comun con una propiedad?

¿Como se diferencia de una propiedad?

5. Una forma de personalizar la aplicacion es poner un CuadroDeTexto para el tamano

del punto. ¿Cual es la diferencia entre un cuadro de texto y una variable? ¿Cual es la

diferencia entre una etiqueta y un cuadro de texto?

Ejercicios de Personalizacion

1. La interfaz de usuario de PintaFoto no permite mostrar con que color se esta dibu-

jando. El usuario solo se da cuenta al dibujar. ¿Puedes agregar esta informacion para

el usuario de tal manera que cuando el hace click para cambiar el color, la interfaz

cambia y le indica que color fue elegido?

2. El tamano del punto para dibujar un cırculo solo puede ser de 2 o 8. ¿Puedes cam-

biar esto para permitir al usuario elegir entre distintas opciones con un componente

Deslizador o un CampoDeTexto?

3. Permitir al usuario controlar el grosor de las lıneas, de la misma manera que pue-

de cambiar el tamano del punto. El lienzo tiene una propiedad AnchoDeLinea que

controla esta caracterıstica.

21

3. tutorial: atrapa el topo

3. Tutorial: Atrapa el Topo

En este tutorial desarrollaras el juego Atrapa el Topo, inspirado en las salas de juegos

clasicas, en las que unos topos mecanicos saltan fuera de su hueco, y los jugadores ganan

puntos golpeandolos con un mazo. El juego fue creado por Ellen Spertus, un miembro del

equipo de AppInventor en Google, para implementar la funcionalidad Sprite. El termino

Sprite aparecio en la comunidad de informaticos en los anos 70, y se referıa a imagenes

capaces de moverse en la pantalla de un computador (para videojuegos).

Que Construiras

Para la aplicacion Atrapa el Topo, ilustrada en la Figura 3.1, implementaras las si-

guientes funcionalidades:

Un topo que salta en cualquier lugar de la pantalla, moviendose cada segundo.

Tocar el topo hace vibrar el telefono, y aumenta el marcador de puntos (un punto por

topo tocado), y el topo se mueve de inmediato a otro lugar.

Tocar la pantalla sin alcanzar a tocar el topo provoca que el marcador de toques

perdidos aumente.

Al presionar el boton “Reiniciar” se reinicia el contador de golpes logrados y perdidos.

22

3. tutorial: atrapa el topo

Figura 3.1: Interfaz de usuario de Atrapa el Topo.

Que Aprenderas

Este tutorial cubre los siguientes componentes y conceptos:

El componente SpriteImagen para imagenes movibles con sensibilidad touch.

El componente Lienzo que funciona como una superficie sobre la cual se pone el

SpriteImagen.

El componente Reloj para mover el sprite.

El componente Sonido para producir una vibracion cuando el topo es tocado.

El componente Boton para empezar un nuevo juego.

23

3. tutorial: atrapa el topo

Procedimientos para implementar comportamientos repetitivos, como desplazar el to-

po.

Generar numeros al azar.

Usar los bloques de sumar (+) y restar (-).

Para empezar

Conectate al sitio de AppInventor y crea un nuevo proyecto. Llamalo “AtrapaElTopo” y

tambien cambia el tıtulo de la pantalla como “AtrapaElTopo”. Abre el Editor de Bloques y

conectate a tu dispositivo Android.

Descarga la imagen ProgramaTusIdeas/Dia2/topo.png. Luego ve a la seccion de Medios

del Disenador de Componentes y subela a AppInventor.

Disenando los Componentes

Utilizaras los siguientes componentes para construir Atrapa el Topo:

Un Lienzo que sirve de campo de juego.

Un SpriteImagen que representa la foto del topo y que puede moverse y sentir cuando

el topo fue tocado.

Un Sonido que vibra cuando el topo es tocado.

Etiquetas que dicen “Logrado”, “Perdido”, y el numero de toques logrados y perdidos.

Un componente DisposicionHorizontal para posicionar las etiquetas correctamente.

Un Boton para reiniciar a 0 el numero de golpes exitosos y fallidos.

Un Reloj para hacer que el topo se desplace una vez por segundo.

La Cuadro 3.1 muestra la lista completa de componentes para Atrapa el Topo.

Tabla 3.1: Lista completa de componentes para Atrapa el Topo

24

3. tutorial: atrapa el topo

Ubicar los Componentes de Accion

En esta seccion crearemos los componentes necesarios para que funcione el juego. En la

siguiente seccion, crearemos los componentes para mostrar el marcador de puntos.

1. Arrastra un componente Lienzo, dejando su nombre por defecto Lienzo1. Configura

sus propiedades de Ancho como “Ajustar al contenedor” y ajusta su Alto a 300

pixeles.

2. Arrastra un componente SpriteImagen desde el grupo “Animaciones” de la Paleta.

Ponlo en cualquier lugar del Lienzo1, y luego cambia su nombre a “Topo”. Configura

su propiedad de Imagen usando la imagen topo.png que subiste anteriormente.

3. Arrastra un Boton debajo de Lienzo1. Cambia su nombre por “BotonReinicializar” y

configura su Texto como “Reinicializar”.

4. Arrastra un componente Reloj. Aparecera abajo del Visor, en la seccion de compo-

nentes no visibles.

5. Arrastra un componente Sonido. Tambien aparecera abajo del Visor, en la seccion de

componentes no-visibles.

Tu pantalla deberıa verse como en la Figura 3.2 (aunque tu topo puede estar en una

posicion distinta).

25

3. tutorial: atrapa el topo

Figura 3.2: El Disenador con la vista de los componentes de accion

Poner las Etiquetas

Ahora pondremos los componentes para mostrar el marcador de puntos del usuario, mas

especıficamente los golpes exitosos y fallidos.

1. Arrastra un componente DisposicionHorizontal, del grupo “Disposicion”, poniendo-

lo debajo del BotonReinicializar y dejando el nombre por defecto “DisposicionHo-

rizontal1”.

2. Arrastra dos Etiquetas hacia la DisposicionHorizontal.

Cambia el nombre de la etiqueta izquierda por “EtiquetaExitos” y configura su

Texto como “exitos: ” (¡Ojo! : tienes que incluir un espacio despues de los dos

26

3. tutorial: atrapa el topo

puntos).

Cambia el nombre de la etiqueta derecha por “EtiquetaPuntosGanados” y confi-

gura su Texto como “0”.

3. Arrastra un segundo componente DisposicionHorizontal, poniendolo debajo de Dis-

posicionHorizontal1.

4. Arrastra dos Etiquetas hacia la DisposicionHorizontal2

Cambia el nombre de la etiqueta izquierda por “EtiquetaFallos” y configura su Texto

como “Fallos: ” (¡Ojo! : tienes que incluir un espacio despues de los dos puntos).

Cambia el nombre de la etiqueta derecha por “EtiquetaPuntosFallados” y configura su

propiedad de Texto como “0”.

Tu pantalla deberıa ser parecida a la Figura 3.3

Figura 3.3: El Disenador con todos los componentes del juego.

27

3. tutorial: atrapa el topo

Agregar comportamientos a los componentes

Luego de crear los componentes anteriores, tienes que ir al Editor de Bloques para im-

plementar el comportamiento del programa. En particular, queremos que el topo se mueva

cada segundo de manera aleatoria en el lienzo. El objetivo del jugador es pegar al topo donde

aparezca, y la aplicacion mostrara el numero de veces que el jugador logro tocar o no al topo.

Pinchar en el boton “Reinicializar”, reinicializa el marcador.

Desplazar el Topo

En los programas que creaste hasta ahora, usaste procedimientos preexistentes como el

vibrador en Hola Gatito. Serıa maravilloso poder tener un procedimiento que mueve un

SpriteImagen de forma aleatoria en la pantalla! La mala noticia es que no existe! La buena

noticia: puedes crear tus propios procedimientos! Como los preexistentes, tu procedimiento

aparecera en una seccion y podra ser usado en cualquier lugar de la app.

En particular, crearemos un procedimiento para mover el topo a un lugar aleatorio en la

pantalla, que llamaremos MoverTopo. Vamos a activar MoverTopo al inicio del juego, cuando

el usuario logra tocar el topo, y una vez por segundo.

Crear el procedimiento MoverTopo

Para comprender como mover el topo, necesitamos ver como funcionan los graficos de

Android.

El lienzo (y la pantalla) son como una cuadrıcula con coordenadas x (horizontal) e y (ver-

tical), donde las coordenadas (x,y) de la esquina superior izquierda son (0,0). El x aumenta

cuando mueves hacia la derecha, y la y aumenta cuando vas hacia abajo, como se ilustra en

la Figura 3.4. Las propiedades X e Y de un SpriteImagen indican donde deberıa estar su

esquina superior izquierda; es decir, el topo en la esquina superior izquierda tiene valores de

0 para X e Y.

Para determinar los valores maximos para X e Y de tal manera que el topo no se salga

de la pantalla, necesitamos estar seguros de usar las propiedades Ancho y Alto del Topo

y del Lienzo1. Las propiedades de Ancho y Alto del Topo son las mismas que el tamano

de la foto que subiste. Cuando creaste el Lienzo1, configuraste su Alto a 300 pixeles y su

Ancho a “Ajustar al Contenedor”). Si el Topo tiene un Ancho de 36 pixeles y el Lienzo

200, la coordenada X del lado izquierdo del topo puede ir hasta 0 (borde izquierdo) o con

28

3. tutorial: atrapa el topo

un alto de hasta 164 (200 - 36, o Lienzo1.Ancho − Topo.Ancho) sin que el topo pase el

borde derecho de la pantalla.

De forma similar, la coordenada Y del lado superior del topo puede ir desde 0 hasta

Lienzo1.Alto − Topo.Alto.

Figura 3.4: Posiciones del topo en la pantalla, con informacion de ancho, coordenadas yaltura. La informacion de la coordenada x esta en azul, y la de la coordenada y esta ennaranjo.

Para dar una posicion aleatoria al topo, vamos a seleccionar una coordenada X entre

0 y Lienzo1.Ancho − Topo.Ancho. Asımismo, la coordenada Y tiene que estar en un

rango de entre 0 y Lienzo1.Alto − Topo.Alto. Podemos generar un numero aleatorio

con el procedimiento preexistente entero aleatorio entre, que se encuentra en la seccion

“Matematicas”. Tendras que cambiar los parametros como se muestra en la Figura 3.5.

La figura muestra ademas comentarios descriptivos que puedes opcionalmente agregar a tu

procedimiento.

29

3. tutorial: atrapa el topo

Figura 3.5: El procedimiento MoverTopo, que pone el Topo en una ubicacion aleatoria.

Para crear el procedimiento MoverTopo:

1. Selecciona la seccion “Procedimientos” del Editor de Bloques.

2. Arrastrar el bloque como procedimiento (no el como procedimiento resultado)

al espacio de trabajo.

3. Presiona el texto “procedimiento” en este nuevo bloque y reemplazalo por “MoverTo-

po”, para configurar el nombre del nuevo procedimiento.

4. Dado que queremos mover el topo, arrastra dentro del procedimiento el bloque lla-

mar Topo.MoverA, a la derecha de “ejecutar”. Observa que se requiere indicar las

coordenadas x e y donde se movera el topo.

5. Para especificar que la nueva coordenada x para el topo deberıa ser entre 0 y Lienzo1.Ancho−Topo.Ancho, debes hacer lo siguiente:

Seleccionar la seccion “Matematicas”.

Arrastra el bloque entero aleatorio entre, conectandolo con el parametro x en

llamar Topo.MoverA.

Cambia el numero 1 en el espacio “entre” por un 0.

Borra el numero 100 en el espacio “y”.

30

3. tutorial: atrapa el topo

Selecciona la seccion “Matematicas” y arrastra un bloque de resta (-) al espacio

de trabajo.

Selecciona el bloque Lienzo1.Ancho y arrastralo al argumento izquierdo del

bloque de resta.

De manera muy similar, arrastra el bloque Topo.Ancho hacia el argumento

derecho del bloque de resta.

Sigue un procedimiento similar para especificar que la coordenada y, que deberıa ser

un entero aleatorio entre 0 y Lienzo1.Alto − Topo.Alto.

Compara tus resultados con lo ilustrado en la Figura 3.5 que esta mas arriba.

Llamar MoverTopo cuando se Inicia la Aplicacion

Ahora que escribiste el procedimiento MoverTopo, ¡usemoslo! Es muy comun que los

programadores quieran que pase algo cuando se inicia la aplicacion, y es por eso que hay un

bloque para esto: Pantalla1.Inicializar.

1. Arrastra el bloque Pantalla1.Inicializar, desde la seccion Pantalla1.

2. Selecciona la seccion “Procedimientos”, donde ahora veras un bloque llamado llamar

MoverTopo. Arrastra el bloque y ponlo dentro de Pantalla1.Inicializar, como se

muestra en la Figura 3.6.

Figura 3.6: Llamar el procedimiento MoverTopo cuando se inicia la aplicacion.

Llamar a MoverTopo cada 1 Segundo

Hacer que el topo se mueva cada 1 segundo requiere que usemos el componente Re-

loj. Dejamos la propiedad IntervaloDelTemporizador en su valor por defecto de 1000

milisegundos (o sea 1 segundo). Esto significa que cada 1 segundo se ejecutara un evento

Reloj1.Temporizador. Estos eventos los usaremos para mover el topo cada 1 segundo, de

la siguiente manera:

31

3. tutorial: atrapa el topo

1. Selecciona la seccion Reloj1, y arrastra el controlador de eventos Reloj1.Temporizador

hacia el espacio de trabajo.

2. Arrastra un bloque llamar MoverTopo, desde la seccion “Procedimientos”, hacia

el interior del controlador de eventos Reloj1.Temporizador, como se muestra en

la Figura 3.7.

Figura 3.7: Procedimiento para llamar a MoverTopo cada 1 segundo, cada vez que se activael temporizador.

Si el movimiento es demasiado lento o rapido para ti, puedes cambiar la propiedad de

intervalo de tiempo en el Disenador, para cambiar la frecuencia de movimiento.

Llevar el Puntaje

¿Te acuerdas de que creaste dos etiquetas EtiquetaPuntosGanados y EtiquetaPun-

tosFallados, con valores iniciales de 0? Ahora queremos incrementar los numeros en estas

etiquetas cuando el usuario logra tocar el topo (un exito) o cuando toca la pantalla sin tocar

el topo (fallado). Para hacer esto, usaremos el bloque Lienzo1.Tocar, que indica que el

lienzo fue tocado, las coordenadas x e y de donde fue tocado (lo que no es necesario saber

en este caso), y si un sprite fue tocado (lo que si necesitamos saber). La Figura 3.8 muestra

el codigo que vamos a crear.

Figura 3.8: Se incrementa el numero de exitos o fallidos cuando el lienzo esta tocado.

La traduccion de la Figura 3.8 es la siguiente: cuando el lienzo es tocado, se chequea si el

sprite fue tocado. Dado que hay un solo sprite en nuestro programa, tiene que ser Topo1. Si

32

3. tutorial: atrapa el topo

el Topo es tocado, suma 1 al numero en EtiquetaPuntosGanados.Texto; sino, suma 1 al

numero en EtiquetaPuntosFallados.Texto. El valor de SpriteTocado es falso si ningun

sprite fue tocado.

Los bloques se crean de la siguiente manera:

1. Arrastra el bloque Lienzo1.Tocar.

2. Selecciona la seccion “Control”, y arrastra un bloque si-sino (tendras que agregar el

bloque sino despues de mover el bloque al espacio de trabajo) y colocalo dentro de

Lienzo1.Tocar.

3. Arrastra un bloque tomar SpriteTocado, y ponlo en el espacio abierto del bloque si.

4. Dado que queremos que EtiquetaPuntosGanados.Texto sea incrementado si el topo

fue tocado:

Desde la seccion EtiquetaPuntosGanados, arrastra el bloque poner Etique-

taPuntosGanados.Texto, y ponlo a la derecha de “entonces” en el bloque si.

Arrastra el bloque de suma (+), desde la seccion “Matematicas”, hasta el espacio

del bloque poner EtiquetaPuntosGanados.Texto como.

Arrastra el bloque EtiquetaPuntosGanados.Texto como el argumento izquier-

do del bloque de suma.

Agrega un bloque numerico con valor 1 como argumento derecho del bloque de

suma.

5. Repite el paso anterior, pero para la etiqueta EtiquetaPuntosFallados, en la seccion

si no, del bloque si ... sino.

¡Prueba tu Aplicacion! Puedes probar tu juego tocando el lienzo y el topo, y

viendo como cambian los puntajes.

Abstraccion procedural

La capacidad de nombrar y luego llamar una serie de instrucciones como MoverTopo es

una de las herramientas claves en ciencias de la computacion, y esta herramienta se llama

abstraccion procedural.

33

3. tutorial: atrapa el topo

Se llama abstraccion porque el que llama el procedimiento (quien, en el mundo real, por

lo general es una persona distinta a la que es el autor del procedimiento) solamente necesita

saber que hace el procedimiento (mover el topo), pero no como lo hace (al hacer dos llamados

al generador de numeros aleatorios). Sin la abstraccion procedural, grandes programas de

computacion no serıan posibles porque contienen demasiado codigo para que lo memorice

una sola persona. Se puede hacer una analogıa con la division del trabajo en una planta por

ejemplo, donde distintos ingenieros disenan diferentes partes de un auto, ninguno de ellos

entendiendo todos los detalles, y el conductor solo tiene que comprender la interfaz (por

ejemplo apretar el freno para detener el auto), y no toda la ingenierıa que hay por detras.

Algunas ventajas de la abstraccion procedural en comparacion con copiar y pegar codigo

son:

Es mas facil probar el codigo si esta nıtidamente separado del resto del programa.

Si hay un error en el codigo, solamente hay que arreglarlo en un lugar.

Para cambiar el desarrollo, como por ejemplo programar que el topo no se mueva al

lugar donde justo estuvo antes, solamente modificas el codigo en un lugar.

Los procedimientos pueden ser juntados en una librerıa y usados en distintos programas

(aunque no se puede hacer esto todavıa con AppInventor).

Dividir el codigo en trozos permite reflexionar bien sobre el codigo y desarrollar la

aplicacion de acuerdo a esta reflexion.

Elegir buenos nombres para los procedimientos ayuda a documentar el codigo, ha-

ciendolo mas facil de leer para otra persona que lo tomara despues.

Mas adelante aprenderas a hacer procedimientos mas potentes, agregando argumentos,

dando valores de retorno y haciendo que los procedimientos se llamen a ellos mismos.

Reinicializar el Puntaje

En una aplicacion como esta, es razonable pensar que habra mas de un usuario. Por

lo tanto, es bueno tener una manera de reinicializar el marcador de puntos en 0. Puede

ser que logres hacer esto sin leer estas indicaciones. Intenta hacerlo solo antes de leer las

instrucciones.

34

3. tutorial: atrapa el topo

Lo que necesitamos es un bloque BotonReinicializar.Click que ponga el marcador

de EtiquetaPuntosGanados.Texto y EtiquetaPuntosFallidos.Texto en 0. Crea los

bloques de la misma manera que en la Figura 3.9.

Figura 3.9: Reinicializar los marcadores cuando se apreta el boton “Reinicializar”.

En esta etapa del taller, no deberıas necesitar instrucciones paso a paso para crear un

controlador de eventos que responde al click de un boton, pero aquı va un consejo para

acelerar el proceso: en vez de sacar tu numero de la seccion “Matematicas”, solamente tipea

0, y el bloque deberıa crearse. (Estos atajos existen para otros bloques tambien.)

¡Prueba tu Aplicacion! Intenta jugar y luego apreta el boton “Reinicializar”.

Agregar un Comportamiento cuando el Topo es Tocado

Dijimos antes que queremos que vibre el dispositivo cuando se toca el topo, lo que pode-

mos hacer con el bloque Sonido1.Vibrar, como se ve en la Figura 3.10.

Figura 3.10: Cuando el topo es tocado el dispositivo vibra brevemente (1000ms).

¡Prueba tu Aplicacion! Revisa si vibra el telefono cuando tocas el topo. Si la vibracion

es demasiada larga o corta, segun tu gusto, cambia el numero de milisegundos en el bloque

Sonido1.Vibrar

La Aplicacion Completa: Atrapa el Topo

La Figura 3.11 muestra como se ven los bloques para la version completa de Atrapa el

Topo.

35

3. tutorial: atrapa el topo

Figura 3.11: El codigo de la version completa de Atrapa el Topo.

Variantes

Aquı vienen algunas ideas para agregar mas funcionalidades a Atrapa el Topo:

Agregar botones para mover el topo mas lento o mas rapido.

Agregar una etiqueta para recordar y mostrar cuantas veces aparecio el topo.

Agregar un segundo SpriteImagen con una foto de algo que el jugador NO deberıa

tocar, como una flor o una bomba por ejemplo. Si lo toca, sera penalizado con puntos

o puede que termine el juego.

En vez de usar la foto de un topo, deja que el usuario seleccione una foto con el

componente SelectorDeContacto.

36

4. animaciones usando sprites

4. Animaciones Usando Sprites

¿Como animar Sprites?

Los componentes SpriteImagen son objetos especiales que representan figuras que se

mueven por la pantalla. A partir de ahora los llamaremos simplemente sprites. Los sprites

estan especialmente disenados para la creacion de animaciones y videojuegos, y deben utili-

zarse dentro de un componente Lienzo. Dentro de un lienzo, el sprite tiene una Direccion,

una Velocidad y un Intervalo. Ademas, un sprite puede colisionar con los bordes del lienzo,

y con otros sprites. La Figura 4.1 como se orienta un sprite dentro del lienzo. La direccion

del sprite se representa mediante un angulo, entre 0 y 360 grados. El angulo 0 representa

el movimiento hacia la derecha, y el angulo 180 hacia la izquierda. Ademas, los bordes del

lienzo estan identificados por numeros, como se ve en la figura.

Figura 4.1: Configuracion del Lienzo para la animacion de Sprites.

¿Como reduces la velocidad de un sprite, suavemente, a 100 pixeles por segundo?

La velocidad de un SpriteImagen, que se mide en pixeles por segundo, es determinada por

dos propiedades. La propiedad Intervalo especifica cada cuantos milisegundos el sprite se va

a mover, y es muy similar a la propiedad Reloj.IntervaloDelTemporizador. La propiedad

Velocidad especıfica cuantos pixeles el sprite se movera en cada intervalo. En el ejemplo

que se muestra en la Figura 4.2 el sprite se mueve 5 pixeles cada 50 milisegundos, o 1 pıxel

cada 10 milisegundos—o sea, 100 pixeles/segundo.

Figura 4.2: Ajustando la direccion, velocidad e intervalo de un sprite.

La propiedad de Direccion del sprite especifica la direccion en la cual se mueve. Como

se ilustra en la Figura 4.2, el sprite se movera hacia abajo con una orientacion de 270 grados.

Ejemplo 2: ¿Como hacer rebotar una pelota? AppInventor tiene un bloque Botar

que provoca que una pelota rebote en el borde del lienzo. Tıpicamente se usa Botar dentro

37

4. animaciones usando sprites

del controlador de eventos Pelota.TocarBorde, dado que este controlador de eventos indica

cual borde ha sido alcanzado, como parametro, por lo que puedes conectar este parametro

en la funcion Botar—que necesita saber desde que borde rebotar.

Tambien puedes hacer rebotar otros objetos (sprites o pelotas). El controlador de eventos

EnColisionCon se activa cuando dos objetos chocan. Sin embargo, la funcion Botar sola-

mente funciona en el borde de un lienzo, ası que no puede usarse para colisiones en general.

Lo que sı puedes hacer es hacer rebotar el sprite o pelota en la direccion opuesta a la que

tenıa antes de la colision, configurando su Orientacion como 360 menos el valor actual.

Esto se ilustra en la Figura 4.3.

Figura 4.3: Programando una Pelota para que rebote al tocar el borde, y para que inviertasu direccion al chocar con otro sprite u objeto animado.

Desafıos Animados

Desafıo 1: Animacion Basica Para los siguientes desafıos, necesitaras un componente

Lienzo que ocupe todo lo ancho de la pantalla y que tenga unos 300 pixeles de Alto. Agrega

un boton con texto “Iniciar!” abajo del lienzo. Crearas dos aplicaciones distintas:

1. Mover a la izquierda, abajo y en diagonal usando un Reloj.

Agregar un componente Reloj y tres componentes Pelota en el Lienzo. Cuando se

hace click en el boton Iniciar las pelotas deben empezar a moverse dentro del lienzo

(puedes obtener un movimiento suave al configurar el Intervalo de tiempo del Reloj

en 50 milisegundos). Una pelota deberıa ir hacia abajo, otra a la izquierda y otra en

diagonal. Las pelotas deben parar cuando tocan el borde del lienzo. Para este desafıo

38

4. animaciones usando sprites

usa solo 1 componente Reloj y NO uses las propiedades de animacion internas del

componente Pelota (velocidad etc.).

2. Mover a la izquierda, abajo y en diagonal usando una animacion de Sprite.

Para este desafıo vas a repetir el comportamiento del punto anterior pero sin usar un

componente Reloj. En vez de eso, utiliza las propiedades de animacion internas del

componente Pelota: Velocidad, Intervalo y Direccion.

Discusion: Velocidad y Cuadros por Segundo

1. ¿Que tan rapido se estaban moviendo tus objetos en el ejercicio anterior?

2. ¿Como determinar la velocidad de tus objetos cuando usas: a) una animacion Sprite

b) un contador de tiempo?. Indica una formula para cada caso.

3. Los Cuadros por Segundo (CPS) es una medicion usada en pelıculas y animaciones.

Indica cuantas veces por segundo la pelıcula se actualiza. ¿Que CPS se necesita para

que el cambio no sea notado por el ojo humano? (Puedes buscarlo en Google)

4. ¿Cual es el CPS de un juego si el IntervaloDelTemporizador es de 100 milisegundos.

5. Ejercicio de codigo: modifica uno de tus aplicaciones para que un objeto se mueva 50

pixeles por segundo y otro objeto se mueva a 100 pixeles por segundo.

Desafıo 2: Ida y Vuelta Crea nuevas aplicaciones para los comportamientos siguientes:

1. Cuando se presiona un boton, una pelota hace idas y vueltas perpetuas en la pantalla.

Hazlo sin un componente Reloj (o sea, con una animacion de Sprite/Pelota).

Hazlo con un componente Reloj.

2. Cuando se presiona un boton, una pelota se mueve haciendo idas y vueltas perpetuas

desde el borde izquierdo de la pantalla hasta la mitad de la pantalla.

Hazlo sin un componente Reloj (o sea, con una animacion de Sprite/Pelota).

Hazlo con un componente Reloj.

39

5. tutorial: pong

5. Tutorial: Pong

En este tutorial aprenderas a programar una version sencilla del clasico juego Pong .

Hacer este juego te ayudara a familiarizarte con la animacion de sprites, a manejar colisiones,

y a definir procedimientos para que ası puedas programar mejor!

A diferencia de los tutoriales anteriores, en este tutorial te entregaremos un esqueleto

de la aplicacion, con la interfaz de usuario ya desarrollada. Tu mision es programar los

comportamientos de los distintos elementos del juego.

La interfaz de usuario final para la aplicacion se muestra en la Figura 5.1:

Figura 5.1: Interfaz de usuario del juego Pong

Para programar este juego debes seguir los siguientes pasos:

1. Programa una Pelota que se mueva en direccion hacia abajo. La pelota inicia su

movimiento cuando se presiona el boton “Empezar” (Figura 5.2).

40

5. tutorial: pong

Figura 5.2: La pelota se mueve hacia abajo cuando comienza el juego.

2. En el programa anterior la pelota es muy predecible, porque siempre va en lınea recta

hacia abajo desde el medio de la pantalla. Ahora programa la pelota para que baje en

una direccion aleatoria—pero que aun es hacia abajo ¿Que angulos son “hacia abajo”?

(Figura 5.3).

Figura 5.3: La pelota se mueve hacia abajo en una direccion aleatoria.

3. Programa los rebotes de la pelota: contra los bordes y contra la barra.

Figura 5.4: La pelota rebota al tocar los bordes y al colisionar con la barra.

41

5. tutorial: pong

4. Programa la barra para que se mueva cuando el usuario arrastre el dedo. La barra solo

se mueve horizontalmente (o sea, solo en la coordenada X) (Figura 5.5).

Figura 5.5: La barra se mueve segun el usuario arrastre el dedo sobre ella.

5. Modifica el programa para obtener 1 punto cada vez que la barra golpea la pelota. Para

esto vas a usar un procedimiento con argumentos, averigua por ti mismo, o consulta a

tu tutor al respecto (Figura 5.6).

Figura 5.6: Aumentando el puntaje cada vez que se golpea la pelota con la barra.

6. Modifica el programa para que el juego termine si la pelota choca con el borde de abajo

(Figura 5.7).

42

5. tutorial: pong

Figura 5.7: El juego termina cuando la pelota choca con el borde de abajo.

7. Agrega un componente Sonido y modifica el programa para agregar distintos efectos

de sonido cuando la pelota choca en la barra, toca los bordes, y para el fin del juego

(los archivos ya vienen incorporados en el proyecto inicial, ver Figura 5.8).

Figura 5.8: Efectos de sonido para las colisiones, toque de bordes y fin del juego.

8. Agrega un component CasillaDeVerificacion para que el usuario puede apagar/prender

el sonido (Figura 5.9).

43

5. tutorial: pong

Figura 5.9: La reproduccion de sonidos depende del valor de la casilla de verificacion.

44

6. proyecto: crea tu propio juego o aplicacion

6. Proyecto: Crea tu Propio Juego o Aplicacion

Crea una aplicacion con animaciones similares–pero mas complejas—que en el juego

Atrapa el Topo y Pong .

La aplicacion debe tener las siguientes funcionalidades:

Objetos que se mueven en el tiempo (por ejemplo una nave espacial que atraviesa la

pantalla).

Objetos que se mueven o son transformados en reaccion a la actividad del usuario (por

ejemplo el sensor de orientacion para controlar el movimiento).

Objetos que aparecen o desaparecen en reaccion a las actividades del usuario (por

ejemplo, un asteoride que desaparece cuando recibe un disparo).

Uso de bloques condicionales.

Uso de bloques EnColisionCon y TocarBorde.

¡Se creativo! No necesitas crear un juego, puedes crear lo que tu quieras mientras muestre

todos los comportamientos listados arriba. Comparte tu idea con tu tutor y asegurate que

tienes todos los comportamientos requeridos.

45

7. material de apoyo

7. Material de Apoyo

El Componente Lienzo

El componente Lienzo es una subseccion dentro de tu aplicacion. El lienzo se usa para

dibujar y hacer animaciones—tu app puede dibujar objetos, y puedes dar al usuario la

capacidad de dibujar objetos.

Normalmente vas a necesitar que el lienzo llene por completo el ancho de la pantalla

de la app, entonces tendras que ajustar la propiedad Ancho con la opcion “Ajustar al

contenedor”. Por lo general vas a necesitar tener otros elementos abajo o arriba, por lo que

configuraras el Alto como un numero fijo de pixeles.

La ubicacion de un objeto en el lienzo se define con coordenadas X, Y relativas a la

esquina arriba e izquierda del lienzo. X es la ubicacion horizontal del objeto, siendo 0 el

borde izquierdo y X creciendo cuando el objeto se mueve hacia la derecha. Y es la ubicacion

vertical, con 0 siendo el borde superior e Y creciendo cuando el objeto se mueve hacia abajo.

Conceptualmente el lienzo se comporta como una rejilla, tal como se ilustra en la Figura 7.1.

Figura 7.1: Un lienzo con ancho de 19 pixeles y altura de 12 pixeles. Se muestran los puntosen coordenadas (0,0), (3,3) y (19, 0).

Ejemplo: ¿Como dibujar un cırculo en (10,10)? El lienzo tiene bloques funcionales

para dibujar un cırculo o una lınea. El cırculo tiene tres parametros x, y y un radio r. x es

la ubicacion horizontal, y es la ubicacion vertical, y r es el radio del cırculo por dibujar. Si

x tiene un valor de 10 significa que el cırculo sera ubicado 10 pixeles a la derecha del borde

izquierdo del lienzo. Si y tiene un valor de 10 significa que el cırculo sera ubicado 10 pixeles

abajo del borde superior del lienzo. La Figura 7.2 muestra como dibujar un cırculo en la

coordenada (10,10) y con radio de 5 pixeles.

46

7. material de apoyo

Figura 7.2: Dibujando un cırculo en el lienzo, en la coordenada (10,10) y con radio 5 pixeles.

Ejemplo: ¿Como dibujar un cırculo en el lugar donde el usuario toca el lienzo?

La funcionalidad “touch” (tactil) se activa cuando el usuario toca con el dedo en el lienzo.

Tiene parametros x e y que indican la ubicacion del toque. El parametro SpriteTocado espe-

cifica si el toque ocurrio o no en un SpriteImagen (esto no influye en su comportamiento).

Para dibujar el cırculo donde el usuario toco el lienzo, debes pasar el mouse sobre los

parametros x e y para arrastrar los bloques tomar para cada uno, y luego conectarlos en

los espacios para x e y del bloque DibujarCırculo. No te confundas con lo siguiente: los

parametros del evento Tocar tienen el mismo nombre que los espacios libres para especi-

ficar la ubicacion del cırculo en DibujarCırculo, pero son valores independientes y con

conceptualizacion diferente. La Figura 7.3 muestra el codigo descrito anteriormente.

Figura 7.3: Dibujando un cırculo en el lugar donde el usuario toca el lienzo.

Ejemplo: ¿Como mover una imagen al centro del lienzo? Los bloques de la Fi-

gura 7.4 ubican el SpriteImagen1 en el centro del lienzo usando las propiedades Ancho

y Alto. Dichas referencias abstractas significan que el codigo funcionara aunque el lienzo

cambie de tamano.

47

7. material de apoyo

Figura 7.4: Codigo para posicionar un sprite en el centro del lienzo.

Una alternativa es poner numeros fijos para X e Y, despues del bloque SpriteIma-

gen1.MoverA. Es muy similar a como (10, 10) fue usado en el ejemplo anterior. ¿Sabes

porque es sustraıda la mitad del alto y ancho del sprite?

Fijate que no existe un bloque DibujaImagen como DibujarCırculo. En vez de eso,

con el Disenador arrastras los componentes SpriteImagen en un lienzo y especificas la

imagen (una foto) que define su apariencia. No hay forma de crear sprites dinamicos con

bloques, solo se pueden hacer visibles o invisibles, y se puede cambiar su ubicacion, tal como

se muestra en este ejemplo.

Variables

¿Cuando defines una variable? Una aplicacion memoriza cosas, tiene una memoria

“escondida”. Puedes imaginartelo como una hoja de calculo (o planilla) dentro del “cerebro”

privado de la aplicacion. Tu, el programador, controlas su memoria. Cuando arrastras un

componente en tu aplicacion (por ejemplo un boton, un cuadro de texto), cada componente

tiene una serie de propiedades. Estas propiedades son celdas de tu hoja de calculo que puedes

modificar.

Tambien puedes definir nuevas celdas en tu planilla, cuando necesitas recordar algo: se

llaman variables. Defines una variable cuando no existe en el componente una propiedad

para almacenar la informacion que necesitas.

Ejemplo: ¿Como hacer para que cada vez que el usuario hace click se agranda

el cırculo? Como se ilustra en la Figura 7.5, cuando se toca el Lienzo1 se llama a Lien-

zo1.DibujarCırculo para dibujar un cırculo donde se hizo el touch, en las coordenadas (x,

y). El radio r no puede ser un numero fijo si queremos un tamano de cırculo distinto cada

vez. La variable Tama~noCırculo se usa para seguir y recordar el tamano de los cırculos cada

48

7. material de apoyo

vez que se dibuja uno. Se inicializa Tama~noCırculo en 1 para que el primer cırculo que se

dibuje sea solo un pequeno punto. Luego, al final del controlador de eventos Lienzo1.Tocar

el tamano del cırculo se duplica. Entonces la segunda vez el cırculo tendra un radio 2, luego

4, luego 8, etc. La variable Tama~noCırculo se necesita porque no hay ninguna propiedad

del componente que se pueda usar. Por ejemplo, el componente Lienzo tiene una propiedad

AnchoDeLınea, entonces si estuvieses dibujando lıneas no necesitarıas definir una varia-

ble porque podrıas usar esta propiedad. Pero el lienzo no tiene una propiedad “Tamano de

Cırculo”, por lo que debes definirla tu mismo usando una variable.

Figura 7.5: Usando una variable para controlar el radio de los cırculos dibujados.

Temporizadores

Actividades Temporizadas

¿Como programar el tiempo? ¿Como programar una animacion?. En otros lenguajes de

programacion, los conceptos de animacion se ven mucho mas adelante, pero con la metodo-

logıa de AppInventor puedes explorar este concepto desde el inicio. El componente Reloj

sirve de alarma, y puedes usar su funcion de temporizador para iniciar una actividad con

tiempos especıficos.

Mira los siguientes ejemplos:

Ejemplo: ¿Como tocar un sonido cada 1 segundo? Como muestra la Figura 7.6 esto

se puede hacer cuando se activa el evento Reloj.Temporizador de manera repetida. Convie-

ne pensar en el temporizador como una alarma, donde la propiedad Reloj.IntervaloDelTemporizador

determina cada cuanto se toca el sonido (por defecto son 1000 milisegundos, o 1 segundo).

49

7. material de apoyo

Entonces si no lo cambias el sonido se escuchara cada segundo. Puedes configurar esta pro-

piedad en el Disenador o dinamicamente usando bloques.

Figura 7.6: Reproducir un sonido cada 1 segundo

Ejemplo 2: ¿Como tocar un sonido cada 5 segundos? Como se dijo anteriormente,

la propiedad Reloj.IntervaloDelTemporizador determina cada cuanto se toca el sonido.

Por defecto esta configurado en 1000 milisegundos (1 segundo). Si lo configuras en 5000, el

evento Reloj.Temporizador se activara cada 5 segundos, como se muestra en la Figura 7.7.

Figura 7.7: Reproducir un sonido cada 5 segundos

Puede ser un poco confuso e indirecto tener que cambiar el intervalo en el Disenador

para luego especificar el comportamiento en el Editor de Bloques. La clave es comprender

que el temporizador se gatillara como un evento cada Reloj.IntervaloDeTemporizador

milisegundos.

Ejemplo 3: ¿Como desplazas una nave espacial suavemente por la pantalla? Asu-

mamos que tienes un SpriteImagen que representa una nave espacial. La coordenada X de

la nave espacial define su posicion horizontal. Para generar el movimiento hay que hacer que

cada evento del temporizador aumente la coordenada X, para que ası la nave aparezca un

poco mas a la derecha, como se muestra en la Figura 7.8. Si el IntervaloDelTemporiza-

dor tiene su propiedad por defecto en 1000 milisegundos, entonces la nave se movera cada

segundo. Para este tipo de animacion, configuraras el intervalo en 40 milisegundos.

50

7. material de apoyo

Figura 7.8: Mover una nave espacial por la pantalla.

Ejemplo 4: Una pelıcula es una secuencia de imagenes que se muestran muy

rapidamente La frecuencia de cuadros de una imagen en movimiento es el numero de

imagenes que aparece cada segundo. Si configuras el intervalo de tiempo para la nave espacial

en 40 milisegundos, ¿cual sera la frecuencia de cuadro de tu pelıcula? ¿Cual es la tıpica

frecuencia de cuadro de una pelıcula que ves en el cine?

Si el intervalo esta configurado en 40 milisegundos, el objeto se movera cada 40 milisegun-

dos. Entonces cada cuadro—cada nueva imagen con la nave en un lugar distinto—aparecera

por 40 milisegundos. Los cuadros por segundo (frames per second o FPS en ingles) son una

unidad de medida para contabilizar cuantos cuadros aparecen en un segundo (1000 mili-

segundos) es el numero de cuadros que aparecen en un segundo (1000ms). Dado que cada

cuadro mide 40 milisegundos, terminaras con 1000/40=25 cuadros por segundo. En el cine,

lo estandar es tener 24 cuadros por segundo.

¿Como iniciar y detener una animacion?

De la misma manera que puedes activar y apagar una alarma, puedes activar y desactivar

el componente Reloj. Mira los siguientes ejemplos:

Ejemplo 1: Reproducir un sonido cada 1 segundo, con botones “Iniciar” y “De-

tener” El Reloj tiene una propiedad TemporizadorHabilitado. Cuando esta propiedad

es marcada como verdadera, la alarma esta activa y el temporizador se inicia. Cuando se

marca como falsa, el temporizador esta desactivado.

Cuando el usuario presiona el boton Iniciar, la propiedad TemporizadorHabilita-

do se marca como verdadera y un segundo despues, y por cada segundo, el evento Re-

loj.Temporizador se activa y el sonido se escuchara. Cuando el usuario hace click en el

boton “Detener”, el timer se desactiva y el sonido se detiene. El codigo correspondiente se

muestra en la Figura 7.9

51

7. material de apoyo

Figura 7.9: Cambiar la propiedad TemporizadorHabilitado del Reloj.

Ejemplo 2: Cuando el usuario habla, la nave empieza a moverse. Cuando el

usuario sacude el telefono, la nave se detiene. Para esto necesitas dos componentes

adicionales, un ReconocimientoDeVoz que puede reconocer cuando el usuario esta ha-

blando, y un Acelerometro que detecta cuando se sacuda el telefono. El codigo se muestra

en la Figura 7.10.

Figura 7.10: Moviendo la nave cuando el usuario habla, y deteniendola cuando se agita eldispositivo.

El controlador de evento Pantalla.Inicializar se activa cuando se inicia la aplicacion.

El bloque ReconocimientoDeVoz.ObtenerTexto abre el sensor de voz para que espe-

re que el usuario diga algo. Cuando el usuario habla, se activa el controlador de evento

ReconocimientoDeVoz.SensorVoz.DespuesDeObtenerTexto. En este controlador de

eventos configuraras la propiedad Reloj.TemporizadorHabilitado como verdadera para

que el temporizador se active y ası el sprite se empiece a mover. Cuando el usuario sacude el

telefono, se activa el Acelerometro, y se desactiva el temporizador para que pare el sprite se

detenga, y se vuelva a invocar a ReconocimientoDeVoz.ObtenerTexto, para que espere

la proxima vez que el usuario hable.

Ası como las personas necesitan recordar cosas, tambien las aplicaciones lo necesitan. En

este material de apoyo volveremos al tema de las variables, pero ahora con mayor profundidad

52

7. material de apoyo

y detalle. Como vimos anteriormente, la idea esencial de usar variables es programar una

aplicacion para que recuerde informacion.

Cuando alguien te dice el numero de telefono de una pizzerıa, tu cerebro lo almacena

en una celda de memoria. Si alguien menciona algunos numeros para que tu los sumes, tu

tambien almacenas estos numeros y los resultados intermedios en una celda de memoria.

En estos casos, no estas totalmente conciente de como tu cerebro almacena o recuerda la

informacion.

Una aplicacion tambien tiene memoria, pero su funcionamiento interno es mucho menos

misterioso que el de tu cerebro. Ahora veremos en detalle como manejar la memoria de una

aplicacion, como almacenar informacion en ella, y como recuperar esa informacion en un

momento posterior.

Celdas de Memorias Definidas: Como Programar la Memoria de tu

Aplicacion

La memoria de una aplicacion consiste de una serie de celdas de memoria definidas. Al-

gunas de estas celdas de memoria se crean cuando arrastras un componente en tu aplicacion.

Estas celdas (o espacios abiertos) se llaman propiedades. Tambien puedes definir celdas de

memoria definidas que no sean asociadas con un componente especıfico. Estas se llaman

variables. Aunque las propiedades estan tıpicamente asociadas a lo que es visible en la app,

las variables pueden ser asociadas a la memoria escondida de la aplicacion.

Propiedades

Tu, como usuario de una aplicacion, puedes ver componentes visibles como botones, cua-

dros de texto y etiquetas. Pero adentro, cada componente es completamente definido por una

serie de propiedades. Los valores almacenados en la memoria de cada propiedad determina

como aparece el componente. Tu configuras los valores de las propiedades directamente en

el Disenador de Componentes. Por ejemplo, la Figura 7.11 muestra el panel para modificar

las propiedades de un componente Lienzo.

53

7. material de apoyo

Figura 7.11: Hoja de propiedades para un componente lienzo.

El componente Lienzo tiene varias propiedades de distintos tipos. Por ejemplo el Co-

lorDeFondo y el ColorDePintura son celdas de memoria que contienen un color. La

propiedad ImagenDeFondo contiene un nombre de archivo (como gatito.png).

La propiedad Visible contiene un valor booleano (verdadero o falso, dependiendo si se

selecciona la opcion o no). El Ancho y Alto contienen un numero o una designacion especial

(por ejemplo, “Ajustar al Contenedor”).

Cuando configuras una propiedad en el Disenador de Componentes, especificas el valor

inicial de esta propiedad, o sea su valor cuando se inicia la aplicacion. Los valores de las

propiedades tambien pueden ser modificados cuando la aplicacion se ejecuta, mediante el

uso de bloques. Pero, al cambiar los valores durante la ejecucion, los valores que aparecen en

el Disenador de Componentes no cambian—estas propiedades siempre muestran solamente

los valores iniciales. Esto puede confundir cuando pruebas una aplicacion, pues el valor actual

de las propiedades de la aplicacion cuando se ejecuta no son visibles.

54

7. material de apoyo

Definir Variables

Al igual que las propiedades, las variables son celdas de memoria, pero que no estan

asociadas a un componente en particular. Se define una variable cuando necesitas que tu

aplicacion guarde algo en memoria que no haya sido guardado ya en una propiedad de un

componente. Por ejemplo, puede ser que un juego tenga que recordar el nivel alcanzado por

el usuario. Si el numero del nivel apareciera en un componente Etiqueta, no necesitarıas

una variable, porque podrıas simplemente almacenar el nivel en la propiedad de Texto de

la etiqueta. Pero si el numero de nivel no es algo que sera visible por el usuario, necesitas

definir una variable para guardar esta informacion.

Otra diferencia es que mientras que las propiedades se crean automaticamente cuando

arrastras un componente en el Disenador, las variables se definen explıcitamente en el Editor

de Bloques al arrastrar un bloque “inicializar global nombre”. Puedes nombrar la variable

al hacer click en el texto que dice “nombre” dentro del bloque, y puedes especificar un

valor inicial al arrastrar un bloque (numero, texto, color, lista) y conectarlo al bloque de

inicializacion. Por ejemplo, para crear una variable llamada “marcador” con un valor inicial

de 0, sigue los siguientes pasos, que se muestran en la Figura 7.12:

1. Arrastra el bloque “inicializar global nombre” desde la seccion “Variables” hacia el

espacio de trabajo.

2. Cambia el nombre de la variable al hacer click en el texto “nombre” y escribe “marca-

dor”.

3. Configura el valor inicial de la variable al arrastrar un bloque numerico, con valor 0, y

conectarlo con la definicion de la variable.

Figura 7.12: Inicializando la variable global marcador con valor 0.

Cuando defines una variable, pides a la aplicacion crear una celda de memoria para

guardar un valor. Estas celdas de memoria, como las propiedades, no son visibles por el

usuario cuando funciona la aplicacion.

55

7. material de apoyo

El bloque de inicializacion que conectas en la declaracion de la variable especifica el valor

que estara en la celda cuando se inicia la aplicacion. A parte de inicializar con numeros

o texto, tambien puedes inicializar la variable con un bloque crear una lista vacıa o

construye una lista. Esto indica a la aplicacion que la variable guardara un listado de

celdas de memoria en lugar de un solo valor. Trabajaremos con listas en el Dıa 4 del taller.

“Poner” y “Tomar” una Variable

Cuando defines una variable, AppInventor crea dos bloques para ella, un bloque poner y

un bloque tomar. Puedes acceder a estos bloques al pasar el mouse por encima del nombre

de la variable en el bloque de inicializacion, como se ve en la Figura 7.13.

Figura 7.13: El bloque de inicializacion contiene bloques de configurar y obtener para estavariable.

El bloque poner global marcador te permite modificar el valor almacenado en la

variable. Por ejemplo, los bloques de la Figura 7.14 indican un 5 en la variable marcador. El

termino global en el bloque se refiere al hecho de que la variable puede ser usada en todos los

controladores de eventos y procedimientos del programa. La nueva version de AppInventor

permite tambien definir variables locales, que son especıficas a un controlador de eventos o

a un procedimiento especıfico.

Figura 7.14: Poner un numero 5 en la variable marcador.

El bloque tomar global marcador permite obtener o rescatar el valor de una variable.

Por ejemplo, si quieres chequear si el valor dentro de la celda de memoria era superior a 100,

tienes que conectar el bloque tomar global marcador en un bloque condicional, tal como

se muestra en la Figura 7.15.

56

7. material de apoyo

Figura 7.15: Usando el bloque marcador global para obtener el valor almacenado en lavariable.

Configurar una Variable como Expresion

En las variables puedes poner valores simples, como 5, pero frecuentemente configuraras

la variable como una expresion mas compleja (expresion es el termino informatico que se

le da a una formula o calculo). Por ejemplo, cuando alguien pierda 10 puntos en un juego,

necesitas modificar la variable marcador como “10 menos que su valor actual”. Otro ejemplo

es en un juego como Atrapa el Topo, cambias la ubicacion horizontal (x) del topo a

una ubicacion aleatoria dentro del lienzo. Tanto los valores simples como las expresiones

complejas se conectan al argumento del bloque poner global.

Incrementar una Variable

Tal vez la expresion mas comun es para incrementar una variable, o configurar una

variable basado en su propio valor actual. Por ejemplo, en un juego, cuando el jugador

marca un punto, la variable marcador puede ser incrementada en 5 puntos. La Figura 7.16

ilustra los bloques que hay que usar para programar este comportamiento.

Figura 7.16: Se incrementa la variable marcador en 5 puntos.

Si puedes entender este tipo de bloques, vas bien encaminado para convertirte en un

programador!

Estos bloques se leen de la siguiente manera: “configurar el marcador como 5 veces mas

que su valor actual”, que es una manera para decir, incrementa la variable en 5. El codigo

funciona de la siguiente manera: los bloques se leen de adentro hacia afuera—no de izquierda

57

7. material de apoyo

a derecha. Entonces se lee primero el bloque “tomar global marcador” y el numero 5. Luego

el bloque de suma es ejecutado y el resultado se pone en la variable marcador.

Suponiendo que hubiera un 10 en la celda de memoria para marcador antes de ejecutar

estos bloques, la aplicacion ejecutarıa los siguientes pasos:

1. Obtener el 10 de la celda de memoria marcador, mediante la evaluacion del bloque

tomar.

2. Sumar 5 con el 10 obtenido, para obtener 15.

3. Poner el resultado, 15, en la celda de memoria marcador, mediante la evaluacion del

bloque poner.

Construir expresiones complejas

En la seccion “Matematicas” del Editor de Bloques, AppInventor provee un amplio con-

junto de funciones matematicas similares a las que podras encontrar en una planilla de Excel

o en una calculadora. La Figura 7.17 muestra estas funciones.

Figura 7.17: Los bloques contenidos en la seccion “Matematicas”.

58

7. material de apoyo

Puedes usar estos bloques para construir una expresion compleja y conectarla en el lado

derecho de un bloque poner global. Por ejemplo, para mover un sprite a una columna

aleatoria dentro de los bordes de un lienzo, tienes que configurar una expresion que consiste

de una multiplicacion, una resta, una propiedad Lienzo.Ancho, una propiedad SpriteI-

magen.Ancho y un bloque entero aleatorio, como se muestra en la Figura 7.18.

Figura 7.18: Puedes usar bloques de “Matematicas” para construir expresiones complejas.

Al igual que el ejemplo anterior sobre como incrementar una variable, los bloques se leen

desde adentro hacia afuera. Suponiendo que el Lienzo tiene un Ancho de 300 pixeles y el

SpriteImagen tiene un Ancho de 50 pixeles, la aplicacion ejecutarıa los siguientes pasos:

1. Obtener el 300 y el 50 de las celdas de memoria para Lienzo1.Ancho y SpriteIma-

gen1.Ancho, respectivamente.

2. Restar: 300 −−50 = 250.

3. Llamar a la funcion entero aleatorio para obtener un numero entre 0 y 1 (por ejemplo

0,5).

4. Multiplicar: 250 ∗ 0,5 = 125.

5. Poner el 125 en la celda de memoria para la propiedad X de SpriteImagen1.

Mostrar las Variables

Cuando modificas la propiedad de un componente, como en el ejemplo previo, la interfaz

de usuario se modifica directamente. Esto no es cierto para las variables: cambiar una variable

no tiene efecto directo en la apariencia de la aplicacion. Si solamente incrementaste una

variable marcador pero no modificaste la interfaz de usuario de alguna otra manera, el

usuario no podra saber que hubo un cambio. Es como un arbol que se cae en el bosque: si

nadie estuvo para escucharlo, ¿ocurrio de verdad?

A veces no quieres que se manifieste el cambio en la interfaz de usuario cuando cambia

una variable. Por ejemplo, en un juego puedes hacer un seguimiento estadıstico (tiros fallidos)

que solamente aparecera al terminar el juego.

59

7. material de apoyo

Esta es una de las ventajas de guardar datos en una variable, en comparacion con la

propiedad de un componente: te permite mostrar los datos que quieres en el momento que

elijas. Tambien te permite separar la parte computacional de tu aplicacion de la interfaz de

usuario, facilitando cambios posteriores de dicha interfaz.

Por ejemplo, en un juego podrıas guardar el marcador directamente en una Etiqueta o

en una variable. Si lo guardas en una etiqueta, tienes que incrementar las propiedades de

texto de la etiqueta cuando se marcan puntos, y el usuario vera los cambios directamente.

Si guardaste el marcador en una variable y se incrementa la variable cada vez que se marcan

puntos, tendrıas que incluir bloques para tambien escribir el valor de la variable en una

etiqueta.

Sin embargo, si decidieras cambiar la aplicacion para mostrar el marcador de una manera

distinta, por ejemplo con una barra de color, la opcion de una variable serıa mas facil de

cambiar. No necesitarıas modificar todos los lugares donde aparece el marcador sino que

solamente tendrıas que modificar los bloques que muestran el marcador.

Variables locales

Hasta el momento hemos hablado de variables globales que se definen con un bloque

inicializar global. Global se refiere al hecho que la variable se puede usar en todos los

procedimientos y controladores de eventos de la aplicacion. AppInventor tambien te permite

definir variables locales, es decir, variables cuyo uso es restringido a un solo controlador de

eventos o procedimiento, como se muestra en la Figura 7.19.

Figura 7.19: Puedes definir una variable de alcance restringido (local).

Si la variable es requerida en un solo lugar, es una buena idea definirla como local en vez

de global. Al proceder de tal manera, limitas las dependencias en tu aplicacion y te aseguras

de que no modificaras una variable por error. Imagina que una variable local es como tu

memoria privada en tu cerebro—no quieres que otros cerebros puedan tener acceso a ella!

60

7. material de apoyo

Resumen

Cuando inicias una aplicacion, esta empieza a ejecutar sus operaciones y a responder a

eventos que ocurren. Al responder a eventos, la aplicacion a veces necesita recordar cosas.

Para un juego, puede ser que tenga que recordar el marcador de cada jugador o la direccion

en la cual se mueve un objeto.

Tu aplicacion recuerda cosas con propiedades de componentes, pero cuando necesitas

memoria adicional no asociada a un componente, puedes definir variables. Puedes almacenar

valores dentro de una variable y recuperar el valor actual, de la misma manera que con las

propiedades. Como los valores de propiedades, los valores variables no son visibles para el

usuario final. Si quieres que el usuario final vea la informacion almacenada en una variable,

agregas bloques que muestran esta informacion en una etiqueta u otro componente de la

interfaz de usuario.

61