Beruflich Dokumente
Kultur Dokumente
-1-
Indice
-2-
Tema 1
Introduccin al desarrollo con
Corona SDK
Corona es un kit de desarrollo de software que permite la creacin de
aplicaciones mviles para iPhone, iPad y dispositivos Android.
Tiene una versin gratuita para desarrollar que se puede descargar desde
el siguiente enlace:
https://developer.coronalabs.com/downloads/corona-sdk
-3-
LUA es un lenguaje de programacin imperativo (se basa en estados
de la aplicacin que podemos ir modicando mediante sentencias),
estructurado y bastante ligero
Caractersticas de Corona
-4-
Instalacin de Corona SDK
Para obtener la versin gratuita del framework, con la que podremos crear
aplicaciones de manera ilimitada, tendremos que crearnos una cuenta de
desarrollador en la web ocial de Corona
http://www.coronalabs.com/
-5-
Con la instalacin obtendremos una carpeta en nuestra mquina con las
siguientes aplicaciones
-6-
Contamos con tres aplicaciones para poder acceder al Simulador de
Corona (Corona Simulator, Corona Terminal y debugger)
Las tres nos dan acceso al mismo simulador, slo que las dos ltimas se
acompaan de herramientas para poder realizar la depuracin de cdigo a
travs del terminal.
-7-
Para editar el cdigo de nuestro proyecto se usar el editor de texto que
tengamos denido por defecto en nuestra mquina. Para cambiar esto
tendremos que cambiar la aplicacin asociada a los archivos de tipo .lua
-8-
Ejercicios Tema 1
Ejercicio 1
-9-
Procedemos a instalar el ejecutable que hemos descargado de la web y
tendremos acceso a la carpeta con las herramientas de Corona SDK, en el
directorio donde hayamos especicado durante la instalacin. Los
ejecutables que se han instalado en nuestra mquina son los siguientes:
- 10 -
Si hacemos doble click sobre la aplicacin Corona Simulator, abrimos la
interfaz principal para desarrollar con Corona SDK
- 11 -
En el men de la aplicacin podemos acceder a File -> Open.. y si
accedemos a la carpeta Sample Codes del directorio donde hemos instalado
Corona SDK, podemos observar un gran nmero de ejemplos.
Prueba a ejecutar algunos ejemplos que vienen por defecto con Corona SDK
para visualizar cmo se ven reejados en el simulador.
Ampliacin 1
Ejercicio 2
Para acceder al cdigo que se est ejecutando slo hay que abrir el men de
la aplicacin en la ruta File -> Open project in Editor...
- 12 -
Tema 2
Empezar a programar con LUA
LUA
Se pretende que Lua sea usado como un lenguaje de script potente y ligero
para cualquier programa que lo necesite.
LUA -Variables
- 13 -
Existen 8 tipos bsicos en Lua:
Tanto nil como false hacen que una condicin sea falsa, cualquier otro valor
la hace verdadera
String representa una tira de caracteres. Lua trabaja con 8 bits. Los strings
pueden contener cualquier carcter de 8 bits.
Debido a que las funciones en Lua son valores de primera clase los campos
de las tablas pueden contener funciones, por lo que las tablas pueden
contener tambin mtodos.
- 14 -
Las variables pueden ser de tres tipos: locales, globales y campos de tabla
Por defecto todas las variables son de tipo global a no ser que sean
declaradas explcitamente como locales, con la palabra reservada local.
LUA -Tablas
Las tablas son variables utilizadas para almacenar dentro otros valores.
Sera el tipo equivalente a lo que conocemos como arrays en otros lenguajes
de programacin.
- 15 -
Para acceder a los valores almacenados en una tabla tambin podemos
proceder de varias maneras:
- 16 -
La funcin table.concat recoge una tabla de strings o de nmeros y
devuelve otro string concatenando todos los valores de la tabla.
- 17 -
LUA - Control de ujo
if n == 1 then
print (N es 1) Dependiendo del valor de N,
elseif n == 2 then obtendremos el mensaje
print (N es 2) correspondiente a travs
elseif n == 3 then del Terminal
print (N es 3)
end
while [condicion] do
n=2
while n<10 do Mientras que la variable n sea menor que 10,
print(n) mostrar en el terminal el valor de n
- 18 -
n = n+1
end
Debemos controlar en el interior del bucle la condicin de salida para evitar
que la ejecucin del bucle sea innita
Bucle for
end
Otra de las formas de realizar un for y que suele ser de bastante utilidad en
el recorrido tablas es:
for i, v in ipairs(a) do
end
local tabla = {Enero, Febrero, Marzo, Abril} Este ejemplo nos mostrar a travs del
for i, mes in ipairs(tabla) do Terminal todos los elementos de la
print (mes) tabla, en este caso, 4 meses
end
- 19 -
LUA Funciones
En Lua, las funciones pueden llevar tantos parmetros como sea necesario,
siempre incluidos entre parntesis. Incluso puede no llevar ninguno
[return valorDevuelto]
end
- 20 -
Ejercicios Tema 2
Ejercicio 1 - Hola Mundo Lua
-----------------------------------------------------------------------------------------
--
-- main.lua
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
--
-- main.lua
-----------------------------------------------------------------------------------------
Ejercicio 2
Ejercicio 3
- 22 -
Tema 3
Formas, Imgenes y Texto
Con el mtodo newLine podemos especicar una lnea recta entre dos
puntos
Los colores deben especicarse con valores especcos para el Rojo, Verde
y Azul. El nmero que debe indicarse debe estar entre 0 y 255.
- 23 -
local recta =
display.newLine( 100,50, 270,350 )
recta:setColor( 1, 0, 0 )
recta.width = 6
- 24 -
Si almacenamos la creacin de nuestro rectngulo en una variable,
podemos modicar el relleno y el trazo.
Los colores se denen indicando los valores de Rojo, Verde y Azul con
nmeros entre 0 y 1. No obstante, si se dene un nico parmetro se
trabajar con una escala de grises, siendo 1 el blanco y 0 el negro.
local miRoundRect =
display.newRoundedRect(135, 200, 150, 150, 20)
miRoundRect.strokeWidth = 3
miRoundRect:setFillColor( 1, 1, 0)
miRoundRect:setStrokeColor(0, 0, 1) - 25 -
display.newCircle( xCenter, yCenter, radius )
Imgenes
Con este mtodo podemos situar en nuestra aplicacin imgenes. Para ello
debemos incluir las imgenes en el directorio de nuestra aplicacin y a travs
del parmetro lename debemos especicarle la ruta exacta donde poder
encontrarlas.
- 26 -
display.newImage ("img/corona.jpg", 200, 250)
imagen:setFillColor( 1, 0, 0 )
imagen.isVisible = true
imagen:removeSelf()
- 27 -
display.loadRemoteImage
( url, method, listener, destFilename [, baseDir] [, x, y] )
El parmetro baseDir, que es opcional, nos sirve para indicar dnde vamos
a guardar la nueva imagen dentro del sistema de archivos de nuestro
dispositivo.
- 28 -
local function networkListener( event )
if ( event.isError ) then
print ( "Error en la red - Fallo en la descarga" )
end
end
display.loadRemoteImage( "http://developer.anscamobile.com/demo/hello.png",
"GET", networkListener, "helloCopy.png", system.DocumentsDirectory, 160,200)
Estamos lanzando una peticin GET sobre la url indicada para que nos
devuelva la imagen. La respuesta de esta imagen la estamos tratando en el
mtodo networkListener y le indicamos que se guarde en el directorio de
documentos por defecto con el nombre helloCopy.png. La situamos en el
punto (160,200) dentro de nuestra vista.
Manipulando imgenes
Contamos con una serie de mtodos que nos permiten modicar las
propiedades ms importantes de nuestras imgenes:
- 29 -
local img = display.newImage ("img/corona.jpg")
img.x = 200
img.y = 300
- 30 -
local img = display.newImage ("img/corona.jpg", 160,230)
img.xScale = 3
img.yScale = 5
- 31 -
local img = display.newImage ("img/corona.jpg", 190,175)
img.width = 250
img.height = 50
graphics.newMask( lename )
Con este mtodo podemos crear mscaras a partir de una imagen, la cual
denimos a travs de lename, para aplicrselas a otras imgenes
diferentes.
- 32 -
local img = display.newImage ("img/corona.jpg", 175,200)
img.width = 190
img.height = 190
Manejando Texto
A travs del parmetro font podemos denir la fuente que vamos a usar
para el texto. Se puede especicar las fuentes del sistema por defecto con
native.systemFont y native.systemFontBold
Para obtener una lista con todas las fuentes disponibles, podemos ejecutar
el cdigo siguiente, con la llamada al mtodo native.getFontNames()
- 33 -
Con el parmetro size, especicamos el tamao del texto, denido en
pxeles
- 34 -
Ejercicios Tema 3
Ejercicio 1
- 35 -
El polgono creado para la copa del rbol no se puede rellenar sin usar
complejos algoritmos en los que no vamos a entrar de momento.
- 36 -
Ejercicio 2
Ejercicio 3
- 37 -
Para ello, podemos usar la funcin de la librera graphics newGradient.
color1 y color2 son dos tablas que determinan el color de inicio y el color de
n (Ej: {1,1,1})
- 38 -
Tema 4
Eventos e interaccin
Detectando eventos
Existen muchas maneras para detectar los Eventos. Por ejemplo, cada uno
de los elementos de nuestra aplicacin puede ser tratado como un botn
interactivo. Esto nos ofrece una gran exibilidad a la hora de estructurar
nuestras interfaces grcas.
La funcin addEventListener
Con esta funcin vamos a poder indicar qu evento vamos a registrar sobre
un objeto en concreto y cmo vamos a proceder a tratarlo.
- 39 -
Eventos Globales
enterFrame
Runtime:addEventListener("enterFrame", capturarEvento )
System
- 40 -
Podemos acceder a la propiedad type del evento para saber qu se est
lanzando. Los diferentes tipos para el evento system son:
Runtime:addEventListener("system", capturarEvento )
Orientation
- 41 -
entre la orientacin inicial y la nal.
accelerometer
Este evento slo puede ser tratado por dispositivos con soporte para
acelermetro.
- 42 -
Heading
En este caso vamos a ser capaces de detectar los eventos generados por
la brjula del dispositivo, si est disponible. Hay que tener en cuenta que el
simulador de Corona no detecta este tipo de eventos
memoryWarning
- 43 -
Touch Events
Los eventos se propagan entre todos los objetos con capacidad para
tratarlo hasta que uno de ellos lo capture y ejecute el cdigo correspondiente
para manejarlo.
Touch
Las propiedades del evento a las que podemos acceder son las siguientes:
- 44 -
Los diferentes estados a los que podemos acceder dentro del evento de
toque son los siguientes:
touch (multitouch)
Lo primero que debemos hacer para permitir los eventos con varios toques
sobre la pantalla es decrselo a nuestra aplicacin con la siguiente sentencia:
system.activate( "multitouch" )
- 45 -
Una vez tengamos esto activado, cuando se reciban mltiples toques, estos
se trataran individualmente, recogindose en sus respectivos listeners. Lo
nico que tendrn en comn, ser su propiedad de timestamp.
object:dispatchEvent(event)
-- Conguramos el listener
local myListener = function( event )
print( "Evento " .. event.name )
print( "Target tiene un ancho de: " ..
event.target.contentWidth )
end
- 46 -
Ejercicios Tema 4
Ejercicio 1
Vamos a crear un botn que nos permita mostrar una imagen. Para ello
vamos a dibujar un botn en nuestra vista
- 47 -
local function listener(event)
if event.phase == "began" then
local img = display.newImage ("corona.png", 0,0)
img.width =200
img.height = 200
img.x = 150
img.y = 300
end
return true
end
Ejercicio 2
- 48 -
Debes detectar los cambios de orientacin del dispositivo, para organizar el
contenido de la siguiente manera:
Puedes usar los mtodos rotate y translate de los objetos para situarlos
dependiendo de la orientacin.
- 49 -
Tema 5
Timers y Animaciones
Timer
Muchas veces puede ser de utilidad para nuestra aplicacin ejecutar cierta
funcin en el futuro en vez de inmediatamente.
Para ello tenemos la librera timer que nos provee de varios mtodos para
poder llevar a cabo esta tarea.
- 50 -
El cdigo a continuacin realiza las mismas acciones que el primer ejemplo
que hemos expuesto.
A parte de poder lanzar funciones cada cierto tiempo, la librera timer nos
ofrece otros mtodos para poder interactuar con las ejecuciones futuras que
realicemos:
timer.pause ( timerId )
timer.resume ( timerId )
- 51 -
(timerId) sobre el que anteriormente hubiramos ejecutado el mtodo pause
timer.cancel ( timerId )
Transitions
La librera Transitions nos permite crear animaciones con una nica lnea
de cdigo con la posibilidad de modicar una o ms propiedades de alguno
de los elementos mostrados en nuestras vistas.
- 52 -
- params.time - especica el la duracin de la transicin
enmilisegundos
- params.transition - por defecto la transicin es lineal
- params.delay - indica el retardo hasta que comience la transicin
- params.delta - se trata de un valor booleano que indica si los
parmetros animables son tomados como valores nales o como
cambios sobre lo que ya exista.
- params.onStart - funcin que se ejecuta cuando comienza la
animacin.
- params.onComplete - funcin ejecutada cuando se completa la
animacin
- 53 -
Movieclips
Movieclip es una librera externa que nos permite crear animaciones de tipo
sprite (una serie de imgenes que ejecutadas en serie crean una animacin)
Movieclips
Con esto declaramos que vamos a usar una librera llamada movieclip.lua,
la cual debe estar localizada en el mismo directorio que el archivo .lua donde
la estemos importando.
movieclip:newAnim (frames)
- 54 -
que sern, en el orden que ocupen, las encargadas de conformar nuestro
movieclip.
myAnim =
movieclip.newAnim{ "img1.png", "img2.png", "img3.png", "img4.png" }
movieclip:play()
movieclip:reverse ()
- 55 -
eliminar una vez terminada.
movieclip:nextFrame ()
movieclip:previousFrame ()
movieclip:stop ()
movieclip:stopAtFrame (frame)
movieclip:setDrag
Con limitX y limitY denimos los lmites en el eje de las x y en el eje de las
y hasta donde vamos a poder arrastrar nuestra animacin.
El parmetro bounds dene los lmites del objeto que nos permiten
- 56 -
arrastrarlo. Est denido como {left, top, width, height} movieclip:setDrag
myAnim:setDrag{
drag=true,
limitX=false,
limitY=false,
onPress=myPressFunction,
onDrag=myDragFunction,
onRelease=myReleaseFunction,
Bounds={ 10, 10, 200, 50 }
}
- 57 -
Ejercicios Tema 5
Ejercicio 1
En este primer ejercicio vamos a tratar con una imagen de tipo sprite para
realizar diferentes operaciones aprendidas en este tema.
http://developer.anscamobile.com/demo/Movieclip.zip
- 58 -
animacion.x = display.contentWidth / 2
animacion.y = display.contentHeight / 2
animacion:play()
Nuestro siguiente paso en el ejercicio ser crear una serie de botones, los
cuales ejecutarn una serie de transiciones sobre la animacin que hemos
creado.
AMPLIACIN
Para este ejercicio vamos a crear una lluvia de objetos. Cada X tiempo
crearemos un objeto y simularemos la animacin para que recorra la pantalla
de arriba abajo, simulando una lluvia. Debemos usar para esto los timer y
sus funciones relacionadas aprendidas en este tema.
NOTA: Para poder hacer que cada objeto se genere en una posicin
aleatoria, podemos usar el mtodo math.random
- 60 -
Tema 6
Motor Fsico
Cualquier objeto, imagen o sprite puede ser tratado como una unidad
fsica y automticamente empezar a interactuar con otros objetos dentro de
la simulacin.
Los siguientes mtodos sirven para manejar el uso del motor fsico durante
nuestra aplicacin.
physics.start ()
- 61 -
physics.stop ()
physics.pause ()
physics.setGravity (x , y)
physics.setGravity (0,9.8)
physics.getGravity ()
gx, gy = physics.getGravity ()
- 62 -
physics.setScale (x)
El valor por defecto es 30, lo que signica que los valores fsicos situados
entre 0.1m y 10m estaran cubiertos entre las coordenadas 3 y 300 de
nuestra vista, aproximadamente.
physics.setDrawMode (text)
- 63 -
Deteccin de Colisiones
Este evento incluye fases incluye diferentes fases, began y ended, las
cuales hacen referencia al momento de inicio de la colisin y al momento de
n, respectivamente.
Como sabemos, Corona trata los objetos como tablas LUA, por lo que
podremos agregar, a nuestros objetos las propiedades que nos interesen a la
hora de tratarlos en el cdigo.
- 65 -
Deteccin de Colisiones - Eventos Locales
...
bloque1.collision = onLocalCollision
bloque1:addEventListener("collision", bloque1)
bloque2.collision = onLocalCollision
bloque2:addEventListener("collision", bloque2)
- 66 -
Cuando termina una colisin podemos obtener la fuerza directa entre los
dos objetos, as como la fuerza lateral entre los mismos, la cual es una
fuerza de friccin.
- 67 -
Para poder determinar los valores de mscara que debemos usar para
cada uno de los ltros, podemos usar la siguiente tabla de colisiones:
Cuerpos Fsicos
Podremos seguir accediendo a las propiedades del objeto antes del cambio
pero, en este caso, el objeto estar sujeto a todas las propiedades fsicas
proporcionadas por el motor de Corona, como puede ser la gravedad.
- 68 -
Con esta funcin transformamos un objeto simple de Corona en una
simulacin fsica del mismo capaz de interactuar con el motor fsico de la
aplicacin.
La tabla con las propiedades fsicas puede ser declarada fuera y usada en
varios componentes.
- 69 -
Para crear polgonos ms complejos, debemos especicar cada uno de los
vrtices como un par de coordenadas mediante la propiedad shape. Estas
coordenadas deben declararse siguiendo el orden de las agujas del reloj.
- 70 -
Ejercicios Tema 6
Ejercicio 1
Para este primer ejercicio vamos a crear una estructura mediante la cual
podamos apreciar, sin salir de la aplicacin, de los diferentes modos que
tenemos a nuestra disposicin dentro del motor fsico para representar los
diferentes objetos dentro de nuestra aplicacin.
Una vez inicializada la librera, vamos a crear todos los objetos dentro de
nuestra vista, las imgenes, el suelo, para que no se pierdan los objetos en
el innito y 3 botones que nos van a permitir alternar entre las diferentes
opciones para mostrar estos objetos dentro del motor fsico:
-- Aadimos estos botones al motor fsico para poder verlos en los diferentes
modos
physics.addBody (rectanguloRojo, "static", { density=1.0})
physics.addBody (rectanguloVerde, "static", { density=1.0})
physics.addBody (rectanguloAzul, "static", { density=1.0})
Nuestro siguiente paso ser rellenar los mtodos que controlan los eventos
de pulsacin de los botones:
- 72 -
podemos analizar los diferentes estados fsicos de los objetos representados
con diferentes colores:
AMPLIACIN
Modica las imgenes del ejercicio y utiliza alguna que sea de tipo crcular,
adaptando el objeto fsico para que se adapte a la forma de la nueva imagen.
Ejercicio 2
Modica el ejercicio anterior para realizar un ltro de los objetos. Cada uno
de los objetos cumplir un comportamiento determinado:
-El primer objeto no colisionar ni con el suelo ni con los botones, por lo
que se perder en el innito de nuestra aplicacin
-El segundo objeto no colisionar con el suelo, pero s con los botones.
- 73 -
Tema 7
Hardware y Multimedia
Corona nos ofrece una serie de libreras y mtodos para poder acceder a la
informacin del sistema donde se est ejecutando nuestra aplicacin.
system.info (param)
- 74 -
platformVersion - obtenemos la versin de la plataforma donde
ejecutamos la aplicacin.
system.getTimer ()
system.openURL (url)
- Mail: mailto:contacto@viveahora.travel
- Telfonos: tel:666888999
- Webs: http://viveahora.travel
system.vibrate ()
- 75 -
En todos los dispositivos tenemos una serie de directorios denidos por el
sistema a los cuales podemos acceder con las siguientes constantes:
system.DocumentsDirectory
system.TemporaryDirectory
system.ResourceDirectory
Sistema de Audio
audio.loadSound (le)
- 76 -
Con este primer mtodo, cargamos el audio entero en memoria y as lo
tenemos disponible a la hora de reproducirlo. Realiza un gran uso de
memoria, por lo tanto es el mtodo menos aconsejable para aplicaciones con
problemas de rendimiento.
audio.loadStream (le)
audio.play (bomba)
audio.play (bomba)
audio.play (bomba)
audio.play (bomba)
audio.play (bomba)
audio.play (bomba)
audio.play (bomba)
audio.play (musica1)
audio.play (musica2) - 77 -
Al utilizar los streams, la carga en memoria es ms reducida que de la
manera que hemos visto anteriormente.
event.name - soundCompletion
event.channel
- 78 -
audio.stop ([channel])
audio.pause ([channel])
audio.resume ([channel])
audio.stopWithDelay (duration)
- 79 -
Vdeo
- 80 -
Captura de imgenes
settings =
{
android =
{
usesPermissions =
{
"android.permission.CAMERA",
"android.permission.WRITE_EXTERNAL_STORAGE",
},
},
}
- 81 -
Para el caso especico de desarrollar para el iPad, necesitamos especicar
dos parmetros adicionales.
media.PhotoLibrary
media.Camera
media.SavedPhotoAlbum
- 82 -
Si utilizamos este mtodo, ya no recibiremos el objeto event.target en el
mtodo listener.
if photo then
print( "photo w,h = " .. photo.width .. "," .. photo.height )
end
end
button:addEventListener("tap", tomarPhoto )
- 83 -
eventos lanzados por el acelermetro en el mtodo indicado para ello.
Para poder obtener los diferentes valores segn la posicin del dispositivo,
podemos acceder a las propiedades event.xGravity, event.yGravity,
event.zGravity
Mediante el uso de event.isShake sabremos si el movimiento que ha
realizado el dispositivo es una agitacin.
- 84 -
Ejercicios Tema 7
Ejercicio 1
Vamos a practicar con la API para el manejo de sonidos que nos ofrece
Corona, creando un pequeo reproductor de audio como el que podemos ver
en la siguiente captura:
Lo primero que vamos a hacer es colocar los diferentes objetos que tenemos
en nuestra vista:
Aparte, en cada uno de los mtodos, debemos actualizar el estado del texto
para indicarnos en qu situacin est la reproduccin.
- 86 -
para llevar la cuenta del tiempo reproducido, as como el texto donde
pondremos los detalles:
local tiempoTranscurrido = 0
local reproducido
- 87 -
EJERCICIO 2
- 88 -
sonar.
NOTAS:
rectangulo1.pistaAudio = audio1
rectangulo1.canal = 1
EJERCICIO 3
Realizar una aplicacin que nos permita capturar una imagen a travs de la
cmara del dispositivo. Una vez capturada, mostrarla en un tamao reducido.
Permitir, al tocar la imagen capturada, que esta, se amplie ocupando todo el
ancho y alto de la pantalla.
- 89 -
Tema 8
Gestin de Mapas y GPS
Mapas
- 90 -
settings =
{
android =
{
usesPermissions =
{
-- Required by the MapView to fetch its contents from the Google Maps servers.
"android.permission.INTERNET",
-- Optional permission used to display current location via WiFi or cellular service.
"android.permission.ACCESS_COARSE_LOCATION",
},
usesFeatures =
{
-- If you set permissions "ACCESS_FINE_LOCATION" and "ACCESS_COARSE_LOCATION" above,
-- then you may want to set up your app to not require location services as follows.
-- Otherwise, devices that do not have location sevices (such as a GPS) will be unable
-- to purchase this app in the app store.
{ name = "android.hardware.location", required = false },
{ name = "android.hardware.location.gps", required = false },
{ name = "android.hardware.location.network", required = false },
},
},
}
- 91 -
Atributos del Mapa
- 92 -
El valor por defecto es false.
isVisible = myMap.isLocationVisible
Este valor est basado en una aproximacin, por lo que puede llevar
a errores cuando la posicin est en los lmites del mapa.
myLocation = myMap:getUserLocation ()
Los valores que podemos encontrar dentro de esta tabla son los
siguientes:
- 93 -
longitude | latitude | altitude | accuracy | time | speed | direction | isUpdating
myMap:removeAllMarkers()
- 94 -
Geocoding
- 95 -
event.isError - indica si la conexin nos devuelve algn tipo de error
- 96 -
Ejercicios Tema 8
Ejercicio 1
Hay que sealar que Corona trata los mapas como otro objeto ms de
nuestra aplicacin por lo que podremos aplicarle si queremos cualquier
funcionalidad tpica de tratamiento de imgenes como rotar el mapa o
moverlo por la pantalla.
Para comprobar los distintos modos de vista que poseen nuestros mapas
vamos a crear tres botones en la parte inferior de nuestra aplicacin.
Una vez creados los botones, les aadiremos los manejadores para controlar
los eventos de pulsado, y estos controladores cambiaran el tipo de vista del
mapa.
Ampliacin 1
El ltimo botn deber eliminar todas las marcas que hayamos colocado
anteriormente
Ejercicio 2
Para utilizar este servicio, es tan fcil como llamarlo de la siguiente manera:
system.openURL("comgooglemaps://")
system.openURL("comgooglemaps://? center=40.765819,-
73.975866&zoom=14&views=traffic&mapmode=streetview")
- 98 -
Para asegurarnos de que Google Maps no va a dejarnos colgados por
cuestiones ajenas a nuestra aplicacin, podemos asegurarnos de que google
maps ha funcionado, y en caso de fallo redirigir a Apple Maps de la siguiente
manera:
Ampliacin 2
- 99 -
Tema 9
Diseando la interfaz de usuario
Interfaces
Mediante podemos acceder a diferentes caractersticas nativas del
dispositivo donde estemos ejecutando nuestra aplicacin.
Podemos acceder con una simple lnea de cdigo a las alertas del
dispositivo, campos para creacin de formulario, vistas de carga... etc.
Interfaces
Activity Indicator
native.setActivityIndicator (state)
native.setActivityIndicator( true )
- 100 -
Alertas
- 101 -
end
native.cancelAlert (alert)
Fuentes
Campo de Texto
Crea un campo de texto de una sola lnea para introducir texto en las
coordenadas especcas con el tamao indicado.
- 102 -
object.hasBackground - es true cuando el campo de texto tiene
fondo y false si es transparente.
object.size - el tamao del texto.
object.text - cadena que contiene el texto del campo.
local defaultField
end
end
Web Popups
- 103 -
el tamao que ocupar (width, height)
- 104 -
Ejercicios Tema 9
Ejercicio 1
Para este primer ejercicio, el primer paso va a ser crear una aplicacin como
la siguiente:
Como podemos ver, solo hemos dado opcin para dos botones .
- 105 -
local function yesPressed(event)
if("clicked"==event.action) then
local i = event.index
if (i == 2) then
--nothing
elseif (i == 1) then
system.openURL( "http://www.imaginaformacion.com" )
end
end
end
Ampliacin 1
- 106 -
Ampliacin 2
- 107 -
Tema 10
Entrada y Salida
Ficheros
Las rutas para cada uno de los cheros son nicas dentro de nuestra
aplicacin.
- 108 -
Para la lectura de cheros utilizaremos la librera io provista por Lua.
- 109 -
local path = system.pathForFile( "data.txt", system.DocumentsDirectory )
En el ejemplo anterior hemos seguido los mismos pasos que para leer de
chero, solo que esta vez hemos utilizado el mtodo write.
- 110 -
io.ush( ) equivalente a le:ush, libera los buses de escritura en un chero
io.input([le]) llamado con el nombre de un chero, abre dicho chero en
modo texto y lo asocia al manejador por defecto, llamado con el manejador
de chero simplemente asocia dicho manejador al denido por defecto. En
caso de error esta funcin propaga el error en vez de devolver un cdigo de
error.
- 111 -
le:seek([whence] [, oset]) modica y obtiene la posicion del chero
mediante el string whence y el desplazamiento oset, siendo los posibles
valores de whence:
set inicio del chero
cur posicion actual
end nal del chero
JSON
Recuerda que para utilizar una libreria integrada en corona solo hace falta
utilizar require json y almacenar su valor en una variable local.
{
"name": "Jack (\"Bee\") Nimble",
"format": {
"shape": "rect,
"width": 1920,
"height": 1080,
"interface": false,
"framerate": 24
}
}
- 112 -
Si tu JSON esta almacenado en un chero .json que tienes en tu directorio,
debers leer dicho chero y almacenarlo en una variable, para ello te
aconsejamos que utilices una funcin como la que te mostraremos a
continuacin:
- 113 -
local t = json.decode( jsonFile( "sample.json" ) )
Si tienes una tabla Lua y quieres transformarla en JSON solo tienes que
utilizar la funcin inversa de decode, es decir, encode. A continuacin un
ejemplo:
Base de datos
La API que provee las funciones para utilizar bases de datos SQLite estan
disponibles en luaforge.net/projects/luasqlite/ as como la documentacin se
puede leer en luasqlite.luaforge.net/lsqlite3.html.
require "sqlite3"
local db = sqlite3.open_memory()
db:exec[[
CREATE TABLE test (id INTEGER PRIMARY KEY, content);
INSERT INTO test VALUES (NULL, 'Hello World');
INSERT INTO test VALUES (NULL, 'Hello Lua');
INSERT INTO test VALUES (NULL, 'Hello Sqlite3')
]]
- 114 -
local t = display.newText(row.content, 150, 120 * row.id, null, 16)
t:setTextColor( 1, 0, 1)
end
--Include sqlite
require "sqlite3"
--Open data.db. If the file doesn't exist it will be created
local path = system.pathForFile("data.db", system.DocumentsDirectory)
db = sqlite3.open(path)
- 115 -
Ejercicios Tema 10
Ejercicio 1
Y por ltimo vamos a hacer que lea el texto del chero, mostrndose el
contenido por la Terminal:
local le = io.open(path,"r")
local contenido=le:read("*a")
print(contenido)
- 116 -
Ampliacin 1
Si solo quisiera leer las lineas pares hasta el nal del texto, cmo podra
conseguirlo? Implemntalo.
Ejercicio 2
En este ejercicio vamos a crear una tabla Lua y a partir de ella vamos a
obtener un archivo JSON.
Ahora deberemos transformar nuestra tabla lua a un valor JSON , y para ello
utilizamos la funcin encode que nos proporciona Corona.
Ampliacion 2
Ahora que ya sabemos crear cheros .json a partir de tablas lua vamos a
- 117 -
hacer el paso contrario. Utilizando un .json cualquiera, el que habis creado
antes o cualquiera que descarguis de Internet, decodicarlo a una tabla lua
y luego mostrarlo por consola.
Ejercicio 3
En este ejercicio vamos a crear una base de datos y a insertar unas las.
Para ello primero creamos la base de datos y la tabla en caso de no existir.
require "sqlite3"
local path = system.pathForFile("miBaseDeDatos.db",
system.DocumentsDirectory)
db = sqlite3.open( path )
local function onSystemEvent( event )
if( event.type == "applicationExit" ) then
db:close()
end
end
local tablesetup = [[CREATE TABLE IF NOT EXISTS tablaTrabajadores (id
INTEGER PRIMARY KEY, nombre, puesto, salario);]]
print(tablesetup)
db:exec( tablesetup )
- 119 -
Tema 11
Composer y Widget
Composer
- 120 -
local composer = require "composer"
local scene = composer.newScene()
scene:addEventListener( "createScene" )
-- cleanup function:
function scene:destroyScene( event )
print( "Called when scene is unloaded." )
end
scene:addEventListener( "destroyScene" )
return scene
Las funciones bsicas para moverse entre escenas seran las siguientes
- 121 -
Las posibles transiciones pueden ser las siguientes:
fade
zoomOutIn
zoomOutInFade
zoomInOut
zoomInOutFade
Flip
FlipFadeOutIn
zoomOutInRotate
zoomOutInFadeRotate
zoomInOutRotate
zoomInOutFadeRotate
crossFade
- 122 -
Widget
Son elementos muy tiles que nos ayudarn a disear interfaces complejas
de forma rpida y sencilla
Como siempre recordar que para utilizar una libreria primero hay que
importarla
- 123 -
Para crear un Checkbox sera el siguiente:
- 124 -
Para crear un On/O Switch sera el siguiente:
- 125 -
La implementacin del botn quedara de la siguiente manera
local tabButtons =
{
{
id = "Tab1",
label = "Tab1",
labelColor = { default = {0,0,0}, over = {1,1,1} },
onPress = onPress,
selected = false
},
{
id = "Tab2",
label = "Tab2",
labelColor = { default = {0,0,0}, over = {1,1,1} },
onPress = onPress,
selected = true
},
--more tabs can follow
}
- 126 -
Para colocar el tab bar en pantalla, podemos utilizar el siguiente cdigo
El ltimo widget que vamos a exponer es el Table View, pero hay muchos
ms widgets que os animamos a seguir estudiando en las APIs de Corona
- 127 -
Para utilizar un Table View necesitaremos crear un manejador tanto de la
tabla como de las las
print( event.phase )
end
- 128 -
A la hora de crear la tabla, primero deberemos crear la tabla como tal, y
luego aadiremos las las a dicha tabla.
-- Create a tableView
local tableView = widget.newTableView
{
top = 100,
width = 320,
height = 366,
maskFile = "assets/mask-320x366.png",
listener = tableViewListener,
onRowRender = onRowRender,
onRowTouch = onRowTouch,
}
- 129 -
Ejercicios Tema 11
Ejercicio 1
- 130 -
},
{
width = 32,
height = 32,
defaultFile = "icon2.png",
overFile = "icon2-down.png",
Ahora que hemos creado el main, deberemos crear tantos cheros como
escenas queramos en nuestra aplicacin. Para nuestro caso crearemos 3
escenas las cuales cambiarn al pinchar en la imagen.
- 131 -
return true
end
end
Ahora aadimos los controladores para manejar los eventos producidos por
los cambios de escenas
fondo = display.newRect(0,0,320,480)
fondo:setFillColor(250,250,250)
screenGroup:insert(fondo)
- 132 -
Ampliacin 1
Ejercicio 2
- 133 -
local function onButtonEventAzul( event )
local phase = event.phase
local target = event.target
if ( "began" == phase ) then
print( target.id .. " pressed" )
target:setLabel( "Pressed" )
--set a new label
fondo:setFillColor(0,0,255)
elseif ( "ended" == phase ) then
print( target.id .. " released" )
target:setLabel( "Azul" )
--reset the label
fondo:setFillColor(255)
end
return true
end
Ampliacin 2
- 134 -
Tema 12
Motor Fsico - Parte 2
Adems puesto que cualquier forma simple debe ser cncava, cualquier
forma convexa deber formarse con mltiples formas simples
Cada body element tendr sus propias propiedades, junto con su forma
denida para detectar las colisiones.
- 135 -
Un sensor es un cuerpo simple o complejo que produce colisiones pero no
interacta con otros cuerpos.
Todos los objetos sean simples o complejos pueden ser sensores si tienen
la propiedad isSensor a true.
Los cuerpos pueden ser eliminados como cualquier otro objeto de display
myBody:removeSelf()
-- or
myBody.parent:remove( myBody )
- 136 -
body.angularVelocity indica con un valor numrico su velocidad
angular
kinematic son como los estticos pero pueden ser movidos por
fuerzas diferentes de la gravedad. Los objetos que se pueden
arrastrar, suelen ser kinematic al menos durante el tiempo en
el que se ejecute el arrastre
body:applyLinearImpulse(fuerzaX,fuerzaY,puntoX,puntoY) es
como applyForce solo que aplica un solo impulso, es decir, es una
fuerza momentnea. Podra usarse para simular una explosin
- 137 -
event.element1
event.element2
event.selfElement
event.otherElement
Los joints o articulaciones son objetos que sirven como unin para objetos
complejos a partir de cuerpos rgidos. Por ejemplo, con joints se podran
crear cadenas o marionetas.
Hay varios tipos bsicos de joints, los mas sencillos son los pivot joint con
los cuales puedes unir dos objetos en un mismo punto de unin. un ejemplo
sera una cadena.
Los distance joint los cuales unen dos cuerpos mediante una distancia
ja.
Los piston joint une dos cuerpos mediante un eje de movimiento, como
los pistones del motor de un coche.
Los wheel joint combinan el piston y el pivot joint de manera que aunque
siempre estn a la misma distancia ambos cuerpos se mueven con libertad.
El pivot joint como hemos explicado antes une dos cuerpos por un
determinado punto.
Por defecto, los joint motors tienen una rotacin mxima as como una
velocidad de motor.
myJoint.isMotorEnabled (boolean)
myJoint.motorSpeed
myJoint.motorTorque -- (get-only)
- 138 -
myJoint.maxMotorTorque -- (set-only)
myJoint:setRotationLimits( -45, 45 )
a1, a2 = myJoint:getRotationLimits()
Pueden tener un motor como el pivot joint solo que este es lineal
myJoint.isMotorEnabled (boolean)
myJoint.motorSpeed -- (linear speed, in units of pixels per second)
myJoint.motorForce -- (get-only)
- 139 -
myJoint.maxMotorForce -- (set-only)
myJoint.isMotorEnabled (boolean)
myJoint.motorSpeed -- (linear speed, in units of pixels per second)
myJoint.motorForce -- (get-only)
myJoint.maxForce = 10000
force = myJoint.maxForce
- 140 -
myJoint.frequency = 50
frequency = myJoint.frequency
myJoint.dampingRatio = 0.2
damping = myJoint.dampingRatio
- 141 -
Ejercicios Tema 12
Ejercicio 1
Para ello lo primero ser iniciar el motor fsico y crear las paredes de nuestra
aplicacin, quedando algo similar a la imagen.
physics.start()
physics.addBody(suelo,"static",{friction=0.6})
physics.addBody(paredIzq,"static",
{bounce=0.1,friction=0.1})
physics.addBody(paredDer,"static", {bounce=0.1,friction=0.1})
physics.addBody(techo,"static",{bounce=0.1,friction=0.1})
Una vez ya tenemos creadas las paredes vamos a proceder a crear las
cadenas y las uniones entre ellas, para lo cual el tipo de joint que mejor nos
viene es el pivot joint.
- 142 -
local cadenaJoints={}
local link ={}
for i=1,5 do
link[i] = display.newImage("link.png")
link[i].x = 100
link[i].y = 56 + (i*24)
physics.addBody(link[i],{density=2.0, friction=0.3, bounce=0})
if(i>1) then
prevLink = link[i-1]
cadenaJoints[#cadenaJoints + 1] =
physics.newJoint("pivot",prevLink,link[i],100,46 + (i*24))
end
end
local nunchaku={}
nunchaku[1] = display.newRect(100,33,20,55)
nunchaku[1]:setFillColor(0.6,0.1,0.1)
physics.addBody(nunchaku[1],{density=1.0, friction=0.3,bounce=0.3})
cadenaJoints[#cadenaJoints+1] =
physics.newJoint("pivot",link[1],nunchaku[1],100,55)
nunchaku[2] = display.newRect(100,222,20,55)
nunchaku[2]:setFillColor(0.6,0.1,0.1)
physics.addBody(nunchaku[2],{density=1.0, friction=0.3,bounce=0.3})
cadenaJoints[#cadenaJoints+1] =
physics.newJoint("pivot",link[5],nunchaku[2],100,200)
- 143 -
stage:setFocus(body,event.id)
body.isFocus = true
if params and params.center then
body.tempJoint = physics.newJoint("touch",
body,body.x,body.y)
else
body.tempJoint =
physics.newJoint("touch",body,event.x,event.y)
end
body.tempJoint.maxForce = 0.7*body.tempJoint.maxForce
elseif body.isFocus then
if (phase == "moved")then
body.tempJoint:setTarget(event.x,event.y)
elseif (phase == "ended" or phase == "cancelled") then
stage:setFocus(body,nil)
body.isFocus = false
body.tempJoint:removeSelf()
end
end
return true
end
El touch joint tiene bastantes parmetros con los que jugar que harn que
nuestro nunchaku se comporte de una manera distinta. Prueba a variar los
parmetros utilizados o incluso aadir nuevos parmetros de los explicados
en la teora.
Para nalizar lo nico que nos queda es asociar el manejador del touch joint
con los mangos de los nunchakus. Lo cual sera de la siguiente manera.
nunchaku[1]:addEventListener("touch",dragBody)
nunchaku[2]:addEventListener("touch",dragBody)
Ampliacin 1
Haz una aplicacin con la cual seas capaz de disparar un can o una bala
mediante el pulsado de un botn. Para ello debers utilizar los mtodos
body:applyLinearImpulse o body:applyForce y comprueba como varia su
comportamiento.
- 144 -
Ampliacin 2
- 145 -