Full text
Proyecto Fin de Carrera MEMORIA! Curso de introducción a la programación de videojuegos para dispositivos móviles en Corona SDK AUTOR Carlos Lorenzo Paricio DIRECTOR Ramón Piedrafita Moreno ESPECIALIDAD Electrónica Industrial CONVOCATORIA Marzo 2012 ! !
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&2&8& ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&3&8& RESUMEN! Desde&la&aparición&en&el&mercado&de&dispositivos&móviles&con&altas&prestaciones& asociados&a&la&evolución&de&la&tecnologia,&estos&han&abierto&un&lio&mercado¶&el& desarrollo&de&videojuegos&&y&dotan&de&una&potencia&grafica&similar&a&la&que&posee&un& entorno&de&juegos&portátil&tradicional&como&pueden&ser&la&consolas&portátiles&Sony&PSP& o&Nintendo&DS.&& & El&objetivo&de&este&proyecto&es&desarrollar&una&aplicación&genérica& multiplataforma&optimizada¶&Ipad,&ya&sea¶&su&primera&o&segunda&versión,&que& nos&permita&aprender&a&programar&videojuegos&2D¶&dispositivos&móviles&que& aunque&no&exploten&todo&el&potencial&que&posee&el&dispositivo,&es&el&genero&mas& descargado&de&las&tiendas&de&aplicaciones&&móviles&dada&su&adicción&y&dado&que&el& consumo&de&batería&es¬ablemente&inferior&que&en&los&videojuegos&en&3D,&ya&que& estos&últimos&necesitan&mas&prestaciones.&& & Para&este&fin,&se&ha&generado&una&aplicación&didáctica&que&nos&permite& introducirnos&en&el&mundo&de&la&programación&de&videojuegos&en&este&tipo&de& dispositivos&,&en&ella&se&distinguen&diferentes&secciones.&Por&una&parte&se&muestran&& capitulos&relacionados&con&el&lenguaje&de&programación&de&Corona&SDK,&por&otro&lado& otros&donde&se&desarrollan&videojuegos&por&completo&y&se&muestra&su&programación& mediante&ejemplos&y&también&aparece&otra&sección&con&juegos&totalmente&funcionales.& & En&este&proyecto&también&se&realiza&un&estudio¶&conocer&los&entornos&de& desarrollo&de&los&diferentes&sistemas&operativos&móviles&y&varias&opciones&de& desarrollo&multiplataforma&que&existen&en&la&actualidad.&& & Al&final&se&ha&elegido&dadas&sus&caracteristicas&un&software&multiplataforma& llamado&Corona&SDK,&permite&la&programación&de&dispositivos&con&iOS&(Iphone,&IPod&y& IPad),&Android(numerosos&dispositivos&en&el&mercado)&y&recientemente¶& Amazon/KIndle.&Tiene&un&alto&rendimiento&y&permite&la&utilización&de&sus&componentes& nativos.&&Recalcar&que&varias&aplicaciones&desarrolladas&con&Corona&SDK&han&sido& lideres&en&descargas&en&la&“AppStore”&y&“Android&Market”&por&lo&que&se&demuestra&su& gran&potencial&y&se&puede&considerar&como&una&opción&alternativa&a&otros&entornos&de& programación.& & Aunque&esta&aplicación&seria&posible&instalarla&en&cualquier&dispositivo&IOS&o& Android&dado&su&código&comun,&es&necesario&poseer&una&gran&pantalla¶&ejecutarla.& Esta&es&la&razón&principal&por&la&que&hemos&elegido&una&tablet&y&en&nuestro&caso&un& producto&comercializado&por&Apple,&el&Ipad.&&Ya&que&parte&del&contenido&de&la& aplicacion&es&texto&y&dado&que&nuestro&dispositivo&posee&una&gran&pantalla&de&9,7& pulgadas&podremos&verlo&perfectamente&en&este&dispositivo.& & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&4&8&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&5&8& ÍNDICE'DE'CONTENIDO' 1!Objetivo'del'proyecto' 8! 1.1!Introducción- 8! 1.2!Objetivo-del-proyecto- 9! 1.3!Organización-de-la-memoria-10! 2!Metodología'y'planificación'del'proyecto'11! 3!Diseño'e'implementación'de'la'aplicacion'13! 3.1!Requisitos-de-la-aplicación-13! 3.1.1!Requisitos!funcionales!13! 3.1.2!Requisitos!no!funcionales!13! 3.2!Diseño-13! 3.2.1!Escenas!15! 3.2.1.1!Tipo-1!15! 3.2.1.2!Tipo-2!15! 3.2.1.3!Tipo-3!15! 3.2.2!Diagramas!de!actividad!15! 3.2.3!Diseño!de!pantallas!de!la!aplicacion!19! 3.2.3.1!Pantalla!!de!carga!19! 3.2.3.2!Pantalla!bienvenida!20! 3.2.3.3!Pantalla!Menú!Principal!21! 3.2.3.4!Pantalla!Capitulo!Diapositivas!22! 3.2.3.5!Pantalla!Introduccion!Capítulo!Ejemplos!23! 3.2.3.6!Pantalla!Visualizacion!Tema!24! 3.2.3.7!Pantalla!Configuración!26! 3.2.3.8!Pantalla!de!Menu!Juegos!27! 3.2.3.9!Pantalla!de!Juegos!28! 3.3!Implementación-28! 3.3.1!Estructura!del!programa!29! 3.3.2!Ficheros!de!configuración!31! 3.3.2.1!posicion.dat!31! 3.3.3!Ficheros!de!contenido!31! 3.3.3.1!variables.lua!32! 3.3.4!Módulos&o&librerías!33! 3.3.4.1!director.lua!33! 3.3.4.2!util.lua!35! 3.3.4.3!movieClip.lua!36! 3.3.4.4!ui.lua!36! 3.3.4.5!showText!37! 3.3.4.6!tableView.lua!38! 3.3.4.7!slideView.lua!38! 3.3.4.8!examples.lua!38! 3.3.4.9!variables.lua!38! 3.3.5!Titulos&de&la&aplicacion!40! 3.3.6!Adaptación!dinámica!de!contenido!41! 3.3.6.1!config.lua!41! 3.3.6.2!build.settings!43! 3.3.7!Pruebas!y!verificación!43! 3.4!Tareas-de-administración-44! 3.4.1!Distribuir!aplicaciones!44! 4!Conclusiones'45! 4.1!Mejoras-y-ampliaciones-46! 5!Bibliografía'y'referencias'47!
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&6&8& 6!Plataformas'de'programación'en'dispositivos'móviles'47! 6.1!Introducción-47! 6.2!Dispositivos-y-sistemas-operativos-47! 6.3!Aplicaciones-web-versus-aplicaciones-nativas-50! 6.4!Desarrollo-aplicaciones-móviles-nativas-para-iOS-y-Android-51! 6.5!Desarrollo-móvil-multiplataforma-51! 6.5.1!PhoneGap!52! 6.5.2!Titanium!Appcelerator!52! 6.5.3!Adobe!Air!Mobile!54! 6.5.4!Corona!SDK!54! 6.5.5!Plataforma!seleccionada!55! 7!Plataforma'Corona'SDK.'Características'56! 7.1!Introducción-a-la-Plataforma-Corona-SDK-56! 7.2!Gestión-de-proyectos-en-Corona-SDK-57! 7.3!Lenguaje-de-Corona-SDK:-Lua-57! 7.3.1!Generalidades!57! 7.3.2!Variables!59! 7.3.3!Expresiones!60! 7.4!Estructuras-de-control-63! 7.4.1!Funciones!64! 7.4.2!Objetos,!propiedades!y!funciones!64! 7.5!Librerías-estándar-de-Lua-65! 7.6!Librerías-de-Corona-SDK-66! 7.7!Visualización-de-objetos-en-pantalla-66! 7.8!Gestión-de-eventos-70! 7.9!Animación-y-movimiento-72! 7.10!Motor-físico-74! 7.11!Conectividad-79! 7.12!Gestión-de-la-memoria-81! 8!ANEXO'I'–'Detalle'de'funciones'en'Corona'SDK'85! 8.1!Librerías-estándar-de-Lua-85! 8.1.1!Biblioteca!básica!85! 8.1.2!Módulos!(bibliotecas!externas)!88! 8.1.3!Manipulación!de!cadenas!89! 8.1.4!Manipulación!de!tablas!95! 8.1.5!Funciones!matemáticas!95! 8.1.6!Funciones!de!entrada!y!salida!98! 8.1.7!Funciones!de!sistema!operativo!101! 8.2!Librerías-de-Corona-SDK-102! 8.2.1!Biblioteca!display!103! 8.2.2!Biblioteca!transition!105! 8.2.3!Biblioteca!media!107! 8.2.4!Biblioteca!native!107! 8.2.5!Biblioteca!system!108! 8.2.6!Biblioteca!widget!109! 8.2.7!Bibioteca!StoryBoard!113!
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&7&8& !
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&8&8& 1 Objetivo del proyecto 1.1 Introducción! & El&crecimiento&y&popularización&de&los&dispositivos&móviles&durante&los&últimos&años,&ha& generado&un&gran&desarrollo&de&estos&,que,&además&de&permitir&la&tradicional& comunicación&entre&redes&fijas&y&móviles,&poseen&la&capacidad&de&ejecutar&todo&tipo&de& aplicaciones&desarrolladas&específicamente¶&estos&dispositivos.& & Las&prestaciones&de&los&dispositivos&móviles&aumentan&dia&&día,&posibilitando&así& la&implementación&de&aplicaciones&muy&potentes&e&interesantes.&Los&denominados& “Smartphones”&o&teléfonos&de&ultima&generación&y&las&“Tablets”,&presentan&una&serie& de&características&de&procesamiento,&memoria&y&capacidad&de&conexión&que&está& llevando&a&los&grandes&fabricantes,&operadores&y&desarrolladores&a&una&auténtica& carrera&por&lograr&las&mejores&aplicaciones&y&estar&a&la&cabeza&de&ventas.& & Google1&ha&hecho&públicos&los&resultados&de&un&estudio&llevado&a&cabo&el&pasado&mes& de&marzo&en&Estados&Unidos,&en&el&que&se&entrevistó&a&un&total&de&1.430&usuarios& poseedores&de&un&moderno&Tablet.& & El&perfil&tipo&de&poseedor&de&un&tablet&utiliza&este&dispositivo&principalmente&en&el& domicilio&particular&(82%)&antes&que&en&el&trabajo&(7%),&e&incluso&antes&que&en& movilidad&(11%),&aunque&curiosamente&un&aparato&ligero&de&estas&características&está& más&pensado,&precisamente,¶&entornos&móviles.&& & Aunque&el&tablet&no&es&considerado&aún&como&el&principal&dispositivo&informático,&está& robando&horas&de&uso&al&pc&o&al&portátil.&& & Entre&los&principales&usos&que&se&dan&al&tablet&destaca&su&vertiente&lúdica,&con&un&84%& de&los&encuestados&utilizando&su&dispositivo¶&videojuegos.&La&lectura&de¬icias&se& encontraría&en&cuarta&posición&con&un&61%,&práctica&que&más&terreno&podría&estar& quitándole&a&los&periódicos&en&papel,&mientras&que&el&56%&de&los&usuarios&se&conectan& a&redes&sociales,&el&46%&consumen&e8books,&y&el&74%&gestiona&su&correo&electrónico.&& & Digamos&que&si&resumimos&todos&los&datos&que&ha&arrojado&el&estudio,&tendríamos&que& el&poseedor&de&un&tablet&lo&utiliza&cuando&llega&a&su&casa&después&del&trabajo¶& navegar&por&Internet,&gestionar&su&correo&electrónico,&acceder&a&las&redes&sociales&a& través&de&apps&específicas&y&además&como&entorno&de&aprendizaje&o&lector&de&libros.& & &&&&&&&&&&Este&estudio&conviene&a&los&desarrolladores&de&tablets,&terreno&en&el&cual&ha& presentado&sus&credenciales&Samsung&con&Android&3.0&,&Apple&con&su&IOS&5¶&el&Ipad& u&otras&plataformas&menos&conocidas&y&por&tanto&menos&utilizadas.& & & & 1&http://www.imatica.org/bloges/2011/04/190486382011.html&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&9&8& Los&tablets&se&distinguen&por&muchas&características,&entre&las&que&destacan&las& distintas&pantallas&táctiles,&un&sistema&operativo&propio,&la&conectividad&a&internet&y&el& acceso&al&correo&electrónico.&Otras&aplicaciones&que&suelen&estar&presentes&son&las& cámaras&integradas,&acelerómetro,&la&reproducción&de&música&y&visualización&de&fotos&y& videos&y&algunos&programas&de&navegación&así&como&aplicaciones&de&lectura&de& documentos&en&distintos&formatos&electrónicos.&La&mayoría&de&dispositivos&también& permiten&al&usuario&instalar&programas&adicionales¶&dar&un&valor&añadido&al& dispositivo&y&así&poder&competir&con&sus&rivales.& & En&función&de&los&distintos&fabricantes,&cada&uno&de&los&dispositivos&móviles&posee&un&& sistema&operativo&que&determina&las&capacidades&multimedia&de&los&aparatos,&y&la& forma&de&interactuar&con&el&usuario.& 1.2 Objetivo!del!proyecto! En&este&entorno,&el&objetivo&del&proyecto&es&el&desarrollo&de&una&aplicación& desarrollada&específicamente¶&IPad&que&permita&al&usuario&aprender&interactuando& con&ésta&de&forma&sencilla&y&sin&apenas&conocimientos&previos&de&programación&de& videojuegos.&Se&pretende&la&realización&de&una&herramienta&sencilla&y&que&haga&posible& la&distribución&de&conocimientos&de&programación&hacia&personas&que&quieren&iniciarse& en&esta&disciplina.& & Para&este&fin,&después&de&conocer&distintos&entornos&de&desarrollo¶&varios&sistemas& operativos&móviles,&se&utilizará&una&plataforma&de&software&multiplataforma&que& permite&la&construcción¶&dispositivos&con&iOS,&Android&y&Kindle.& & El&objetivo&es&tener&un&código&de&aplicación&común&que&sumado&a&unos&contenidos& configurables&nos&permitan&la&construcción&de&aplicaciones&nativas¶&varios& dispositivos&aunque&&en&este&caso&la&aplicación&ha&sido&gráficamente&diseñada¶&la& tablet&&de&Apple,&el&Ipad.& & Figura&1.1&.&Esquema&del&objetivo&del&proyecto& & APLICACION CONTENIDO (CONFIGURABLE) + IPAD
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&16&8& & & & Figura&3.2.&Diagrama&de&actividad&de&la&carga&de&la&pantalla&principal& & En&este&diagrama&se&muestra&el&flujo&de&carga&de&datos&desde&el&modulo&externo&que& contiene&la&tabla&de&capítulos&del&menú&principal&de&la&aplicación.& & Esta&carga&viene&condicionada&mayormente&por&el&idioma&de&la&apliacacion&y&por&el&tipo&de& capitulo.&& & Según&el&estado&de&la&variable&language_state&la&tabla&que&pasamos&a&la&tableView¶& que&muestre&la&lista&de&capitulos&en&la&pantalla&del&menú&principal&contiene&un&idioma&u& otro.& & Para&determinar&el&color&de&la&fuente&lo&conseguimos&con&la&variable&id,&nos&permite& seleccionar&el&color&dependiendo&de&su&valor.&Es&posible&configurar&la&tableView&a&nuestro& antojo&y&muestra&de&ello&es&que&seria&posible&elegir&un&color¶&cada&fuente&de&la&misma.& & En&la&siguiente&figura&se&muestra&el&diagrama&de&actividad&de&la&carga&de&la&escena&Tipo&1& que&esta&directamente&relacionada&con&los&3&primeros&capitulos.& & LLAMADA ESCENA COMPROBAMOS IDIOMA CREAMOS LA TABLA CREAMOS TABLEVIEW FIN CARGA
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&17&8& & & & & & & & & & & & & & & & & & & & & & & & & & & & & Figura&3.3.&Diagrama&de&actividad&de&la&carga&del&contenido&de&la&escena&Tipo&1& & Como&podemos&observar&el&primer&paso&realizado&es&comprobar&el&idioma&actual&de&la& aplicación.&Cada&vez&que&se&llama&a&la&escena&se&hace&este&chequeo.&& & Despues&de&comprobar&el&idioma,&creamos&dentro&de&la&escena&la&variable&local&myImages& que&no&es&mas&que&una&tabla&en&la&cual&están&incluidas&las&rutas&de&las&imágenes&que&serán& mostradas&dentro&del&capitulo.& & Estas&imágenes&son&diferentes¶&cada&idioma&por&lo&cual&es&necesario&incluir&dentro&de& la&carpeta&los&2&idiomas.&& & Por&ultimo&creamos&un&objeto&slideView,&le&pasamos&como&parámetro&la&tabla&de& ubicaciones&de&imágenes&que&hemos&creado&al&principio&dependiendo&del&idioma.&&Las& imágenes&que&mostramos&tienen&unas&dimensiones&espeficicas¶&poder&ocupar&todo&el& espacio&libre&disponible.&Estas&dimensiones&son&900&x&600&pixeles& & A&continuación&se&muestra&el&diagrama&de&actividad&de&la&escena&Tipo&2.& & LLAMADA ESCENA COMPROBAMOS IDIOMA CREAMOS LA TABLA DE IMAGENES CREAMOS SLIDEVIEW FIN CARGA
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&18&8& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & Figura&3.4.&Diagrama&de&actividad&de&la&carga&del&contenido&Tipo&2& & El&primer&paso&de&la&escena&es&comprobar&el&estado&de&la&variable&local&language_state.& Según&su&estado&cargamos&las&variables&que&usaremos¶&crear&la&escena.&Para&cargar&el& contenido&de&esta&escena&llamamos&a&la&función&new&del&modulo&externo&variables.&Al& llamar&a&esta&función&le&pasamos&los&parámetros¶&configurar&un&capitulo&especifico.& Esos&parámetros&son&el&capitulo&y&tema&que&queremos&visualizar.&Internamente&la&función& new&se&encarga&de&seleccionar&las&variables&correspondientes&dependiendo&del&idioma& seleccionado.& & Tambien&hacemos&uso&de&la&función&content&que&se&encarga&de&gestionar&la&barra&de& contenido&dentro&de&los&temas&de&los&capitulos.& & Cuando&se&crean&los&objetos&de&la&escena,&estos&utilizan&las&variables&cargadas& anteriormente&por&lo&que&podemos&usar&una&misma&escena¶&ver&todos&los&capitulos& cuya&escena&es&del&Tipo&2,&los&capitulos&con&ejemplos.& & Se&debe&mencionar&que&no&es&posible&utilizar&este&tipo&de&escena¶&los&3&primeros& capitulos&aunque&la&similitud&de&la&escena&sea&evidente.&La&razón&es&simple,¶&cargar&el& slideView&es&necesario&utilizar&un&fondo&de&pantalla&diferente¶&poder&ver&la&sensación& de&transición&del&slideView&dentro&del&recuadro&gris.& LLAMADA ESCENA COMPROBAMOS IDIOMA CARGAMOS LAS VARIABLES CREAMOS LA ESCENA FIN CARGA
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&19&8& 3.2.3 DiseñoAdeApantallasAdeAlaAaplicacionA 3.2.3.1 Pantalla&&de&carga& Figura&3.5.&Pantalla&de&carga&de&la&aplicacion& La&pantalla&de&carga&contiene&una&imagen&con&el&logotipo&de&la&Universidad&de&Zaragoza.& Los&elementos&de&la&vista&son:& ! Ø Una&imagen&cargada&desde&un&fichero&denominado&splash.png&que&se&incluye&en&el& directorio&de&imagenes&de&la&aplicación.& En&esta&pantalla&no&hay&opción&de&realizar&acciones,&existe&un&temporizador&con&una& duración&de&2sg&que&se&encarga&de&cambiar&de&escena&automáticamente&tras&pasar&el& tiempo&al&que&esta&programado.& ! Esta&pantalla&da&paso&a&la&pantalla&de&bienvenida&de&la&aplicación.& & & & & & & & & & & & & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&20&8& 3.2.3.2 Pantalla&bienvenida& Figura&3.6.&Pantalla&de&bienvenida&de&la&aplicacion& La&pantalla&de&bienvenida&contiene&el&titulo&de&la&aplicación.&Los&elementos&que&contiene& la&vista&son:& ! Ø La&vista&contiene&un&fondo&de&pantalla&negro.& Ø Una&imagen&cargada&desde&fichero&que&es&las&encargada&de&mostras&el&titulo&de&la& aplicación,&dependiendo&del&idioma&el&archivo&cambia.& Ø Si&la&última&vez&que&se&ejecutó&la&aplicación&se&estaba&visualizando&un&contenido&de& un&capítulo&de&ejemplos&o&de&diapositivas,&pregunta&si&se&desea&volver&a&la&última& posición.&Esto&es&útil&si&se&ha&suspendido&la&aplicación&por&una&llamada&u&otro& motivo.&El&archivo&posición.dat&es&el&encargado&de&almacenar&esta&información.& & La&pantalla&a&paso&al&Menú&principal&de&la&aplicación&o&a&la&última&posición&visualizada& dentro&de&un&capítulo.& & & & & & & & & & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&21&8& 3.2.3.3 Pantalla&Menú&Principal& Figura&3.7.&Pantalla&del&Menu&principal&de&la&aplicacion& La&pantalla&del&Menu&Principal&contiene&el&listado&de&los&capítulos&seleccionables&asi&como& los&accesos&a&los&juegos.&& & El&listado&de&los&capítulos&esta&incluido&en&el&modulo&externo&“variables.lua”,&&el&formato& es&una&tabla&en&la&cual&se&incluyen&todos&los&parámetros&referentes&a&la&tableView,&que&es& el&objeto&encargado&de&mostrar&la&tabla.&Los&elementos&que&presenta&la&vista&son:& ! Ø Listado&de&capítulos&.& Ø Titulo&de&la&aplicación.& Ø Imágenes&de&juegos&en&la&parte&derecha&de&la&pantalla.& Ø Boton&de&Configuración.& & Desde&esta&pantalla&es&posible&acceder&a&cualquier&capitulo&de&la&aplicación&asi&como&al& menú&de&configuración.&& & & & & & & & & & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&22&8& 3.2.3.4 Pantalla&Capitulo&Diapositivas& ! ! ! Figura&3.8.&Pantalla&de&presentación&de&diapositivas& ! ! En&la&pantalla&de&presentación&de&diapositivas&se&puede&visualizar&uno&de&los&3&primeros& capitulos&seleccionables&en&el&Menu&Principal.&Los&elementos&que&contiene&la&vista&son:& ! Ø Titulo&de&la&aplicación(Can&you….)& Ø Titulo&del&capitulo.& Ø Objeto&slideViev(incluye&eventos&y&funciones)& Ø Boton&Menu.& Ø Botón&Previus.& Ø Boton&Next.& & Desde&esta&pantalla&mediante&la&utilización&de&los&diferentes&botones&es&posible&o&dirigirse& al&menú&principal¶&seleccionar&otro&capitulo&o&bien&ir&cambiando&la&diapositiva&con&los& botones&de&nextA&y&previus.& & Existen&3&capitulos&que&utlizan&esta&misma&forma&y&la&escena&utilizada&es&la&misma¶& todos&y&cada&uno&de&ellos,&la&Tipo&1.& & & & & & & & & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&23&8& 3.2.3.5 Pantalla&Introduccion&Capítulo&Ejemplos& ! ! Figura&3.9.&Pantalla&de&introducción&a&un&capitulo&de&ejemplos& ! En&la&pantalla&de&introducción&a&un&capitulo&de&ejemplos&se&visualiza&un&pequeño&párrafo& que&nos&detalla&que&nos&vamos&a&encontrar&en&el&capitulo&seleccionado.&El&contenido&de&la& vista&es:& ! Ø Titulo&de&la&aplicación.& Ø Titulo&del&capitulo.& Ø Contenido&de&la&introduccion.& Ø Dispositivo&sobre&el&cual&se&van&a&visualizar&los&diferentes&ejemplos.& Ø Botón&Play.&& Ø Boton&Menu.& & Cuando&nos&encontramos&en&esta&pantalla&podemos&dirigirnos&hacia&varias&escenas.& Podemos&volver&al&menú&principal&o&podemos&pulsar&el&botón&play&e&iniciar&el&capitulo.& & & & & & & & & & & & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&24&8& 3.2.3.6 Pantalla&Visualizacion&Tema& ! Figura&3.10.&Pantalla&de&visualización&de&un&capitulo&de&ejemplos& ! La&pantalla&de&visualización&de&un&capitulo&de&ejemplos&es&similar&a&la&anterior&con&la&única& diferencia&que&el&espacio&ocupado&por&la&introducción&al&capitulo&ahora&esta&reservado& para&ver&las&explicaciones&sobre&lo&que&aparece&en&el&simulador.&Esta&pantalla&es&común&a& los&4&capitulos&de&ejemplos.&Cada&capitulo&de&ejemplos&contiene&en&su&interior&diferentes& temas&que&son&tratados&de&forma&ordenada&respecto&a&la&creación&del&videojuego&de& ejemplo.&Enumeramos&a&continuación&los&elementos&que&contiene&la&vista:& & Ø Titulo&de&la&aplicación.& Ø Titulo&del&tema&que&estamos&visualizando& Ø Espacio&reservado¶&la&explicación&del&tema.& Ø Dispositivo&simulado&sobre&el&cual&se&visualizan&los&diferentes&ejemplos.& Ø Boton&menú.& Ø Boton&configuracion.& Ø Botones&nextAy&previus.A Ø Boton&play&y&pause.A Ø Boton&content.& A Existen&varias&posibilidades&en&esta&pantalla&a&la&hora&de&realizar&acciones.&Los&botones& con&flechas&de&dirección&se&utlizan¶&avanzar&o&retroceder&en&el&tema.& & Existe&un&botón&play&que&al&pulsarlo&ejerce&la&misma&función&que&la&flecha&next&pero&de& forma&automática,&sin&necesidad&de&estar&pulsando&cada&vez&que&avanze&el&tema.&Se& detiene&cuando&llega&a&la&ultima&línea&de&las&explicaciones.&Al&pulsar&play&este&botón& desaparece&y&el&botonApause&aparece¶&detener&las&explicaciones&cuando&precise.&En& ese&instante&se&alternan&los&botones¶&reanudar&la&marcha&al&volver&a&pulsar&play.A A
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&25&8& El&botón&contentAhace&aparecer&una&barra&con&el&contenido&del&capitulo&distingido&por& temas.&A&continuación&se&muestra&el&contenido&de&los&temas&de&cada&capitulo.& & Capitulo&4&–&Visualizacion&y&eventos&:&& & Ø Introduccion&I& Ø Introduccion&II& Ø Introduccion&III& Ø Introduccion&IV& Ø Formas& Ø Imagenes& Ø TextoA Ø GruposA Ø Propiedades& Ø Eventos&1& Ø Eventos&2& Ø Eventos&3& & Capitulo&5–&Animacion&y&movimiento&:&& & Ø Transition&I& Ø Transition&II& Ø MovieClip&I& Ø MovieClip&II& & Capitulo&6&–&Motor&Fisico&:&& & Ø Fisica&I& Ø FIsica&II& Ø Escenario& Ø Cuerpos& Ø Pelota& Ø JuegoA A Capitulo&7&–&Audio&y&video&:&& & Ø Audio&I& Ø Audio&II& Ø Video&I& Ø Video&II& & & & A&continuacio&se&muestra&una&imagen&de&pantalla&cuando&aparece&la&barra&oculta&de& contenido.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&32&8& 3.3.3.1 variables.luaA El&texto&esta&almacenado&dentro&del&modulo&externo&variables.lua.&La&forma&de& selecionarlo&es&simple.&Mediante&la&función&new(cap,tema)&selecionamos&las&cadenas&de& texto&a&mostrar&y&las&rutas&de&los&títulos&de&las&escena&que&luego&esta&gestióna¶&que& aparezcan&correctamente.& & Según&el&estado&de&la&variable&global&language_stateAse&carga&el&idioma&de&las&variables.& Podemos&ver&a&continuación&una&fragmento&del&código&de&la&librería&variables.lua,A exactamente&la&función&new(cap,tema)& & & variables.lua& & function&new(cap,tema)& & &if&language_state&==&false&then& & & &if&cap&==&1&then& & & tema_tit&=&"images/titulos/spanish/introduccion.png"& & & myImages&=&{"images/cap1/1.jpg",&"images/cap1/2.jpg",&"images/cap1/3.jpg",&"images/cap1/4.jpg",&&&&&&&&&&&&&&&&&&& "images/cap1/5.jpg",&"images/cap1/6.jpg",&"images/cap1/7.jpg",&"images/cap1/8.jpg"}& & & & &end& & & &if&cap&==&2&then& & & tema_tit&=&"images/titulos/spanish/lua.png"& & & myImages&=&{"images/cap2/1.jpg",&"images/cap2/2.jpg",&"images/cap2/3.jpg",&"images/cap2/4.jpg"}& & end& & & &if&cap&==&3&then& & & & & tema_tit&=&"images/titulos/spanish/coronaSDK.png"& & & myImages&=&{"images/cap3/1.jpg",&"images/cap3/2.jpg",&"images/cap3/3.jpg",&"images/cap3/4.jpg"} & & & & &end& & & & & &if&cap&==&4&then& & & & & & titulo&=&{"Introduccion&I","Introduccion&II","Introduccion&III","Introduccion& IV","Formas","Imagenes","Texto&","Grupos","Propiedades","Eventos&1",&"Eventos&2",&"Eventos&3"}& & & numero_temas&=&12& & & & & & if&tema&==&0&then& & & & &&&tema_tit&=&"images/titulos/spanish/visualizacion.png"& &&&string_introduccion&=&"&Este&capitulo&nos&introduce&en&la&visualizacion&de&objetos&asi& como&los&eventos&que&los&controlan.&Hemos&elegido&un&juego&standard&conocido&como&''Space&Shooter''¶&mostrar& las&posibilidades&que&nos&ofrece&Corona&SDK.&Vamos&a&aprovechar&el&siguiente&capitulo,&Animacion&y&Movimiento,& para&terminar&de&rematar&el&juego&y&darle&una&aparencia&real&de&funcionamiento.&Antes&de&comenzar&a&construir&el& juego&se&incluye&una&introduccion&sobre&la&creacion&de&objetos&y&eventos."& & & & end&& & & & & & if&tema&==&1&&then& & & & &&&strings&=&{}& &&&&& & strings[1]&=&"display.newRect(x,y,width,height)"& &&&&& & strings[2]&=&"display.newRoundedRect(x,y,w,h,radius)"&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&33&8& &&&strings[3]&=&"display.newCircle(x,y,radius)"& &&&strings[4]&=&"display.newLine(x1,y1,x2,y3)"& &&&strings[5]&=&"line:append(x3,y3)"& &&&strings[6]&=&"object:setFillColor(R,G,B,transparency)"& &&&strings[7]&=&"line:setColor(R,G,B,transparency)"& &&&strings2&=&{}& &&&strings2[1]&=&"Ahora&un&rectangulo&con&los&bordes&redondeados:"& &&&strings2[2]&=&"El&siguiente&es&un&circulo:"& &&&strings2[3]&=&"Tambien&es&posible&dibujar&una&linea:"& &&&strings2[4]&=&"Con&la&siguiente&instruccion&podemos&incluir&otra&linea&al&ultimo&punto&del& objeto&anterior:"& &&&strings2[5]&=&"Para&cambiar&el&color&de&un&objeto:"& &&&strings2[6]&=&"El&metodo&de&la&linea&es&distinto:"& &&&y&=&{180,255,325,395,505,575,645}& &&&y2&=&{120,225,295,365,445,545,615}& &&&tema_tit&=&"images/titulos/spanish/introduccion1.png"& &&&string_introduccion&=&"Comenzamos&la&introduccion&creando&objetos&de&pantalla,&en& primer&lugar&un&rectangulo:"& &&&escena_anterior&=&"cap4"& &&&escena_siguiente&=&introduccion2& &&&fin&=&7& ………………………& ……………………..& ……………………..& & & 3.3.4 MódulosAoAlibreríasA Como&se&ha&comentado&en&la&estructura&del&programa,&a&partir&del&módulo&principal,& main.lua,&se&han&cargado&una&serie&de&módulos&externos&o&librerías&que&nos&permiten& acceder&a&funciones&y&a&utliidades&que&a&priori&Corona&SDK&no&permite&y&que&nos&da&un& plus&de&comodidad&a&la&hora&de&programas&ya&que&podemoa&adaptar&librerías&especificas& para&otros&proyectos&a&cualquier&otro.& & La&forma&de&incluir&un&modulo&en&un&proyecto&es&la&siguiente:& & local&ejemplo&=&require(“ejemplo”)& & Dentro&del&modulo&es&necesario&incluir&la&siguiente&línea¶&que&Corona&SDK&entienda&lo& que&es.& & module(...,&package.seeall)& & El&archivo&principal,&main.lua,&contiene&la&llamada&a&todos&esas&librerías&pero&la&librería& imprescindible¶&nuestra&aplicación&es&director.lua.&Vamos&a&pasar&a&explicar&como& funcionan&los&modulos&y&en&primer&lugar&comenzamos&con&el&mas&importante.& & 3.3.4.1 director.luaA El&funcionamiento&de&este&modulo&es&muy&sencillo.&Es&necesario&que&el&main.lua&contenga& la&siguente&parte&de&código¶&añadir&la&librería.&Y&cada&escena&es&necesario&que&siga&un& patrón&de&código¶&que&todo&valla&perfecto.& & Este&es&el&código&que&presenta&el&archivo&principal&main.lua:& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&34&8& local&mainGroup&=&display.newGroup()& & local&main&=&function&()& & & mainGroup:insert(&director.directorView&)& & & director:changeScene("splash")& & & &return&true& end& main()& && En&este&caso&llamamos&a&la&escena&splash.lua.&& & Lo&primero&que&hace&el&codigo&es&crear&un&grupo&de&objetos.&En&el&incluiremos&los&objetos& de&pantalla&que&creemos&y&que&serán&llamados&“hijos”.& & Luego&creamos&la&función&principal&de&la&aplicación&que&mas&tarde&llamaremos¶& iniciarla.& & Para&cambiar&de&escena&simplemente&utilizamos&la&siguiente&instrucción:&A A director:changeScene(escena)A & Donde&escena&es&un&archivo&como&por&ejemplo:&scene.lua& & El&formato&de&scene.lua&es&diferente&al&main.lua&a&continuación&se&explica&con&mas&detalle& tras&mostrar&un&ejemplo&de&escena:& & new&=&function&()& &local&localGroup&=&display.newGroup()& &88&Codigo&escena& &return&localGroup& end& & Creamos&un&grupo&local&que&solo&esta&dentro&de&la&escena.&Es&necesario&incluir&cada& objetos&de&pantalla&que&se&cree&dentro&del&grupo&porque&de&cara&a&una&gestión&correcta& de&la&memoria&en&la&aplicación,&que&como&se&ha&comentado,&es&importante&en&dispositivos& móviles,&se&ha&utilizado&una&estructura&basada&en&objetos&de&visualización&o&displayA objects.&Al&cambiar&de&escena&cada&uno&de&los&objetos&incluidos&son&eliminados&y& resolvemos&del&problema&de&la&memoria&de&un&plumazo.&Tambien&son&eliminados&los& posible&eventos&asociados&a&los&objetos.& & Las&posibilidades&que&nos&ofrece&esta&librería¶&cambiar&de&escena&son&las&siguientes:& & director:changeScene(params,&escena,&efecto)& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&35&8& params&=&estos&parámetros&estarán&disponibles&en&la&siguiente&escene.&Su&formato& solo&puede&ser&el&de&una&tabla.&Ha&ido&predeterminado&por&el&autor.& & escena&=&archivo&con&extensión&punto&lua.& & efecto&=&ha&sido&preconfigurado&por&el&autor,&como&ejemplos&downFlip,Afade….& && 3.3.4.2 util.luaA En&ella&estan&incluidas&ciertas&herramientas&que&utilizamos&como&complemento&de&las& librerias&de&lua&y&las&propias&de&Corona&SDK.&A&continuacion&enumeramos&todas&las& funciones&incluidas&en&este&librería:& & & functionAParseCSVLineA(line,sep)AA & Esta&función&lo&que&hace&es&separar&el&contenido&de&una&cadena&que&esta&separada&por&un& carácter&especifico&en&varias&cadenas&dentro&de&una&tabla.& Parametros&de&entrada:&&&& & line&=&linea&con&valores&separados&con&un&caracter& sep&=&caracter&separador.&Si&no&se&especifica&se&usa&la&coma&','& & Parametro&de&salida:&& & Devuelve&una&tabla&de&strings&con&los&parámetros&que&antes&estaban& separados.& & & loadValueA=Afunction(AstrFilenameA)A & Esta&función&permite&cargar&en&una&cadena&el&contenido&de&un&archivo.& & Parametros&de&entrada:&&&& & srtFilename&=&archivo&que&va&a&ser&procesado& & Parametro&de&salida:&& & Devuelve&un&string&con&el&contenido&del&archivo& & & saveValueA=Afunction(AstrFilename,AstrValueA)A & Esta&función&guarda&el&contenido&de&una&string&dentro&de&un&archivo& & Parametros&de&entrada:&&&& & srtFilename&=&archivo&que&va&a&ser&procesado&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&36&8& srtValue&=&string&que&va&a&ser&guardada& & Parametro&de&salida:&& & No&tiene.& & & getPosicionGuardadaA=AfunctionA()A & La&función&se&encarga&de&comprobar&si&hay&alguna&posición&guardada&al&entrar&en&la& aplicación&de&nuevo.& & Parametros&de&entrada:&&&& & No&tiene.& & Parametro&de&salida:&& Devuelve&si&hay&capitulo&guardado&y&en&su&caso&un&string&con&el&nombre&del& capitulo&guardado.& & & crearConfiguracionA=AfunctionA(language,grupo)A & Esta&función&crea&el&menú&de&configuración&de&la&aplicación.& & Parametros&de&entrada:&&&& & language&=&idioma&que&debe&mostrar&el&menú& grupo&=&el&grupo&local&de&la&escena& & Parametro&de&salida:&& & Devuelve&un&grupo,&que&no&es&mas&que&el&propio&menú.&Con&su&eventos,& botones…& & 3.3.4.3 movieClip.luaA Este&modulo&es&propio&de&Corona&SDK&pero&no&viene&incluido&en&la&aplicación&y&es& necesario&hacerlo&manualmente.&Es&útil¶&crear&animaciones.&Hemos&explicado&su& funcionamiento&en&el&tema&de&animación&y&movimiento&y&lo&hemos&utilizado&en&algún& juego.&Para&agregarla&al&proyecto&simplemente&basta&con&copiar&el&archivo&movieClip.lua& dentro&de&nuestra&carpeta&de&aplicación.& & 3.3.4.4 ui.luaA Otro&modulo&propio&de&Corona&SDK&no&incluido&inicialmente.&Sirve¶&crear&botones&con& animación.&Es&fácil&de&usar.&Simplemente&permite&crear&el&botón&al&dale&como&parámetros& las&imágenes&y&la&funciona&asociada.&Aquí&un&ejemplo:& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&37&8& local&buttonMenu&=&function&(&event&)& & &88&Accion&a&realizar& & & end&& &&&&& btmenu&=&ui.newButton{& & & default&=&“menu.png",& & & over&=&"menu_over.png",& & & onEvent&=&buttonMmenu,& & & id&=&"btmenu"& & & }&&&&&&&& & 3.3.4.5 showTextA Este&modulo&ha&sido&creado&especificacmente¶&este&proyecto.&Lo&usamos¶&darle&la& animación&a&una&cadena&dentro&de&los&capitulos&de&ejemplo.&Su&funcionamiento&es& sencillo.&Le&puedes&pasar&como&parámetro&un&string&y&te&carga&cada&letra&del&string& individualmente.&Es&posible&configurar&parámetros&como&el&tiempo&entre&letras,&&longitud& del&texto,&posiciones.&La&dificultad&de&este&modulo&radica&en&que&ha&sido&necesario& individualizar&el&tamaño&de&cada&letra¶&que&al&mostrarlas&todas&juntas&den&una& sensación&de&coesion&y&parezca&que&es&un&string&y&una&suma&suma&de&varios.&A& continuación&se&detalle&la&función.&& & & function&draw(&string&,&x&,&y&,&color&,&tamaño,&anchura&,&tiempo&,&sonido&,&cap,&tema1,&id&,& tope,&flag)& & & Parametros&de&entrada:&&&& & string&=&cadena&a&mostrar& x,&y&=&posiciones&del&comienzo&del&string& color&=&los&colores&posibles&son&“blanco”,&“gris”&y&“negro”& tamaño&=&de&la&fuente& anchura&=&el&texto&cambia&de&línea& tiempo&=&entre&letras& sonido&=&se&reproduce&cuando&imprime&una&letra& cap&,&tema1,&id&=&&esta&relacionado&con&el&tema&que&visualizamos& tope&=&cada&tema&visualiza&un&numero&de&veces&este&complemento& flag&=&depende&de&esta&variable¶&comportarse&de&una&forma&u&otra& & Parametro&de&salida:&& & Devuelve&2&grupos.&El&primero&con&el&string&cargado&y&el&segundo&que& devuelve&es&el&ejemplo&que&se&carga&dentro&de&la&funcion& & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&38&8& 3.3.4.6 tableView.luaA Este&es&necesario¶&que&funcione&la&tabla&de&capitulos&del&menú&principal.&Es&un&widget& que&proporciona&Corona&SDK&y&va&muy&bien¶&este&tipo&de&objetos.&Se&agrega&mediante& el&archivo&en&la&carpeta.&Le&pasamos&los&parámetros&de&configuración&mediante&una&tabla& de&strings&donde&se&incluyen&los&títulos&y&subtitulos&de&la&misma.&Es&nuestro&caso&se&ha& utilizado&una&tableView&modificada¶&mostrar&una&imagen&en&el&lado&izquierdo&de&cada& línea.& & & & & 3.3.4.7 slideView.luaA Otro&widget&que&nos&facilita&Corona&SDK.&En&nuestro&caso&se&ha&modificado&internamente& para&adaptarlo&a&nuestras&necesidades.&Lo&hemos&utilizado&en&los&capitulos&de& diapositivas.&Nos&permite&deslizar&con&el&dedo&entre&las&diferentes&imágenes&hacia&un&lado& como¶&otro.&Es&necesario&incluir&el&archivo¶&agregarlo&al&proyecto.& 3.3.4.8 examples.luaA Esta librería es la responsable de cargar los ejemplos de los capitulo que se usan para aprender a programas. Incluye una función que al pasarle unos parámetros nos devuelve un grupo con el contenido de lo que le estamos solicitando. A continuación se muestra la función que usamos: function&new(cap,tema,id)& A&través&de&los&parámetros&la&función&sabe&que&tiene&que&mostrar.&En&su&interior&hay&un& entramado&de&condicionales&que&son&las&encargadas&de&elegir&el&objeto&a&mostrar.& & 3.3.4.9 variables.lua& La&ultima&librería&que&pasamos&a&explicar&es&sin&duda&es&la&mas&importante&después&de&laA directoraClass&dado&su&contenido.&Anteriomente&la&hemos&comentado&como&librería&de& contenido.&En&ella&se&almacenan&todas&las&variables&globales&que&aparecen&en&la&aplicación& asi&como&la&funciones&que&cargan&el&contenido&en&la&mayoría&de&las&escenas.&Ademas& están&guardadas&también&las&tablas&que&pasamos&como&parámetro&a&una&escena&cuando&la& cambiamos.&Vamos&a&enumerar&la&funciones&que&la&ocupan&y¶&que&sirven&cada&una&de& ellas&asi&como&todas&las&variables&globales&que&aparecen.& & Variables&Globales:& & language_state&=&false&&88&Estado&del&idioma& sound_state&=&true&&88&Estado&del&sonido& animation_state&=&true&&88&Estado&de&la&animacion& estado_temasGroup&=&false&&88&Estado&del&grupo&temasGroup& & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&39&8& Funciones:& & & new&=&function&(cap,&tema)& & Es&la&encargada&de&cargar&el&contenido&a&mostrar&en&una&escena.&Como&vemos&los& parámetros&de&carga&son&necesarios¶&que&la&función&sepa&que&debe&mostrar.&Esta& función&también&detecta&el&idioma&del&string&y&devuelve&el&correcto.&& & & & new2&=&function&(&)& & Se&ocupa&de&cargar&la&pantalla&de&configuración.&Dependiendo&de&estado&de&la&variable& language_state&carga&un&idioma&u&otro.& & & new2&=&función&()& & En&ella&esta&incluida&la&tabla&necesaria¶&el&objeto&tableView.&Tambien&diferencia&entre& el&idioma&que&necesitemos.& & & new4&=&función&()& & Esta&función&también&se&utilizar&en&la&pantalla&de&configuración&y&es&la&encargada&de& determinar&en&que&posición&debe&situarse&los&botónes&de&activado&de&sonido&y&de& animación.& new5&=&function&()& & Esta&función&la&utilizamos&en&la&pantalla&de&bienvenida.&Determina&que&idioma&debemos& elegir&a&la&hora&de&mostrar&el&titulo&y&los&textos.& & content&=&function(cap,tema,tema_seleccionado)& & Crea&todos&los&eventos&relacionados&con&la&barra&Content.&Le&damos&parámetros&dado&que& cada&capitulo&es&distinto&y&es&necesario&caracterizarlo&individualmente.& & Tablas&de&parámetros:& & Como&hemos&comentado&anteriomente&podemos&pasar&parámetros&entre&escenas&pero& solo&mediante&tablas.&Pues&eso&es&lo&que&hacemos&con&estas&tablas.&Estan&configuradas&de& tal&forma&que&cuando&llamas&a&la&escena&scene.lua&le&pasas&los&paremetros&necesarios& para&configurar&esa&escena.&La&escena&es&común¶&todos&los&&capitlos&pero&su&contenido& no,&por&lo&que&después&de&pasar&estos&parámetros&llamamos&a&la&function&de&la&librería& variables&con&esos&parámetros&y&asi&conseguimos&cargar&lo&que&nos&interesa.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&40&8& 3.3.5 TitulosAdeAlaAaplicacionA & Para&realizar&los&títulos&de&la&aplicación&se&ha&utlizado&un&recurso&Web&gratuito&y&que& aparece&en&http://cooltext.com/&Es&posible&generar&miles&tipos&de&fuentes¶&títulos.&A& continuación&se&muestra&una&pantalla&de&lo&pasos¶&genenar&un&titulo&de&la&aplicación.& & & & Figura&3.19.&Primer&paso¶&creación&de&titulo& & Lo&primero&es&seleccionar&el&estilo&del&titulo&que&queremos.&Pulsamos&encima&del&que&mas& nos&guste.&& & & Figura&3.20.&Segundo&paso¶&creación&de&titulo&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&41&8& & En&el&siguiente&paso&introducimos&el&titulo&en&el&cuadro&de&texto.&Podemos&cambiar&la& fuente&del&titulo&asi&como&el&color.&& Elegimos&el&formato&que&queremos&de&la&imagen&y&pulsamo&el&botón&render&Logo¶& generar&el&titulo.& & Figura&3.21.&Aspecto&del&titulo&definitivo& & 3.3.6 AdaptaciónAdinámicaAdeAcontenidoA A & Figura&3.22.&Dispositivo&móvil&Ipad& & Para&comenzar&es&necesario&decidir&el&tamaño&de&contenido,&con&independencia&de&las& dimensiones&de&la&pantalla.&Este&método&proporciona&el&sistema&de&coordenadas¶&el& código&de&las&aplicaciones&realizadas&con&Corona&SDK,&que&será&independiente&de&la& cantidad&real&de&píxeles&en&la&pantalla&del&dispositivo.& & Para&esto&se&define&el&tamaño&que&queremos&al&que&se&adapte&nuestra&aplicación,&el& tamaño&del&contenido,&en&el&archivo&de&la&aplicación&ubicado&config.lua.&El&código&no&tiene& por&qué&conocer&el&tamaño&real&de&la&pantalla.& & Vamos&a&configurar&nuestro&archivo&config.lua,&este&se&encarga&de&escalar&el&contenido&de& la&pantalla&del&dispositivo&que&visualiza&la&aplicación&debido&al&modo&de&escalado& (parámetro&scale&definido&en&config.lua)& 3.3.6.1 config.luaA &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&48&8& Ø Existencia&de&una&gran&heterogeneidad,&en&el&que&prácticamente¶&cada&una& de&las&principales&marcas&de&dispositivos&dispone&de&su&propio&sistema.& & Ø Una&visión&de&un&mercado&altamente&volátil&con&cambios&muy&significativos&en& periodos&muy&cortos.&Las&cifras&disponibles&en&cualquier&“time&to&market”,& resulta&difícilmente&comparable&o&extrapolar&con&el&de&desarrollos&realizados& en&otras&épocas.& & Los&sistemas&operativos&móviles&más&utilizados&actualmente&son:& & Android&:&es&un&sistema&operativo&basado&en&Linux&diseñado&originalmente¶& dispositivos&móviles,&tales&como&teléfonos&inteligentes,&pero&que&posteriormente&ha& expandido&su&desarrollo¶&soportar&otros&como&tablets,&reproductores&MP3,&netbooks,& PCs&e&incluso&televisores.&Android,&al&contrario&que&otros&sistemas&operativos¶& dispositivos&móviles&como&iOS&o&Windows&Phone,&se&desarrolla&de&forma&abierta&y&se& puede&acceder&tanto&al&código&fuente&como&al&listado&de&incidencias&donde&se&pueden&ver& problemas&aún&no&resueltos&y&reportar&problemas&nuevos.& & iOS&:&iOS&(anteriormente&denominado&iPhone&OS)&es&un&sistema&operativo&móvil&de&Apple& desarrollado&originalmente¶&el&iPhone,&siendo&después&usado&en&todos&los& dispositivos&iPhone,&iPod&Touch&e&iPad.&Es&un&derivado&de&Mac&OS&X.&La&interfaz&de&usuario& de&iOS&se&basa&en&con&el&concepto&de&manipulación&mediante&gestos&multitáctil.&Los& elementos&de&la&interfaz&se&componen&por&deslizadores,&interruptores&y&botones.&La& respuesta&es&inmediata&y&se&provee&de&una&interfaz&fluida.& & BlackBerry!OS:&es&un&sistema&operativo&móvil&desarrollado&por&Research&In&Motion&(RIM)& para&sus&dispositivos&BlackBerry.&El&sistema&permite&multitarea&y&tiene&soporte¶& diferentes&métodos&de&entrada&adoptados&por&RIM¶&su&uso&en&computadoras&de& mano,&particularmente&la&trackwheel,&trackball,&touchpad&y&pantallas&táctiles.& ! Windows!Phone:&es&un&sistema&operativo&móvil&compacto&desarrollado&por&Microsoft,&y& pensado¶&su&uso&en&dispositivos&móviles.&Se&basa&en&el&núcleo&del&sistema&operativo& Windows&CE&y&cuenta&con&un&conjunto&de&aplicaciones&básicas&utilizando&las&API&de& Microsoft&Windows.&Está&diseñado¶&ser&similar&a&las&versiones&de&escritorio&de& Windows&estéticamente.& & Symbian:&es&un&sistema&operativo&que&fue&producto&de&la&alianza&de&varias&empresas&de& telefonía&móvil,&entre&las&que&se&encuentran&Nokia,&Sony&Ericsson,&Psion,&Samsung,& Siemens,&Arima,&Benq,&Fujitsu,&Lenovo,&LG,&Motorola,&Mitsubishi&Electric,&Panasonic,& Sharp,&etc.&El&objetivo&de&Symbian&fue&crear&un&sistema&operativo¶&terminales&móviles& que&pudiera&competir&con&los&existentes&en&su&momento.&Se&está&dejando&de&utilizar& aunque&su&presencia&es&todavía&importante.& & Java!ME:&La&plataforma&Java&Micro&Edition,&o&anteriormente&Java&2&Micro&Edition(J2ME),& es&una&especificación&de&un&subconjunto&de&la&plataforma&Java&orientada&a&proveer&una& colección&certificada&de&APIs&de&desarrollo&de&software¶&dispositivos&con&recursos& restringidos.&Está&orientado&a&productos&de&consumo&como&PDAs,&teléfonos&móviles&o& electrodomésticos.&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&49&8& & MeeGo:&es&una&plataforma&basada&en&Linux&resultado&de&la&unión&de&los&sistemas& operativos&Maemo&y&Moblin,&con&el&que&Intel&y&Nokia&pretendían&competir&con&el&sistema& Android&de&Google.&El&proyecto&está&auspiciado&por&la&Linux&Foundation.& & Mobile!web&(HTML&and&JavaScript)&:&desarrollo&de&aplicaciones&web¶&móviles.& & Qt:&es&una&biblioteca&multiplataforma&liamente&usada¶&desarrollar&aplicaciones& con&una&interfaz&gráfica&o¶&programas&sin&interfaz&gráfica&como&herramientas¶&la& línea&de&comandos&y&consolas¶&servidores.&Es&producido&por&la&división&de&software&Qt& de&Nokia.&Qt&es&utilizada&en&KDE,&un&entorno&de&escritorio¶&sistemas&como&GNU/Linux& o&FreeBSD,&entre&otros.&Qt&utiliza&el&lenguaje&de&programación&C++&de&forma&nativa,& adicionalmente&puede&ser&utilizado&en&varios&otros&lenguajes&de&programación&a&través&de& bindings.& & En&la&siguiente&figura&se&puede&apreciar&la&evolución&del&porcentaje&de&utilización&de&cada& sistema&operativo.&Este&estudio&se&ha&realizado&en&los&últimos&4&años&y&esta&basado&en& encuestas&online&y&entrevistas&a&&desarrolladores&de&75&países&y&&a&ejecutivos&&que&trabajan& en&&la&industria&móvil&en&organizaciones&comerciales&y&agencias&digitales.& & Se&observa&que&Android&e&iOS&son&los&más&utilizados&con&un&53%&y&un&15%& respectivamente.&El&incremento&del&sistema&operativo&Android&de&Google&es&debido&al& crecimiento&exponencial&de&las&ventas&de&dispositivos&con&ese&sistema&operativo.& & & & Figura&3.1.&Evolucion&de&la&utilización&de&S.O.&móviles.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&50&8& & Este&mismo&estudio&muestra&que&los&sistemas&operativos&que&los&desarrolladores&están& pensando&en&utilizar¶&sus&desarrollos&futuros&son&Android&e&iOS.&Así&mismo,&Symbian& es&la&plataforma&con&las&mayor&tasa&de&abandono&por&parte&de&los&desarrolladores.&Casi&el& 60%&de&los&desarrolladores&utilizando&actualmente&Symbian&está&pensando&en&cambiar&a& otros.&Tambien&cabe&destacar&el&descenso&que&la&compañía&RIM&ha&sufrido&probablemente& por&los&fallos&que&sus&servidores&sufrieron&inexplicablemente&a&lo&largo&del&año&2011.& 6.3 Aplicaciones!web!versus!aplicaciones!nativas! Todos&los&dispositivos&móviles&tienen&uno&o&varios&navegadores&y&muchos&de&ellos&ya& soportan&HTML5,&por&lo&que&una&opción&de&desarrollo&de&aplicaciones&es&simplemente,& crear&una&aplicación&web&y&usarla&desde&el&navegador&de&uno&de&estos&dispositivos.&& & Ventajas:& Ø Diseño!más!sencillo:&Es&suficiente&con&solo&hacer&un&diseño&adaptado&a&una& pantalla&y&resolución&pequeñas,&simplemente&adaptando&un&CSS&por&cada& dispositivo.&Además,&las&aplicaciones&web&se&pueden&“tunear”¶&que& parezcan&aplicaciones&nativas:&icono&de&aplicación,&pantalla&completa,&splash& screen,&barra&de&estado,&etc.& & Ø Implementación:&las&aplicaciones&web&pueden&ser&desarrolladas&en&cualquier& tecnología&de&servidor,&así&que&podemos&usar&cualquier&lenguaje&que&ya&se& conozca&(Java,&Grails,&Php,&Ruby,&Python,…)&con&la&seguridad&de&que&la& aplicación&se&verá&prácticamente&igual&en&todos&los&terminales.& & Ø Seguridad:&Se&controla&el&acceso&a&la&aplicación&y&se&puedes&actualizar&sin& necesidad&de&acción&del&usuario.&& & Desventajas:& & Ø Acceso!APIs!del!dispositivo:&no&hay&acceso&completo&a&todas&las&APIs&nativas& del&móvil.&Aunque&la&cámara&y&elµ&son&accesibles&con&Flash,&todos& sabemos&que&esa&tecnología&está&vetada&en&iOS.&Desde&HTML5&y&Javascript,&es& posible&acceder&a&las&coordenadas&del&GPS,&pero&no&en&tiempo&real&ni&de&la& misma&manera&que&si&pudiéramos&acceder&a&la&API&del&móvil&directamente.&Y&lo& mismo&con&otras&funciones&de&los&dispositivos.& & Ø Mayor!implicación!de!usuario:¶&usar&una&aplicación&web&en&un&móvil,&es& necesario&que&el&usuario&abra&el&navegador&y&teclee&la&dirección,&ya&sea&porque& la&sepa,&la&haya&encontrado&en&Google.&Una&vez&abierta&la&aplicación,&debe& añadirla&a&favoritos&o,&mejor&todavía,&crear&un&icono&de&acceso&directo&en&el& móvil¶&acceder&a&ella&más&tarde.&&Es&mucho&más&fácil&descargar&una& aplicación&y&que&aparezca&directamente&como&un&icono&en&nuestro&móvil.& & & Ø Velocidad!de!ejecución!y!conectividad:&Ejecutar&una&aplicación&nativa&es& menos&costoso&que&renderizar&HTML&e&interpretar&JavaScript.&Además&cada&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&51&8& petición&desde&nuestra&aplicación&implicará&un&acceso&contra&nuestro&servidor.& Una&aplicación&nativa&tiene&todos&los&recursos&y&procesos&guardados&en&local,&y& solo&accede&al&servidor¶&obtener&o&enviar&datos&si&es&que&los&necesita.&Por& tanto,&una&aplicación&web&no&tiene&la&fluidez&y&velocidad&de&manejo&que&una& aplicación&nativa.& & Ø Monetización:&es&más&fácil&que&un&usuario&pague&por&nuestros&servicios&si& simplemente&cobramos&por&nuestra&aplicación&al&descargarla&del&App&Store,& que&no&hacer&que&el&usuario&se&tenga&que®istrar&y&efectuar&el&pago&en& nuestra&web,&introduciendo&manualmente&todos&sus&datos&como&el&número& tarjeta,&dirección,&etc.&Apple&tiene&su&App&Store¶&IOS&y&MacOS,&Google&su& Chrome&Web&Store,&Google&Apps&Marketplace&y&el&Android&Market,&Amazon&su& Amazon&Appstore,&incluso&hay&markets&alternativos&como&OpenAppMkt.&Cada& vez&más&empresas&invierten&en&crear&un&entorno&fácil&y&cómodo¶&que&el& usuario&pueda&descargar,&probar&y&comprar&aplicaciones,&repartiéndose&los& beneficios.& 6.4 Desarrollo!aplicaciones!móviles!nativas!para!iOS!y!Android! Como&se&ha&indicado&anteriormente,&cada&plataforma&tiene&su&propio&lenguaje,& herramientas&de&desarrollo&y&Apis&con&los&que&crear&aplicaciones.&Se&detallan&los&dos&más& importantes,&iOS&y&Android.& & IOS! Utiliza&el&lenguaje&Objective8C,&aunque&también&se&puede&utilizar&C/C++.&Con&este&lenguaje& podemos&crear&aplicaciones¶&Iphone,&Ipad&y&Ipod&Couch&en&sus&distintas&versiones.& Hay&también&distintas&versiones&de&IOS&pero&todas&ellas&se&programan&usando&el&mismo& lenguaje.&Objective8C&tiene&una&sintaxis&un&tanto&compleja&de&escribir&y&de&leer.& & Xcode&es&el&entorno&de&desarrollo&oficial&de&Apple.&Con&él,&podemos&crear&aplicaciones&de& escritorio¶&Mac&y¶&IOS.&También&se&pueden&utilizar&editores&de&texto&plano&y& compilar&las&aplicaciones&“a&mano”,&es&una&tarea&casi&imposible.Se&necesita&de&un& ordenador&Mac&con&el&IPhone&SDK&y¶&distribuir&aplicaciones&en&el&App&Store&y¶& poder&probar&las&aplicaciones&desarrolladas&en&nuestro&propio&Iphone/Ipad,&es&necesario& adquirir&una&licencia&de&desarrollador.& & Android! Android&es&menos&restrictivo.&El&lenguaje&que&se&utiliza¶&programar&aplicaciones&es& Java&y&tiene&un&SDK&multiplataforma&que&funciona&en&Windows,&Linux&y&Mac.&& Se&puede&utilizar&como&entorno&de&desarrollo&un&plugin&ADT¶&Eclipse&que&incluye&un& simulador,&que&también&es&multiplataforma,&libre&y&gratuito& 6.5 Desarrollo!móvil!multiplataforma! Existen&diversas&opciones&que&permiten&desarrollar&aplicaciones&multiplataforma.&Un& software&con&el&que&es&posible&programar&con&un&lenguaje&determinado&y&que,&además,& permite&que&la&aplicación&funcione&en&varios&dispositivos&con&un&mismo&código.&& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&52&8& 6.5.1 PhoneGapAA PhoneGap&es&un&sistema¶&crear&aplicaciones&usando&HTML5,&CSS3&y&Javascript,& ejecutadas&dentro&en&un&componente&WebKit&del&móvil.&Provee&una&serie&de&librerías& Javascript&desarrolladas&en&el&lenguaje&específico&de&cada&plataforma&(Objetctive8C¶& IOS,&Java¶&Android,&etc)&que&permiten&acceder&a&las&características&del&móvil&como& GPS,&acelerómetro,&cámara,&contactos,&base&de&datos,&filesystem,&etc.&& & Al&ser&una&página&web,&se&tiene&acceso&al&DOM&y&se&puede&usar&frameworksAweb&como& jQuery&o&cualquier&otro.&Requiere&diseñar&la&aplicación&web&con&los&componentes&visuales& típicos&del&HTML,&etc&o&usar&un&frameworkAwebAmobile&como&jQueryAMobile&o&SenchaA Touch&entre&otros.&Tiene&la&ventaja&de&que&se&puede&definir&la&navegación&inicial&de&la& aplicación&usando&un&navegador&en&un&ordenador,&sin&tener&que&ejecutarla&en&el& simulador.& & Se&puede&ver&una&aplicación&PhoneGap&como&una&serie&de&páginas&web&que&están& almacenadas&y&empaquetadas&dentro&de&una&aplicación&móvil,&visualizadas&con&un& navegador&web,&con&acceso&a&la&mayoría&de&APIs&del&móvil,&lo&cual&lo&convierte&en&una& alternativa&muy&sencilla¶&crear&aplicaciones.& & Para&trabajar&con&cada&plataforma&hay&que&usar&un&sistema&distinto:¶&Iphone/Ipad&es& necesario&usar&Xcode&(solo&disponible&en&Mac)&y&una&plantilla&de&proyecto&que& proporciona&PhoneGap.&Para&Android&se&debe&usar&Eclipse&(Windows,&Mac&y&Linux)&y&otra& plantilla&de&proyecto&específica.&Y¶&Blackberry&no&hay&entorno:&solo&Java&SDK,& BlackBerry&SDK&y&Apache&Ant.& & Ventajas:! Ø Es&la&solución&que&más&plataformas&móviles&soporta,&ya&que&corre&dentro&de&un& navegador&web.&Además&de&Iphone/Ipad&y&Android,&funciona&también&en&Palm,& Symbian,&WebOS,&Windows&mobile&7&y&BlackBerry,& Ø Es&muy&fácil&de&desarrollar&y&proporciona&una&gran&libertad&a&los&que&tienen& conocimientos&de&HTML&y&Javascript.& Ø Hay&buena&documentación&y&bastantes&ejemplos.& Ø Es&gratis,&soporte&de&pago.&Licencia&BSD.& & Inconvenientes:! Ø Requiere&Mac&con&Xcode¶&empaquetar&aplicaciones&IOS.& Ø La&aplicación&no&es&más&que&una&página&web,&por&lo&que&el&aspecto&dependerá& del&framework&web&utilizado.&Necesitaremos&el&uso&de&frameworks&HTML& móviles&si&queremos&que&parezca&una&aplicación&nativa.& Ø No&llega&al&rendimiento&de&una&aplicación&nativa,&pues&el&HTML,&CSS&y& Javascript&debe&ser&leído&e&interpretado&por&el&motor&del&navegador&cada&vez& arranca.& & 6.5.2 TitaniumAAppceleratorA Con&Appcelerator&es&posible&crear&aplicaciones¶&Android,&Iphone&y&de&escritorio,& usando&exclusivamente&Javascript&(el&soporte¶&Blackberry&está&en&fase&beta).&&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&53&8& Para&programar&proporciona&Titanium&Studio,&un&IDE&basado&en&Eclipse&con&el&que&crear& los&proyectos&y&editar&los&ficheros&Javascript&y&el&resto&de&recursos&y&lanzar&los&scripts&de& creación.&& & Las&aplicaciones&se&programan&íntegramente&con&Javascript,&creando&y&colocando&“a& mano”&todos&los&controles,&usando¶&ello&una&librería&que&hace&de&puente&entre&la&& aplicación&Javascript&y&los&controles&del&sistema.&Esto&significa&que&las&ventanas&y&demás& controles&visuales&(botones,&listas,&menús,&etc)&son&nativos:&cuando&se&añade&un&botón,&se& crea&un&botón&del&sistema&y&se&añade&a&la&vista,&lo&que&lo&hace&más&rápido&de&renderizar&y& la&respuesta&del&usuario&es&también&rápida.&& & Una&de&las&características&más&interesantes&de&Appcelerator&es&que&al&empaquetar&la& aplicación,&el&Javascript&es&transformado&y&compilado.&Después,&cuando&se&arranca&la& aplicación&en&el&móvil,&el&código&se&ejecuta&dentro&de&un&engineAJavascript,&tal&y&como&dice& la&documentación&oficial,&que&será&JavaScriptCore&en&IOS&(el&intérprete&de&Webkit,&el& motor&de&Safari&y&Chrome)&y&MozillaARhino&en&Android/Blackberry.&& & El&hecho&de&que&el&Javascript&esté&compilado&y&que&los&controles&creados&sean&nativos,&le& hace&tener&mejor&rendimiento&posible&en&comparación&con&PhoneGap&o&Adobe&Air¶& móviles&y&similar&a&Corona&SDK.& & Con&Appcelerator&es&complicado&maquetar,&pues&no&existe&un&HTML&inicial&donde&añadir& los&controles,&sino&que&hay&que&crear&las&ventanas&y&componentes&“a&mano”&con& Javascript.&& & Los&desarrollos&de&las&librerías&Javascript¶&cada&sistema&operativo&evolucionan&por& separado&por&lo&que&es&posible&que&no&funcionen&de&la&misma&manera.&A&diferencia&de& PhoneGap,&que&solo&tiene&una&librería&Javascript¶&acceder&a&las&características& especiales&del&sistema,&Appcelerator&necesita&además&librerías¶&manejar&los&controles& nativos&y&su&disposición&en&la&pantalla,&por&lo&que&el&desarrollo&en&general&es&más&costoso.& & Para&iOS,&Titanium&Studio&genera&un&proyecto&Xcode&con&el&Javascript&transformado&junto& con&todas&las&librerías&necesarias.&Después&es&posible&lanzar&el&simulador&con&la&aplicación& en&Xcode&sin&salir&de&Titanium&Studio.&Una&vez&generado&el&proyecto,&éste&se&puede&abrir& con&Xcode&y&continuar&empaquetándolo&y&configurándolo¶&su&distribución& (certificados,&provisioning,&logos,&splash&screen,&etc).&Desde&Xcode&no&se&puede&editar&el& JavaScript,&se&debe&volver&a&editar&en&Titanium&Studio&y®enerar&el&proyecto&Xcode&otra& vez.& && Sobre&el&soporte&Android,&tanto¶&probar&en&el&simulador&como¶&&empaquetar&la& aplicación,&solo&hay&que&tener&el&SDK&de&Android&instalado.& & Ventajas:& Ø Multiplataforma&móvil&y&también&de&escritorio.& Ø Aspecto&y&controles&nativos.&Buen&rendimiento.& Ø Buenos&ejemplos&& Ø Gratis,&soporte&de&pago.&Licencia&Apache.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&54&8& Desventajas:& Ø Definición&de&componentes&visuales&y&ubicación&de&controles&compleja& Ø Mucha&documentación&pero&poco&actualizada& Ø Requiere&Mac&y&Xcode¶&empaquetar&aplicaciones&IOS.& & 6.5.3 AdobeAAirAMobileA Adobe&Air&mobile&funciona&con&Flex&4&y&soporta&las&plataformas&IOS,&Android&y&BlackBerry& Tablet,&además&de&los&sistemas&de&escritorio&Windows,&Mac&y&Linux&(a&través&de&un& runtime).&Flex&4&utiliza&el&lenguaje&de&programación&ActionScript,&de&tipado&fuerte&y&con& clases,&interfaces,&herencia&y&paquetes&muy&parecido&a&Java&con&el&que&poder&hacer& complejos&desarrollos.&& & El&IDE&oficial,&Flash&Builder&4.5&es&un&IDE&muy&potente&y&es&de&pago.&Es&posible&compilar&y& empaquetar&las&aplicaciones&con&el&FlexASDKAopensource&y&gratuito&pero&es&más&complejo.& Los&controles&visuales&usados&durante&el&desarrollo&y&ejecución&no&son&los&originales&de& cada&plataforma,&sino&que&son&específicos&de&Flex&4.&Esto&garantiza&que&todas&las& aplicaciones&tendrán&exactamente&el&mismo&aspecto&y&comportamiento.& & Se&pueden&depurar&aplicaciones&en&remoto.&Una&de&las&peculiaridades&es&que&es&la&única& herramienta&que&no&requiere&ni&el&Android&SDK&ni&el&Xcode¶&Mac¶&ejecutar&y&crear& las&aplicaciones.& & Ventajas:& Ø Multiplataforma&móvil&y&también&de&escritorio.& Ø ActionScript&es&un&lenguaje&muy&potente&que&permite&el&uso&de&patrones&y& estructuras&complejas&en&los&desarrollos.& Ø Desarrollo&y&definición&de&las&vistas&con&el&editor&visual&de&MXML&con&Flash&Builder.& El&IDE&y&Flex&4&son&muy&potentes,&y&la&documentación&buena.&& Ø Flash&Builder&4.5&no&requiere&el&uso&de&Xcode&ni&Mac.& Ø Depuración&remota.& & Desventajas:! Ø El&precio&de&Flash&Builder&4.5.&Aunque&hay&otras&herramientas&y&se&puede&usar&el& SDK&gratuito.& Ø No&funciona&en&todos&los&Android,&solo&en&los&de&gama&alta&que&tengan& arquitectura&Arm7.&& Ø Rendimiento&es®ular&y&la&renderización&no&es&suave&en&IOS.&& Ø Aspecto&no&nativo&(aunque&homogéneo&entre&todas&las&plataformas).& & 6.5.4 CoronaASDKA Corona&es&un&framework¶&el&desarrollo&de&aplicaciones&gráficas¶&iOS/Android&de&la& compañía&Ansca&Mobile.&Se&desarrolla&en&Lua&y&no&tiene&IDE,&aunque&si&viene&con&un& interprete8emulador&y&multitud&de&ejemplos.&& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&55&8& Contiene&varios&simuladores¶&cada&uno&de&los&dispositivos¶&los&que&se&puede& desarrollar&y&un&depurador&por&línea&de&comandos.&El&emulador&dispone&así&mismo&de&un& terminal&que&permite&mostrar&mensajes&de&trazas&durante&la&ejecución.&& & No&son&necesarios&conocimientos&de&Objective8C/Cocoa,&C&+&+&o&Java.&Lua&es&un&lenguaje& de&programación&imperativo,&estructurado&y&bastante&ligero&que&fue&diseñado&como&un& lenguaje&interpretado&con&una&semántica&extendible.&& & Contiene&un&conjunto&limitado&de&librerías&propias&de&Lua&así&como&otras&propias&del&SDK& que&aportan&la&funcionalidad&y&apariencia&propia&de&estos&dispositivos&móviles,&en&especial& de&los&de&Apple.& & Hay&que&pagar&una&licencia¶&cada&plataforma&o&una&conjunta¶&IOS/Android.&& & Ventajas:! Ø Alto&rendimiento&en&la&ejecución&de&aplicaciones.& Ø Motor&gráfico&y&físico&ideal¶&juegos.& Ø Lua&es&un&lenguaje&bastante&sencillo&y&potente.& Ø Buena&documentación,&ejemplos&y&plantillas.&Amplia&comunidad.& Ø Incorpora&elementos&nativos,&sobre&todo&de&iOS&muy&sencillos&de&implementar.& & Desventajas:! Ø El&precio&de&la&licencia&anual.& Ø Aunque&se&puede&usar¶&cualquier&tipo&de&aplicación,&realmente&es&ideal¶& aplicaciones&gráficas&y&juegos.& Ø Está&en&evolución.& & 6.5.5 PlataformaAseleccionadaA & Después&del&estudio&de&las&características&de&los&distintos&entornos&multiplataforma,&estás& son&las&conclusiones.& & En&todos&los&casos,&&los&lenguajes&de&las&plataformas,&Lua,&JavaScript&y&ActionScipt,&son& suficientemente&potentes&y&además,&sencillos&de&implementar.&&& & Para&el&diseño&de&la&aplicación,&el&más&avanzado&es&el&de&adobe&que&tiene&su&propio&editor.& El&resto&necesitan&de&una&colocación&un&tanto&manual,&aunque&en&Corona&SDK&se&pueden& crear&grupos&que&facilitan&el&diseño.& & Appcelerator&y&Corona&son&los&únicos&que&permiten&crear&controles&nativos&de&cada& plataforma&aunque&la&utilización&y&ubicación&gráfica&de&estos&en&Appcelerator&es&más& compleja.&Adobe&permite&usar&sus&propios&componentes&con&resultado&homogéneo&en& todas&las&plataformas.& & PhoneGap&es&el&que&más&sistemas&operativos&soporta.&El&resto&cubren&las&más& importantes&Android&e&iOS.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&56&8& El&rendimiento&de&la&aplicación&es&muy&bueno&en&Corona&SDK&así&como&también&en& Appcelerator.&Las&otras&dos&opciones&son&menos&rápidas&aunque&con&un&rendimiento& aceptable.& & Con&respecto&a&la&documentación&disponible,&Corona&SDK&es&la&que&tiene&más&disponible&y& con&una&lia&comunidad&en&la&página&web&de&la&compañía.&Es&una&herramienta&en& evolución&pero&la&documentación&está&siempre&actualizada.&La&documentación&en&Adobe& también&es&bastante&completa.&Las&otras&dos&son&herramientas&jóvenes&que&todavía&les& falta¶&estar&acabadas:&sus&APIs&cambian,&están&incompletas&y&a&veces&fallan&y&la& documentación&es®ular.& & En&cuanto&a&la&distribución,&la&plataforma&de&Adobe&es&la&única&que&no&necesita&tener&un& Mac¶&desarrollar¶&iOS.& & Appcelerator&y&PhoneGap&son&gratuitos,&solo&hay&que&pagar¶&el&soporte.&Flash&Builder& 4.5&Premium&tiene&un&precio&muy&elevado,&aunque&se&puede&usar&la&versión&de&prueba& durante&30&días&y&hay&SDK&libres.&Corona&SDK&es&gratis¶&desarrollo,&pero&requiere& pagar&una&licencia&anual&de&$199&si&quieres&subir&tus&aplicaciones&al&App&Store&o&Market& de&Android&o&$349¶&ambos.& & Con&estos&criterios,&las&dos&mejores&opciones&por&rendimiento&y&por&posibilidad&de&utilizar& componentes&nativos&son&Corona&SDK&y&Appcelerator.&Eliminando&la&restricción& económica&asociada&a&las&licencias&de&Corona&SDK,&y&dado&que&la&gestión&gráfica&es&mejor& y&la&documentación&más&completa&en&esta&plataforma,&se&selecciona&Corona!SDK&como& base¶&el&desarrollo&de&la&aplicación&móvil&de&este&proyecto.& & 7 Plataforma Corona SDK. Características 7.1 Introducción!a!la!Plataforma!Corona!SDK! La&plataforma&Corona&SDK&es&un&entorno&de&desarrollo&de&aplicaciones&móviles¶&la& creación&de&aplicaciones&de&altas&prestaciones,&aplicaciones&multimedia&y&juegos¶& dispositivos&iOS,&Android&y&Kindle.& & Corona&SDK&contiene&un&simulador¶&cada&uno&de&los&dipositivos&con&sistema&operativo& móvil&de&Apple,&y¶&varios&modelos&de&dispositivos&con&sistema&operativo&Android.& Tambien&contiene&un&depurador&por&línea&de&comandos&así&como&aplicaciones&de&ejemplo& y&documentación.& & Permite&a&los&desarrolladores&usar&Lua,&un&lenguaje&de&scrip&de&alto&rendimiento& construido&sobre&un&motor&de&Objective8C/C++.&&No&son&necesarios&conocimientos&de& Objective8C/Cocoa,&C&+&+&o&Java.&Lua&es&un&lenguaje&de&programación&imperativo,& estructurado&y&bastante&ligero&que&fue&diseñado&como&un&lenguaje&interpretado&con&una& semántica&extendible.&& & Contiene&un&conjunto&limitado&de&librerías&propias&de&Lua&así&como&otras&propias&del&SDK& que&aportan&la&funcionalidad&y&apariencia&propia&de&estos&dispositivos&móviles,&en&especial& de&los&de&Apple.&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&57&8& 7.2 Gestión!de!proyectos!en!Corona!SDK! Para&crear&aplicaciones&en&Corona&SDK&se&necesita&instalar&la&aplicación&Corona&SDK&en& entorno&Mac&o&Windows&y&utilizar&un&editor&de&texto¶&generar&los&archivos&con&el& código.&La&versión&de&prueba&de&Corona&SDK&nos&permite&realizar&pruebas&con&el& simulador&en&dispositivos&Android&o&iOS&(solo&en&equipos&Mac).&Para&construir& aplicaciones&y&distribuirlas&en&la&AppStore&o&el&android&Market&es&necesario&comprar&una& licencia.& & Para&crear&un&proyecto&de&Corona&es&necesario&como&minimo&una&carpeta&que&contenga& un&archivo&de&texto&llamado&"main.lua".&&Este&archivo,&"main.lua",&es&&el&primer&archivo& que&lee&Corona&SDK&por&lo&que&si&no&esta&disponible&la&aplicación&no&puede&iniciarse.&Este& archivo&principal,&a&su&vez,&puede&cargar&otros&archivos&de&código&externo,&o&recursos&de& otros&programas,&tales&como&sonidos,imágenes&o&videos.&La&extensión&de&archivo&".&lua"& indica&que&el&archivo&está&escrito&en&lenguaje&en&ese&lenguaje,&que&es&el&que&se&usa¶& crear&aplicaciones&en&Corona&SDK.& & De&cara&a&la&construcción&de&la&aplicación,&en&la&carpeta&del&proyecto&existen&2& posibilidades&de&configuración&mediante&ficheros.&El&primero&es&el&fichero&config.lua&con& las&dimensiones&del&contenido&visible&y&el&modo&de&escalado&de&la&pantalla.&Este&archivo&se& comenta&más&adelante&en&la&implementación&del&proyecto&al&tratar&la&adaptación& dinámica&de&contenido&en&la&pantalla.&También&se&debe&añadir&un&archivo&Icon.png&que& será&el&icono&de&la&aplicación&al&instalarse&en&el&dispositivo&final&.&El&segundo&fichero&que& podemos&incluir&es&el&denominado&build.settings&que&describe&las&propiedades&en&tiempo& de&construcción.&Más&adelante,&en&las&tareas&de&administración&se&comentarán&las& opciones&de&este&archivo.& 7.3 Lenguaje!de!Corona!SDK:!Lua! 7.3.1 GeneralidadesA Lua&es&un&lenguaje&de&programación&imperativo,&estructurado&y&bastante&ligero&que&fue& diseñado&como&un&lenguaje&interpretado&con&una&semántica&extendible..&Fue&creado&en& 1993&en&la&universidad&católica&de&Rio&de&Janeiro&&y&cuyo&nombre&significa&“Luna”&en& portugués.&&Es&muy&utilizado&en&programación&de&videojuegos&asi&como&en&aplicaciones& para&videoconsolas&como&PSP&y&Wii.&&& & A&continuación&se&detalla&el&uso&del&lenguaje&asi&como&las&librerías&propias&que&posee&Lua& y&se&incluyen&algunos&ejemplos¶&poder&comprender&como&funciona.& & Identificadores& Puede&ser&cualquier&cadena&de&caracteres&que&incluya&letras,&dígitos&y&guiones&bajos.&Los& identificadores&se&utilizan&como&nombres&de&variables&y&campos&de&tablas.&Se&distinguen& las&mayúsculas&y&minúsculas& & Palabras!clave& Como&cualquier&otro&lenguaje&de&programación,&Lua&utiliza&una&serie&de&palabras¶& crear&las&instrucciones&que&forman&cada&programa.&Por&este&motivo,&estas&palabras&se& consideran&reservadas&y&no&se&pueden&utilizar&como&nombre&de&una&variable&o&función.&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&64&8& & for i=1, 25, 5 do print (i) end & La&sentencia&for&genérica&trabaja&con&funciones,&denominadas&iteradores.&En&cada& iteración&se&invoca&a&la&función&iterador&que&produce&un&nuevo&valor,&parándose&la& iteración&cuando&el&nuevo&valor&es&nil.&El&bucle&for&genérico&tiene&la&siguiente&sintaxis:&& && for&lista_de_nombres&in&explist&do&& bloque&& end! & for&lista_de_nombres&in&explist&do&bloque&end& &&&lista_de_nombres&::=&nombre&{','&nombre}& & Por&ejemplo,&este&bucle&recorre&las&líneas&de&un&fichero& & for line in io.lines(filename) do print (line) end & break! La&orden&break&se&usa¶&terminar&la&ejecución&de&los&bucles&while,&repeat&y&for,& saltando&a&la&sentencia&que&sigue&después&del&bucle.& & Un&break&finaliza&el&bucle&más&interno&que&esté&activo.& 7.4.1 FuncionesA La&sintaxis¶&la&definición&de&funciones&es&:& &&&function&nombre_de_func&(&[lista_de_argumentos]&)&bloque&end& & Así&mismo&se&puede&utilizar.& &&&nombre_de_func&=&function&(&[lista_de_argumentos]&)&bloque&end& & Una&definición&de&función&es&una&expresión&ejecutable,&cuyo&valor&tiene&el&tipo&function.&&& & Los&argumentos&formales&de&una&función&actúan&como&variables&locales&que&son& inicializadas&con&los&valores&actuales&de&los&argumentos.& & La&orden&return&se&usa¶&devolver&valores&desde&una&función.&Las&funciones&pueden& retornar&más&de&un&valor.& 7.4.2 Objetos,ApropiedadesAyAfuncionesA Muchas&de&las&API’s&de&Corona&SDK&devuelven&objetos.&Las&propiedades&de&esos&objetos& son&manipulables&(datos,&posición,&visibilidad,&escala…&)&y&se&pueden&añadir&nuevas&como& si&tratara&de&una&tabla.&&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&65&8& & Las&nuevas&propiedades&no&pueden&comenzar&con&el&carácter&guión&bajo&("_"),&ya&que&está& reservado¶&el&sistema.Todas&las&propiedades&se&puede&acceder&a&través&de&la&cadena& que&representa&el&índice,&&&tabla[“propiedad”]&o&del&operador&punto&("."),&tabla.propiedad& .&& & Dado&que&las&funciones&pueden&ser&variables,&una&tabla&puede&almacenar&estas&como& propiedades.&Esto&permite&que&una&tabla&pueda&ser&utilizada¶&agrupar&lógicamente& una&familia&de&funciones,&por&ejemplo,&la&biblioteca&matemática&(math).&Las&funciones& pueden&utilizarse&también&como&los&métodos&asociados&al&objeto.& & Una&diferencia&clave&entre&una&función&almacenada&como&propiedad&o&un&método&de&un& objeto,&es&la&sintaxis.&Se&necesita&decirle&a&Lua&que&tiene&la&intención&de&llamar&a&esta& función&como&un&método&de&objeto,&no&sólo&una&función&normal.&Para&ello,&es&necesario& utilizar&el&operador&dos&puntos&(":")&en&lugar&del&operador&punto&(".").& & Objeto:funcion(&arg1,&arg2&)& & El&operador&dos&puntos&es&en&realidad&un&acceso&directo.&En&la&mayoría&de&lenguajes,&una& llamada&al&método&objeto&es&como&una&llamada&a&la&función&normal,&excepto&que&hay&un& argumento&oculto¶&la&función&que&es&el&objeto&mismo.&Este&argumento&oculto&que&se& conoce&como&this&en&Javascript&y&self&en&Lua.&Igualmente&se&podría&llamar&un&método&de& objeto&mediante&el&operador&punto,&si&se&pasa&el&objeto&como&primer&argumento:& & Objeto.funcion(&Objeto,&arg1,&arg2&)& & 7.5 Librerías!estándar!de!Lua! Corona&SDK&incluye&las&mismas&bibliotecas&Lua&que&son&parte&del&estándar.&Estas& bibliotecas&proporcionan&una&funcionalidad&útil&y&básica.&Se&agrupan&en&las&siguientes& categorías:& & Ø Biblioteca&básica:&&proporciona&algunas&funciones&del&núcleo&de&Lua& & Ø Manipulación&de&cadenas:&proporciona&funciones¶&tratamiento&de&cadenas,& búsquedas&y&detección&de&patrones.& & Ø Manipulación&de&tablas:&proporciona&funciones&genéricas¶&manejo&de&tablas& & Ø Funciones&matemáticas:&Esta&biblioteca&es&una&interfaz&a&la&biblioteca&matemática& estándar&de&C.&& & Ø Funciones&de&entrada&y&salida:&proporciona&dos&estilos&diferentes&de&manejo&de& ficheros.&El&primero&de&ellos&usa&descriptores&de&fichero&implícitos;&esto&es,&existen& dos&ficheros&por&defecto,&uno&de&entrada&y&otro&de&salida,&y&las&operaciones&se& realizan&sobre&éstos.&El&segundo&estilo&usa&descriptores&de&fichero&explícitos.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&66&8& Ø Funciones&de&sistema&operativo:&proporciona&funciones&asociadas&al&sistema& operativo&del&dispositivo.& & &A&excepción&de&la&biblioteca&básica,&cada&biblioteca&ofrece&todas&sus&funciones&como& propiedades&de&una&tabla&o&como&los&métodos&de&sus&objetos.&Esto&crea&una&agrupación& lógica&de&funciones&y&es&la&manera&de&crear&en&Lua&un&espacio&de&nombres&de&diferente& funcionalidad.& & Los&detalles&de&las&funciones&de&cada&biblioteca&se&especifican&en&el&Anexo&I&de&esta& memoria.& 7.6 Librerías!de!Corona!SDK! Corona&SDK&posee&su&propio&conjunto&de&bibliotecas&sobre&las&bibliotecas&estándar&de&Lua.& Algunas&bibliotecas&están&incorporadas&internamente,&mientras&que&otras&deben&ser& cargadas&explícitamente.& & &Las&siguientes&son&las&bibliotecas¢rales&de&Corona&SDK&y&se&cargan&automáticamente& cuando&se&inicia&la&aplicación:& & Ø display&&8&proporciona&todas&las&rutinas¶&la&creación&de&objetos&de& visualización.& & Ø transition&&8&funciones¶&la&animación&de&objetos&de&visualización,&lo&que& simplifica&el&proceso&de&creación&de&movimientos&básicos.& & Ø timer&8&ofrece&funciones&básicas&de&tiempo.& & Ø media&8&permite&el&acceso&a&las&capacidades&multimedia&del&dispositivo.& & Ø native&8&proporciona&acceso&a&los&elementos&de&la&interfaz&nativa&de&los& dispositivos.& & Ø system&8&es&un&conjunto&de&funciones&de&sistema.& & Los&detalles&de&las&funciones&de&cada&una&de&estas&bibliotecas&se&especifican&en&el&Anexo&I& de&esta&memoria.& & & & 7.7 Visualización!de!objetos!en!pantalla! Como&se&ha&comentado,&la&biblioteca&display&contiene&las&funciones¶&crear&los&objetos& gráficos,&tanto&imágenes,&texto&o&formas&geométricas.&& & Para&gestionar&el&orden&en&que&se&dibujan&los&objetos&gráficos,&están&organizados&en&una& jerarquía&que&determina&que&objetos&aparecen&por&encima&de&otros.&La&jerarquía&es& posible&gracias&a&la&existencia&de&objetos&de&grupo,&GroupObjects.&Son&un&tipo&especial&de&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&67&8& DisplayObject&que&pueden&contener&otros&objetos&hijos.&Permiten&organizar&los&objetos& gráficos¶&poder&establecer&relaciones&entre&ellos.&& & Los&objetos&pertenecientes&a&un&grupo,&es&decir,&los&hijos,&están&organizados&en&un&array& por&lo&que&el&primer&hijo&(índice&1)&está&por&debajo&del&siguiente&hijo,&y&así&sucesivamente,& el&último&hijo&está&siempre&por&encima&de&todos&los&demás.& & group:insert()&es&el&método¶&insertar&objetos&dentro&de&un&determinado&grupo& existente&y&el&acceso&a&los&objetos&se&puede&realizar&con&el&índice&correspondiente,& group[1]&.&& & -- se crean objetos local square = display.newRect( 0, 0, 100, 100 ) local rect = display.newRect( 0, 0, 100, 100 ) -- se crea el grupo local group = display.newGroup() -- se insertan objetos group:insert( square ) group:insert( rect ) -- acceso indexado a los objetos assert( (group[1] == square) and (group[2] == rect) ) & Para&mover&objetos&hacia&adelante&y&hacia&atrás&se&puede&cambiar&el&índice&asociado&a&los& mismos&o&bien&utilizar&los&métodosAobject:toBack()&y&object:toFront()& & Las&modificaciones&realizadas&en&las&propiedades&de&los&objetos&son&actualizadas&en&la& pantalla&de&acuerdo&al&ciclo&definido&en&el&sistema.&Este&se&ejecuta&30&o&60&veces&por& segundo&de&acuerdo&al&valor&de&velocidad&de&actualización&de&la&pantalla&(frameArate)& establecido&en&el&fichero&config.lua.&Cada&ciclo&genera&un&evento&“enterframe”&que&es& capturable&por&un&listener&del&código&Lua.& & La&pantalla&representa&el&sistema&de&coordenadas&base¶&los&objetos.&Cada&objeto&o& grupo&de&visualización&opera&con&su&propio&sistema&de&coordenadas&local&y&se&debe& relacionar&con&las&coordenadas&de&la&pantalla.& & Para&definir&la&posición&se&utiliza&el&sistema&de&coordenadas&cartesianas.&El&origen&de&la& pantalla&se&encuentra&en&la&esquina&superior&izquierda,&como&se&observa&en&la&figura&4.2,& de&modo&que&valores&positivos&de&y,&desplazan&la&posición&hacia&abajo&y&valores&positivos& de&x,&la&desplazan&a&la&derecha.&Todas&las&coordenadas&de&la&pantalla&se&definen&en& relación&con&este&origen.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&68&8& & & Figura&4.1.&Origen&de&coordenadas&en&las&pantallas&de&los&dispositivos& & Cuando&un&objeto&es&creado,&sus&coordenadas&son&relativas&a&la&pantalla&principal.&Cuando& se&añade&un&listener¶&eventos&táctiles&(touchAevents)&al&objeto,&este&devuelve&la& posición&en&la&pantalla.&Cuando&el&objeto&es&añadido&a&un&grupo,&las&coordenadas&de&este& objeto&son&relativas&a&las&del&grupo&y&no&a&las&de&la&pantalla.&Para&poder&obtener&las& coordenadas&de&pantalla&podemos&llamar&al&método&object.contentBounds()& & Dado&que&los&dispositivos&tienen&recursos&limitados,&es&importante&eliminar&los&objetos&de& visualización&de&la&jerarquía&de&la&pantalla&cuando&ya&no&se&usan.&Esto&ayuda&al& rendimiento&general&del&sistema&al&reducir&el&consumo&de&memoria&(especialmente&las& imágenes).&En&el&apartado&de&gestiónAdeAlaAmemoria&de&este&capítulo&se&explica&como& eliminar&los&objetos&de&visualización&de&la&forma&más&adecuada.& & Los&objetos&gráficos&son&instancias&de&la&clase&DisplayObject&que&posee&propiedades&y& métodos&comunes¶&todos&ellos&y&como&todos&los&objetos&en&Lua,&puede&ser&tratado& como&una&tabla&añadiendo&propiedades&nuevas.& & Estas&son&las&propiedades&comunes&de&los&objetos:& & object.alpha& Opacidad&del&objeto.&Con&valor&0&el&objeto&es& transparente&y&con&valor&1&es&opaco.&Por&defecto&valor&1.& object.height& Altura&del&objeto&(coordenadas&locales)& object.isVisible& Controla&si&el&objeto&es&visible.&Valor&booleano&(true&es& visible,&false&no&es&visible).& object.isHitTestable& Permite&recibir&eventos&aun&cuando&el&objeto&no&es& visible.&Valor&booleano.&Por&defecto&false& object.parent& Devuelve&el&grupo&padre&del&objeto.& object.rotation&& Angulo&de&rotación&del&objeto&(grados)& object.contentBounds& Tabla&que&contiene&las&propiedades&xMin,&xMax,&yMin,& yMax&en&coordenadas&de&pantalla.& object.contentHeight&& Altura&(coordenadas&de&pantalla)& object.contentWidth& Anchura&(coordenadas&de&pantalla)&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&69&8& object.width& Anchura&(coordenadas&locales)& object.x& Especifica&la&posición&x&(en&coordenadas&locales)&del& objeto&relativa&al&origen&del&padre.&Específicamente,& proporciona&la&posición&x&del&punto&de&referencia&del& objeto&relativa&al&padre.& object.xOrigin& Especifica&la&posición&x&de&origen&del&objeto&relativa&al& origen&del&padre.&En&coordenadas&locales.& object.xReference& Define&la&posición&x&de&referencia&con&respecto&a&la& posición&x&de&origen.&Es&relativa&a&otro&punto&del&objeto,& no&del&padre.&& Conceptualmente,&el&punto&de&referencia&es&aquel&sobre& el&que&se&suceden&las&rotaciones&y&los&cambios&de&escala.& Cambiando&este&valor&no&se&modifica&la&posición&del& objeto.&Únicamente&es&un&punto&de&referencia.& object.xScale&& Valor&del&factor&de&escalado&en&la&dirección&x.&Un&valor& 0.5&escalará&el&objeto&un&50%&en&la&dirección&x.& object.y& Especifica&la&posición&y&(en&coordenadas&locales)&del& objeto&relativa&al&origen&del&padre.&Específicamente,& proporciona&la&posición&x&del&punto&de&referencia&del& objeto&relativa&al&padre.& object.yOrigin& Especifica&la&posición&y&de&origen&del&objeto&relativa&al& origen&del&padre.&En&coordenadas&locales.& object.yReference& Define&la&posición&y&de&referencia&con&respecto&a&la& posición&y&de&origen.&Es&relativa&a&otro&punto&del&objeto,& no&del&padre.&& Conceptualmente,&el&punto&de&referencia&es&aquel&sobre& el&que&se&suceden&las&rotaciones&y&los&cambios&de&escala.& Cambiando&este&valor&no&se&modifica&la&posición&del& objeto.&Únicamente&es&un&punto&de&referencia.& object.yScale&& Valor&del&factor&de&escalado&en&la&dirección&y.&Un&valor& 0.5&escalará&el&objeto&un&50%&en&la&dirección&y.& & Estas&son&los&métodos&comunes&de&los&objetos:& & object:rotate(deltaAngle)& Añade&el&valor&deltaAngle&(en&grados)&a&la&actual& propiedad&de&rotación.& object:scale(&x,&y&)& Multiplica&las&propiedades&de&escala&xScale&y&yScale&por& los&valores&sx&y&sy&respectivamente.& object:setReferencePoint(& referencePoint&)& Establece&la&referencia&del&objeto&en&el&punto& especificado&en&el&parámetro.&El&argumento&puede&ser:& § display.CenterReferencePoint& § display.TopLeftReferencePoint& § display.TopCenterReferencePoint& § display.TopRightReferencePoint& § display.CenterRightReferencePoint& § display.BottomRightReferencePoint& § display.BottomCenterReferencePoint& § display.BottomLeftReferencePoint& § display.CenterLeftReferencePoint& Cambiando&la&referencia&del&objeto&se&cambiarán&los& valores&de&x&e&y&sin&mover&el&objeto.& object:translate(&deltaX,& deltaY&)& Añade&los&valores&deltaX&y&deltaY&a&las&propiedades&x&e&y& del&objeto&desplazando&el&objeto&de&su&posición&actual.& object:removeSelf(&)& Borra&el&objeto&y&libera&su&memoria,&asumiendo&que&no& hay&otras&referencias&a&él.&& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&70&8& Para&objetos&de&texto,&hay&algunas&propiedades&y&métodos&específicos:& & object.size& Tamaño&del&texto& object.text& Cadena&que&contiene&el&texto&del&campo&de&texto.&Es& usado¶&actualizar&la&cadena&de&texto&del&objeto.& object:setTextColor(&r,&g,&b& [,&a]&)& Establece&el&color&de&un&objeto&de&texto.&Todos&los& valores&deben&estar&entre&0&y&255.&El&valor&a&es&opcional& y&representa&Alpha&(opacidad);&por&defecto&es&255& (opaco).& & 7.8 Gestión!de!eventos! La&manera&de&crear&aplicaciones&interactivas&en&Corona&SDK&es&mediante&la&gestión&de&& eventos.&Estos&desencadenan&acciones&que&provocan&una&respuesta&del&programa.&Por& ejemplo,&cualquier&objeto&que&se&muestre&en&la&pantalla,&puede&convertirse&en&un&botón& interactivo.&Esta&flexibilidad&es&uno&de&las&ventajas&más&importantes&que&tiene&esta& plataforma&de&desarrollo.& & Hay&eventos&globales&que&no&están&asociados&a&ningún&objeto&en&particular&y&que&son& difundidos&a&todos&los&listeners&integrados.&Se&entiende&por&listener,&aquellas&funciones& capaces&de&recibir&y&tratar&los&eventos.&Estos&eventos&globales&son:& & enterFrame!! Eventos&que&ocurren&en&el&intervalo&de&actualización&de&la&aplicación.&Este&se&ejecuta&30&o& 60&veces&por&segundo&de&acuerdo&al&valor&de&velocidad&de&actualización&de&la&pantalla& (frameArate)&establecido&en&el&fichero&config.lua.&Se&genera&en&el&objeto&Runtime:& & Runtime:addEventListener( "enterFrame", myObject ) & Las&propiedades&asociadas&a&este&evento&son:& Ø event.name&:&cadena&"enterFrame".& Ø event.time&:&tiempo&en&milisegundos&desde&el&inicio&de&la&aplicación.&& && system! Los&eventos&de&sistema&son&distribuidos¶¬ificar&a&la&aplicación&de&acciones&externas& como&la&interrupción&del&programa&por&una&llamada&entrante&al&dispositivo.&Son& generados&también&por&el&objeto&Runtime.& & Las&propiedades&asociadas&a&este&evento&son:& § event.name:&cadena&"system".& § event.type:&cadena&que&identifica&el&tipo&de&evento.&Los&posibles&valores&son:& o "applicationStart":&ocurre&cuando&la&aplicación&es&lanzada&y&se&ejecuta&el& código&de&main.lua& o "applicationExit":&ocurre&cuando&el&usuario&cierra&la&aplicación.& o "applicationSuspend":&ocurre&cuando&el&dispositivo&necesita&suspender&la& aplicación&por&entrada&de&una&llamada&o&por&inactividad.& o "applicationResume":&ocurre&cuando&una&aplicación&se&reanuda&tras&una& suspensión.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&71&8& orientation! Los&eventos&de&orientación&se&producen&cuando&se&cambia&la&orientación&del&dispositivo& en&aquellos&que&disponen&de&acelerómetro&que&permite&detectarlos.&Son&generados& también&por&el&objeto&Runtime.& & Las&propiedades&asociadas&a&este&evento&son:& Ø event.name:&cadena&"orientation".& Ø event.type:&cadena&que&representa&la&orientación&del&dispositivo:& o "portrait"& o "landscapeLeft"& o "portraitUpsideDown"& o "landscapeRight"& o "faceUp"& o "faceDown"& Ø event.delta:&Es&el&ángulo&de&diferencia&entre&el&fin&y&el&inicio&del&cambio&de& orientación.& & Hay&también&otros&eventos&globales&asociados&al&acelerómetro,&al&GPS,&a&la&brújula&y&a& niveles&bajos&de&memoria&que&dependen&también&de&si&los&dispositivos&tienen&esas& funcionalidades.& & El&resto&de&eventos&se&consideran&locales&ya&que&son&gestionados&por&un&listener&concreto.& & Cuando&el&usuario&toca&la&pantalla&con&el&dedo,&se&genera&un&evento&de&golpeo&(hitAevent)& que&se&distribuye&a&todos&los&objetos&de&la&jerarquía&de&visualización&que&intersectan&con& el&punto&de&toque&de&la&pantalla.&Este&evento&es&propagado&desde&el&objeto&que&está&más& arriba&en&la&jerarquía&hasta&el&que&está&más&abajo.& & Esa&propagación&se&puede¶r&indicándole&al&sistema&que&el&evento&está&tratado,& devolviendo&true&en&la&función&listener&(returnAtrue).&Si&el&evento&no&es&tratado&por& ninguno&de&los&objetos&transversales,&es&difundido&como&un&evento&global&al&objeto& Runtime.&& & Los&eventos&táctiles&(touchAevents)&son&otro&tipo&especial&de&los&“hitAevents”&que& desencadenan&una&secuencia&de&eventos&con&diferentes&fases.&& & Las&&propiedades&asociadas&a&estos&eventos&son:& Ø event.name:&Cadena&"touch".& Ø event.x:&posición&x&del&toque&en&las&coordenadas&de&la&pantalla.& Ø event.y:&posición&y&del&toque&en&las&coordenadas&de&la&pantalla.& Ø event.xStart:&posición&x&en&el&inicio&del&toque.& Ø event.yStart:&posición&y&en&el&inicio&del&toque.& Ø event.phase:&cadena&que&identifica&las&fases&de&la&secuencia&de&toque.&Los&valores& son:& o "began":&un&dedo&toca&la&pantalla,&inicia&el&evento.& o "moved":&un&dedo&se&mueve&por&la&pantalla.& o "ended":&un&dedo&es&levantado&de&la&pantalla,&finaliza&el&evento.& o "cancelled":&el&sistema&cancela&la&secuencia&del&evento.&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&72&8& 7.9 Animación!y!movimiento! Además&de&aplicaciones,&Corona&SDK&es&una&herramienta&muy&potente¶&el&desarrollo& de&juegos&y&una&de&sus&grandes&ventajas&es&que&cualquier&objeto&que&se&muestra&en&la& pantalla&se&puede&animar&y&dotarlo&de&movimiento.& & La&biblioteca&de&transiciones&contiene&las&funciones¶&animar&un&objeto&de& visualización&por&interpolación&de&una&o&más&propiedades&durante&un&tiempo& determinado.& & La&manera&más&simple&es&utilizar&el&método&transition.to&cuyo&primer&argumento&es&el& objeto&sobre&el&que&se&van&a&modificar&las&propiedades&y&el&segundo&es&una&tabla&con&los& parámetros&de&control.&Estos&determinan,&entre&otros,&&la&duración&de&la&animación&y&los& valores&finales&de&las&propiedades&del&objeto.&Los&valores&intermedios&de&las&propiedades& son&determinados&por&unas&funciones&de&ajuste&que&se&especifican&también&como& parámetro&de&control.&Se&pueden&ver&en&la&siguiente&tabla:& & easing.linear& Define&un&movimiento&constante&sin& aceleración.& easing.inExpo& Inicia&el&movimiento&desde&la&velocidad& cero&y,&a&continuación,&lo&acelera& conforme&se&ejecuta.& easing.inOutExpo& Inicia&el&movimiento&desde&una&velocidad& cero,&acelera&y&luego&desacelera&de&nuevo& hasta&cero&utilizando&una&ecuación&de& aceleración&exponencial.& easing.inOutQuad& Inicia&la&animación&desde&una&velocidad& cero,&se&acelera,&y&entonces&desacelera& de&nuevo&hasta&cero.& easing.inQuad& Realiza&una&interpolación&cuadrática&de& los&valores&de&la&propiedad&de&animación& en&una&transición&empezando&desde&cero.& easing.outExpo& Inicia&movimiento&rápido&y&luego& desacelera&hasta&la&velocidad&cero& conforme&se&ejecuta.& easing.outQuad& Inicia&movimiento&rápido&y&desacelera& mientras&realiza&una&interpolación& cuadrática&de&los&valores&de&la&propiedad& de&animación& & Estos&son&algunos&de&los&parámetros&que&se&pueden&definir&en&la&tabla&de&control:& Ø params.time&–&duración&de&la&transición&en&milisegundos.& Ø params.transition&–&funciones&de&ajuste&de&la&transición.&Por&defecto&es& easing.linear&& Ø params.delay&–&especifica&el&retraso&desde&el&comienzo&de&la&transición.&& Ø params.onStart&&8&es&una&función&o&listener&que&se&invoca&al&comenzar&la&transición.&& Ø params.onComplete&8&es&una&función&o&listener&que&se&invoca&al&finalizar&la& transición.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&73&8& Este&es&un&ejemplo&de&transición&de&un&objeto&en&la&dirección&vertical&durante&3&segundos& con&un&ajuste&lineal:& & circle2 = display.newCircle(65, 60, 10 ) circle2:setFillColor(255,0,255,255) transition.to(circle2, {time=3000, y=460, transition = easing.linear}) & Para&cancelar&una&transición&se&utiliza&la&función&transition.cancel(&tween&).& & Hay&otra&biblioteca&externa,&movieclip,&que&permite&crear&spritesAanimados&o&movieclips,&a& partir&de&secuencias&de&imágenes,&que&luego&se&puede&mover&por&la&pantalla&usando&las& mismas&técnicas&que&cualquier&objeto&de&visualización&de&Corona.& & Las&funciones&de&esta&biblioteca&están&disponibles¶&reproducir&estas&animaciones&de& forma&total&o&parcial,&en&dirección&hacia&adelante&o&hacia&atrás,&saltando&a&ciertos& fotogramas,&eliminando&automáticamente&la&animación&en&el&término&de&una&secuencia&e& incluso&permitiendo&que&se&pueda&arrastrar&la&animación&mediante&eventos&de&arrastrar&y& soltar.&Este&marco&ofrece&una&manera&rápida&y&ligera¶&crear&animaciones.& & La&biblioteca&no&viene&precargada&en&Corona,&por&lo&que&se&debe&cargar&el&módulo&externo& movieclip.lua&en&aquellas&aplicaciones&que&lo&precisen.& & Para&crear&un&nueva&animación,&se&resalía&con&la&función&movieclip.newAnim(AframesA)& donde&se&pasa&como&parámetros&las&distintas&imágenes&que&forman&la&animación.& & myAnim = movieclip.newAnim{ "img1.png", "img2.png", "img3.png", "img4.png" } & Esta&animación&se&puede&reproducir&hacia&adelante&con&la&función&object:play()&de&forma& cíclica&hasta&que&es&detenida&por&la&función&object:stop().&Para&reproducir&de&manera&más& particularizada,&se&pueden&establecer&los&siguientes&parámetros&& & object:play{&startFrame=a,&endFrame=b,&loop=c,&remove=shouldRemove&}& & Con&loop&se&indica&el&número&de&ciclos&de&repetición&siendo&el&valor&0¶&un&ciclo&sin&fin.& El&parámetro&remove&es&un&valor&booleano&que&si&tienen&el&valor&true,&elimina&el&objeto& cuando&la&secuencia&se&ha&completado.&El&valor&por&defecto&es&false.& Similar&a&estas&funciones,&existe&object:reverse()¶&reproducir&la&animación&en&sentido& contrario&al&definido.&Así&mismo&se&pueden&definir&parámetros&en&esta&función:& & object:reverse{&startFrame=a,&endFrame=b,&loop=c,&remove=shouldRemove&}& & Se&reproducen&los&ciclos&desde&b&(endFrame)&hasta&a&(startFrame).& & Para&acceder&a&frames&concretos&de&los&definidos&en&la&animación&se&utilizan&las&funciones&& object:nextFrame()&y&object:previousFrame().&También&es&posible&definir&un&punto&de& ruptura&en&un&frame&en&concreto&con&object:stopAtFrame(AframeA).& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&80&8& & network.request(&url,&method,&listener&[,¶ms]&)& & El&método&por&defecto&es&GET&y&las&propiedades&del&evento&respuesta&son&dos:& & Ø event.response&–&Una&cadena&que&contiene&la&respuesta&desde&el&servidor.& Ø event.isError&–&valor&booleano&que&devuelve&true&en&caso&de&error&de&red&o&false& en&caso&contrario.& & Este&es&un&ejemplo&petición&http:& & local function networkListener( event ) if ( event.isError ) then print( "Network error!") else print ( "RESPONSE: " .. event.response ) end end -- Access Google over SSL: network.request( "https://encrypted.google.com", "GET", networkListener) & En&ciertas&ocasiones&es&necesario&especificar&cabeceras&adicionales&en&la&petición.&Ambos& pueden&especificarse&en&la&tabla&de&parámetros&opcional:& Ø params.headers&–&Tabla&especificando&los&valores&de&cabecera&con&claves&de&tipo& cadena.& Ø params.body&–&Una&cadena&conteniendo&el&cuerpo&(body)&HTTP.& & headers = {} headers["Content-Type"] = "application/json" headers["Accept-Language"] = "en-US" headers.body = "This is an example request body." & Para&realizar&una&descarga,&se&utiliza&una&función&similar&a&la&anterior&salvo&que&se& descarga&la&respuesta&a&un&archivo&local&en&la&ruta&que&se&especifique,&en&lugar&de&en&la& memoria&caché.&Esto&se&recomienda¶&respuestas&de&gran&tamaño&(por&ejemplo,& documentos&XML),&y&también&puede&ser&utilizado¶&la&descarga&de&imágenes&a& distancia.&Este&es&el&formato:& & network.download(&url,&method,&listener&[,¶ms],&destFilename&[,&baseDir]&)& & El&parámetro&opcional&baseDir&puede&ser&system.DocumentsDirectory&(por&defecto)&o& system.TemporaryDirectory.& & local function networkListener( event ) if ( event.isError ) then print ( "Network error - download failed" ) else myImage = display.newImage( "helloCopy.png", system.TemporaryDirectory, 60, 40 ) myImage.alpha = 0
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&81&8& transition.to( myImage, { alpha = 1.0 } ) end print ( "RESPONSE: " .. event.response ) end network.download( "http://developer.anscamobile.com/demo/hello.png", "GET", networkListener, "helloCopy.png", system.TemporaryDirectory ) & Si&lo&que&se&desea&es&descargar&específicamente&imágenes¶&mostrarlas&en&pantalla,& existe&la&siguiente&función:& & display.loadRemoteImage(&url,&method,&listener&[,¶ms],&destFilename&[,& baseDir]&[,&x,&y]&)& & Contiene&las&coordenadas&x&e&y¶&situar&la&imagen&en&la&pantalla.&& & Las&propiedades&del&evento&respuesta&son&las&mismas&que&los&casos&anteriores&y&además& tiene&una&tercera:& & Ø event.target&–&representa&el&Nuevo&objeto&creado&después&de&que&la&imagen&es& descargada.& & Corona&SDK&permite&mostrar&contenido&web&directamente&a&través&de&los&denominados& webApopup,&que&carga&local&o&remotamente&páginas&web.& & La&función&es:& native.showWebPopup(&url&[,&options]&)&&& native.showWebPopup(&x,&y,&width,&height,&url&[,&options]&)& & y&los&parámetros&son:& Ø url&–&URL&de&la&página&web&local&o&remota.&Por&defecto,&la&URL&es&una&ruta&absoluta& a&un&servidor&remoto.&& & Ø x,&y,&width,&height&–&parámetros&de&posición&y&tamaño&de&la&ventana&del&popup.&Si& no&se&especifica&se&asume&que&ocupa&toda&la&pantalla.& & Ø Options&–&tabla&que&contiene&valores&opcionales.&options.baseUrl¶&determinar& si&la&url&es&relativa&o&absoluta,&options.hasBackground¶&indicar&si&tiene&un& fondo&opaco&o&no&y&options.urlRequest&que&designa&una&función¶&interceptar& los&eventos&generados&en&el&webApopup.& & 7.12 Gestión!de!la!memoria! Los&dispositivos&móviles&tienen&una&memoria&limitada&disponible¶&su&uso,&por&lo&que& se&debe&tener&cuidado¶&asegurarse&de&que&el&uso&total&de&la&memoria&de&su&aplicación& se&mantiene&al&mínimo&y&se&gestiona&de&forma&correcta.& & Lua&realiza&automáticamente&la&gestión&de&la&memoria.&Esto&significa&que&no&debemos& preocuparnos&ni&de&asignar&(o&reservar)&memoria¶&nuevos&objetos&ni&de&liberarla& cuando&los&objetos&dejan&de&ser&necesarios.&Lua&gestiona&la&memoria&automáticamente&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&82&8& ejecutando&un&recolector&de&basura&(garbageAcollector)&de&cuando&en&cuando¶& eliminar&todos&los&objetos&muertos&(esos&objetos&que&ya&no&son&accesibles&desde&Lua).& Todos&los&objetos&en&Lua&son&susceptibles&de&gestión&automática:&tablas,&funciones&y& cadenas.& & Sin&embargo,&hay&ciertos&puntos&que&se&deben&tener&en&cuenta&ya&que&se&debe&indicar&al& sistema&que&se&debe&considerar&como&&basura,&es&decir,&hay&que&preocuparse&por&la& gestión&lógica&de&la&memoria.&Por&ejemplo,&cualquier&valor&almacenado&en&una&variable& global&no&se&considera&basura,&aunque&la&aplicación&no&lo&vuelva&a&utilizar&de&nuevo.& & La&gestión&de&memoria&en&Corona&SDK&se&debe&aplicar&sobre&los&siguientes&cinco&aspectos:&& Ø Objetos&de&visualización& Ø Variables&globales& Ø Runtime&listeners& Ø Temporizadores&(Timers)& Ø Transiciones& & La&forma&de&monitorizar&la&utilización&de&la&memoria&en&la&aplicación&es&añadir&en&la& aplicación,&en&el&fichero&main.lua,&el&siguiente&código&que&visualiza&su&utilización& local monitorMem = function() collectgarbage() print( "MemUsage: " .. collectgarbage("count") ) local textMem = system.getInfo( "textureMemoryUsed" ) / 1000000 print( "TexMem: " .. textMem ) end Runtime:addEventListener( "enterFrame", monitorMem ) ! Objetos!de!visualización! Estos&son&los&más&fáciles&de&gestionar,&ya&que&son&directamente&responsables&de&la& creación&de&objetos&de&visualización.&La&forma&en&que&puede&evitar&las&pérdidas&de& memoria&al&mostrar&objetos&es&asegurarse&de&que&se&quitan&aquellos&que&ya&no&son& necesarios.& & Dado&un&objeto&círculo,&lo&podemos&eliminar&de&la&siguiente&manera:& & -- Creación del objeto local redBall = display.newCircle( 100, 100, 25 ) -- eliminacion del objeto redBall:removeSelf() o display.remove( redBall ) -- elminación de la referencia redBall=nil &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&83&8& La&diferencia&entre&display.remove()&y&el&método&de&objeto&removeSelf()&es&que&en&primer& caso&se&comprueba&que&el&objeto&no&ha&sido&eliminado&previamente.&Es&sólo&una&manera& más&segura&de&eliminar&los&objetos&en&Corona.& & &Las&fugas&en&este&caso&se&presentan&con&mayor&frecuencia&cuando&los&objetos&se&crean& dentro&de&un&bucle,&o&en&alguna&parte&que&es&difícil&hacer&un&seguimiento&de&cada&objeto& individual.&Se&debe&asegurar&que&los&objetos&de&visualización&son&liberados&de&la&memoria& cuando&ya&no&son&necesarios,&especialmente&al&cambiar&de&imagen&o&pantalla.& & Variables!globales! En&Corona&SDK&se&recomienda&que&se&usen&la&menor&cantidad&de&variables&globales& (aquellas&que&se&declaran&sin&usar&la&palabra&local).&En&el&momento&que&esas&variables& haya&dejado&de&ser&útiles&o&no&vaya&a&usarse&más,&se&debe&asegurar&que&se&les&asigna&el& valor&nil¶&que&el&recolector&pueda&liberar&su&memoria.& & Runtime!listeners! Cuando&se&elimina&un&objeto&de&visualización,&los&listeners¶&captar&los&eventos&que& están&asociados,&también&se&liberan&de&la&memoria.&Sin&embargo,&cuando&se&agregan&A listeners&al&objeto&Runtime&(tiempo&de&ejecución),&por&ejemplo,&el&listenerAenterFrame,& nunca&se&liberan&hasta&que&se&eliminan&manualmente.& & Una&pérdida&de&memoria&común&que&ocurre&con&los&listeners&en&el&Runtime&es&cuando&un& desarrollador&añade&en&una&pantalla&en&particular,&pero&que&se&olvida&de&quitarlo&cuando& el&usuario&sale&de&la&pantalla.&Cuando&vuelve&a&ella,&hay&dos&listeners&en&el&Runtime&que&se& ejecutan&en&uno&encima&del&otro.& & Además&de&poder&provocar&un&error&por&falta&de&memoria,&se&pueden&producir&errores&en& la&gestión&de&los&eventos&con&resultados&inesperados.& & & Temporizadores!y!transiciones!! Temporizadores&y&transiciones&son&probablemente&una&de&las&causas&más&comunes&de& errores&por&memoria.&& Un&método¶&manejar&estas&es&almacenar&todos&los&temporizadores&y&las&transiciones& en&una&tabla,&de&modo&que&cuando&se&sabe&que&han&terminado,&se&puedan&cancelar&todos& ellos&a&la&vez.& & &Si&se&agrega&el&siguiente&código&al&archivo&main.lua&(u&otro&módulo),&se&puede&hacer& fácilmente&un&seguimiento&de&los&temporizadores&/&transiciones&y&cancelarlos&todos&a&la& vez,&siempre&y&cuando&sea&necesario:& & timerStash = {} transitionStash = {} function cancelAllTimers() local k, v for k,v in pairs(timerStash) do timer.cancel( v ) v = nil; k = nil
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&84&8& end timerStash = nil timerStash = {} end -- function cancelAllTransitions() local k, v for k,v in pairs(transitionStash) do transition.cancel( v ) v = nil; k = nil end transitionStash = nil transitionStash = {} end & Y&entonces&cuando&se&crea&un&nuevo&temporizador&o&una&transición:& & timerStash.newTimer = timer.performWithDelay( ... transitionStash.newTransition = transition.to( myObject { ... & Entonces&se&puede&llamar&a&las&funciones&cancelAllTimers()&y&&cancelAllTransitions()¶& pararlos&de&una&vez.&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&85&8& 8 ANEXO I – Detalle de funciones en Corona SDK 8.1 Librerías!estándar!de!Lua! Corona&incluye&las&mismas&bibliotecas&estándar&Lua&que&son&parte&del&estándar&de&Lua.& Estas&bibliotecas&proporcionan&una&funcionalidad&útil&y&básica.&Se&agrupan&en&las& siguientes&categorías:& & Ø Biblioteca&básica& Ø Módulos&(bibliotecas&externas)& Ø Manipulación&de&cadenas& Ø Manipulación&de&tablas& Ø Funciones&matemáticas& Ø Funciones&de&entrada&y&salida& Ø Funciones&de&sistema&operativo& & &A&excepción&de&la&biblioteca&básica,&cada&biblioteca&ofrece&todas&sus&funciones&como& propiedades&de&una&tabla&o&como&los&métodos&de&sus&objetos.&Esto&crea&una&agrupación& lógica&de&funciones&y&es&la&manera&de&crear&Lua&un&espacio&de&nombres&de&conjuntos& diferentes&de&funcionalidad.& 8.1.1 BibliotecaAbásicaA La&biblioteca&básica&proporciona&algunas&funciones&del&núcleo&de&Lua.& & assert!(v![,!mensaje])! Activa&un&error&cuando&el&valor&de&su&argumento&v&es&falso&(por&ejemplo,&nil&o&false);&en& otro&caso&retorna&todos&sus&argumentos.&mensaje&es&un&mensaje&de&error;&cuando&está& ausente&se&utiliza&por&defecto&"assertion&failed!".& & error!(mensaje![,!nivel])! Termina&la&última&función&protegida&llamada,&estableciendo&mensaje&como&mensaje&de& error.&La&función&error&nunca&retorna.&& Normalmente&error&añade,&al&comienzo&del&mensaje,&cierta&información&acerca&de&la& posición&del&error.&El&argumento&nivel&especifica&cómo&obtener&la&posición&del&error.&Con& nivel&1&(por&defecto)&la&posición&del&error&es&donde&fue&invocada&la&función&error.&Nivel&2& apunta&el&error&hacia&el&lugar&en&que&fue&invocada&la&función&que&llamó&a&error;&y&así& sucesivamente.&Pasar&un&valor&0&como&nivel&evita&la&adición&de&la&información&de&la& posición&al&mensaje.& & _G! Una&variable&global&(no&una&función)&que&almacena&el&entorno&global&(o&sea,&_G._G&=&_G).& Lua&mismo&no&usa&esta&variable;&cambiar&su&valor&no&afecta&ningún&entorno,&ni&viceversa.&(& Se&usa&setfenv¶&cambiar&entornos.)& & getfenv!([f])! Retorna&el&entorno&actualmente&en&uso&por&la&función.&f&puede&ser&una&función&Lua&o&un& número&que&especifica&la&función&a&ese&nivel&de&la&pila:&nivel&1&es&la&función&que&invoca&a&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&86&8& getfenv.&Si&la&función&dada&no&es&una&función&Lua&o&si&f&es&0,&getfenv&retorna&el&entorno& global.&El&valor&por&defecto&de&f&es&1.&& & getmetatable!(objeto)! Si&objeto&no&tiene&una&metatabla&devuelve&nil.&En&otro&caso,&si&la&metatabla&del&objeto& tiene&un&campo&"__metatable"&retorna&el&valor&asociado,&o&si&no&es&así&retorna&la& metatabla&del&objeto&dado.&& & ipairs!(t)! Retorna&tres&valores:&una&función&iteradora,&la&tabla&t,&y&0,&de&tal&modo&que&la& construcción&& & &&&&&&&for&i,v&in&ipairs(t)&do&bloque&end& & iterará&sobre&los&pares&(1,t[1]),&(2,t[2]),&·∙·∙·∙,&hasta&la&primera&clave&entera&con&un&valor&nil& en&la&tabla.& & next!(tabla![,!índice])! Permite&al&programa&recorrer&todos&los&campos&de&una&tabla.&Su&primer&argumento&es&una& tabla&y&su&segundo&argumento&es&un&índice&en&esta&tabla.&next&retorna&el&siguiente&índice& de&la&tabla&y&su&valor&asociado.&Cuando&se&invoca&con&nil&como&segundo&argumento&next& retorna&un&índice&inicial&y&su&valor&asociado.&Cuando&se&invoca&con&el&último&índice&o&con& nil&en&una&tabla&vacía&next&retorna&nil.&Si&el&segundo&argumento&está&ausente&entonces&se& interpreta&como&nil.&En&particular&se&puede&usar&next(t)¶&comprobar&si&una&tabla&está& vacía.&& & El&orden&en&que&se&enumeran&los&índices&no&está&especificado,&incluso¶&índices& numéricos.&(Para&recorrer&una&tabla&en&orden&numérico&úsese&el&for&numérico&o&la&función& ipairs.)&& & El&comportamiento&de&next&es&indefinido&si&durante&el&recorrido&se&asigna&un&valor&a&un& campo&no&existente&previamente&en&la&tabla.&No&obstante&se&pueden&modificar&campos& existentes.&En&particular&se&pueden&borrar&campos&existentes.&& & pairs!(t)! Retorna&tres&valores:&la&función&next,&la&tabla&t,&y&nil,&por&lo&que&la&construcción&& & &&&&&&&for&k,v&in&pairs(t)&do&bloque&end& & iterará&sobre&todas&las&parejas&clave8valor&de&la&tabla&t.&& & Véase&next¶&las&precauciones&a&tomar&cuando&se&modifica&la&tabla&durante&las& iteraciones.&& & pcall!(f,!arg1,!·∙·∙·∙)! Invoca&la&función&f&con&los&argumentos&dados&en&modo&protegido.&Esto&significa&que& ningún&error&dentro&de&f&se&propaga;&en&su&lugar&pcall&captura&el&error&y&retorna&un&código& de&estatus.&Su&primer&resultado&es&el&código&de&estatus&(booleano),&el&cual&es&verdadero&si&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&87&8& la&llamada&tiene&éxito&sin&errores.&En&ese&caso&pcall&también&devuelve&todos&los&resultados& de&la&llamada&después&del&primer&resultado.&En&caso&de&error&pcall&retorna&false&más&un& mensaje&de&error.&& & print!(·∙·∙·∙)! Recibe&cualquier&número&de&argumentos&e&imprime&sus&valores&en&el&fichero&estándar&de& salida&(stdout),&usando&tostring&como&función¶&convertir&los&argumentos&a&strings.& print&no&está&diseñada¶&salida&formateada&sino&sólo&como&una&manera&rápida&de& mostrar&valores,&típicamente¶&la&depuración&del&código.&Para&salida&formateada&úsese& string.format.& & rawequal!(v1,!v2)! Verifica&si&v1&es&igual&a&v2,&sin&invocar&ningún&metamétodo.&Devuelve&un&booleano.&& & rawget!(tabla,!índice)! Obtiene&el&valor&real&de&tabla[índice]&sin&invocar&ningún&metamétodo.&tabla&debe&ser&una& tabla&e&índice&cualquier&valor&diferente&de&nil.&& & rawset!(tabla,!índice,!valor)! Asigna&valor&a&tabla[índice]&sin&invocar&ningún&metamétodo.&tabla&debe&ser&una&tabla,& índice&cualquier&valor&diferente&de&nil&y&valor&un&valor&cualquiera&de&Lua.&& & select!(índice,!·∙·∙·∙)! Si&índice&es&un&número&retorna&todos&los&argumentos&después&del&número&índice.&En&otro& caso&índice&debe&ser&el&string&"#",&y&select&retorna&el&número&total&de&argumentos&extra& que&recibe.&& & setfenv!(f,!tabla)! Establece&el&entorno&que&va&a&ser&usado&por&una&función.&f&puede&ser&una&función&Lua&o&un& número&que&especifica&la&función&al&nivel&de&pila:&nivel&1&es&la&función&que&invoca&a& setfenv.&setfenv&retorna&la&función&dada.&& & Como&caso&especial,&cuando&f&es&0&setfenv&cambia&el&entorno&del&proceso&que&está&en& ejecución.&En&este&caso&setfenv&no&retorna&valores.&& & setmetatable!(tabla,!metatabla)! Establece&la&metatabla&de&una&tabla&dada.&(No&se&puede&cambiar&la&metatabla&de&otros& tipos&desde&Lua,&sino&sólo&desde&C.)&Si&metatabla&es&nil&entonces&se&elimina&la&metatabla& de&la&tabla&dada.&Si&la&metatabla&original&tiene&un&campo&"__metatable"&se&activa&un&error.&& & Esta&función&retorna&tabla.&& & & & & tonumber!(e![,!base])!
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&88&8& Intenta&convertir&su&argumento&en&un&número.&Si&el&argumento&es&ya&un&número&o&un& string&convertible&a&un&número&entonces&tonumber&retorna&este&número;&en&otro&caso& devuelve&nil.&& & Un&argumento&opcional&especifica&la&base¶&interpretar&el&número.&La&base&puede&ser& cualquier&entero&entre&2&y&36,&ambos&inclusive.&En&bases&por&encima&de&10&la&letra&'A'&(en& mayúscula&o&minúscula)&representa&10,&'B'&representa&11,&y&así&sucesivamente,&con&'Z'& representando&35.&En&base&10&(por&defecto),&el&número&puede&tener&parte&decimal,&así& como&un&exponente&opcional&(véase&§2.1).&En&otras&bases&sólo&se&aceptan&enteros&sin& signo.&& & tostring!(e)! Recibe&un&argumento&de&cualquier&tipo&y&lo&convierte&en&un&string&con&un&formato& razonable.&Para&un&control&completo&de&cómo&se&convierten&los&números,&úsese& string.format.&& & Si&la&metatabla&de&e&tiene&un&campo&"__tostring"&entonces&tostring&invoca&al& correspondiente&valor&con&e&como&argumento&y&usa&el&resultado&de&la&llamada&como&su& propio&resultado.&& & type!(v)! Retorna&el&tipo&de&su&único&argumento,&codificado&como&string.&Los&posibles&resultados&de& esta&función&son&"nil"&(un&string,&no&el&valor&nil),&"number",&"string",&"boolean,&"table",& "function",&"thread"&y&"userdata".&& & unpack!(lista![,!i![,!j]])! Retorna&los&elementos&de&una&tabla&dada.&Esta&función&equivale&a&& & &&return&lista[i],&lista[i+1],&·∙·∙·∙,&lista[j]& & excepto&que&este&código&puede&ser&escrito&sólo¶&un&número&fijo&de&elementos.&Por& defecto&i&es&1&y&j&es&la&longitud&de&la&lista,&como&se&define&a&través&del&operador&longitud&.& 8.1.2 MódulosA(bibliotecasAexternas)A Corona&admite&la&funcionalidad&de&módulos&de&Lua¶&crear&y&cargar&bibliotecas& externas.& En&la&actualidad,&el&SDK&incluye&varias&bibliotecas&externas&como&"ui.lua"&(para&la&creación& de&los&botones&con&rollover)&y&"sprite.lua"&(para&crear&sprites&animados,&o&"clips&de& película").& & Estas&librerías&se&pueden&encontrar&en&los&proyectos&de&muestra&"Button"&y&"clip&de& película",&ubicado&en&el&directorio&del&código&de&ejemplo&del&SDK.&& & & & Crear!bibliotecas!externas!
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&89&8& Se&pueden&crear&módulos&externos&de&Lua,&lo&cual&es&útil¶&la&organización&de&grandes& proyectos&en&varios&archivos,&o&la&creación&de&bibliotecas&reutilizables&de&código¶& futuros&proyectos.& & La&forma&más&fácil&de&crear&un&módulo&es&utilizar&el&siguiente&formato&y&guardarlo&en&un& fichero&con&extensión&.lua&en&el&mismo&directorio&que&el&archivo&del&proyecto&main.lua:& & module(..., package.seeall) -- Declare the functions you want in your module function hello() print ("Hello, module") end & Cargar!bibliotecas!externas! Para&cargar&un&módulo&de&directorio&de&su&proyecto,&se&usa&require(NombreModulo)&al& comienzo&del&archivo&main.lua.&Las&funciones&en&el&módulo,&estarán&disponibles&con&el& formato&NombreModulo.nombreFuncion&().& & -- Carga biblioteca local testlib = require("testlib") -- llamada a función hello(). testlib.hello() -- la misma function en el cache same function local hello = testlib.hello() -- invocaciones futuras a la función son más rápidas hello() & 8.1.3 ManipulaciónAdeAcadenasA Esta&biblioteca&proporciona&funciones&genéricas&de&manejo&de&strings,&tales&como& encontrar&y&extraer&substrings&y&detectar&patrones.&Cuando&se&indexa&un&string&en&Lua&el& primer&carácter&está&en&la&posición&1&(no&en&0&como&en&C).&Se&permite&el&uso&de&índices& negativos&que&se&interpretan&como&indexado&hacia&atrás,&desde&el&final&del&string.&Por& tanto&el&último&carácter&del&string&está&en&la&posición&81,&y&así&sucesivamente.&& & La&biblioteca&de&strings&proporciona&todas&sus&funciones&en&la&tabla&string.&También& establece&una&metatabla¶&string&donde&el&campo&__index&apunta&a&la&misma& metatabla.&Por&tanto,&se&pueden&usar&las&funciones&de&manejo&de&string&en&un&estilo& orientado&a&objetos.&Por&ejemplo,&string.byte(s,&i)&puede&ponerse&s:byte(i).&& & string.byte!(s![,!i![,!j]])! Devuelve&los&códigos&numéricos&internos&de&los&caracteres&s[i],&s[i+1],&·∙·∙·∙,&s[j].&El&valor&por& defecto&de&i&es&1;&el&valor&por&defecto&de&j&es&i.&& & Téngase&en&cuenta&que&los&códigos&numéricos&no&son&necesariamente&portables&de&unas& plataformas&a&otras.&& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&96&8& & math.acos!(x)! Devuelve&el&arco&coseno&de&x&(en&radianes).&& & math.asin!(x)! Devuelve&el&arco&seno&de&x&(en&radianes).&& & math.atan!(x)! Devuelve&el&arco&tangente&de&x&(en&radianes).&& & math.atan2!(y,!x)! Devuelve&el&arco&tangente&de&y/x&(en&radianes),&pero&usa&los&signos&de&ambos&argumentos& para&determinar&el&cuadrante&del&resultado.&(También&maneja&correctamente&el&caso&en& que&x&es&cero.)&& & math.ceil!(x)! Devuelve&el&menor&entero&mayor&o&igual&que&x.&& & math.cos!(x)! Devuelve&el&coseno&de&x&(se&asume&que&está&en&radianes).&& & math.cosh!(x)! Devuelve&el&coseno&hiperbólico&de&x.&& & math.deg!(x)! Devuelve&en&grados&sexagesimales&el&valor&de&x&(dado&en&radianes).&& & math.exp!(x)! Devuelve&el&valor&de&ex.&& & math.floor!(x)! Devuelve&el&mayor&entero&menor&o&igual&que&x.&& & math.fmod!(x,!y)! Devuelve&el&resto&de&la&división&de&x&por&y.&& & math.frexp!(x)! Devuelve&m&y&e&tales&que&x&=&m&2e,&e&es&un&entero&y&el&valor&absoluto&de&m&está&en&el& intervalo&[0.5,&1)&(o&cero&cuando&x&es&cero).&& & math.huge! El&valor&HUGE_VAL,&un&valor&más&grande&o&igual&que&otro&valor&numérico&cualquiera.&& & math.ldexp!(m,!e)! Devuelve&m&2&e&(e&debe&ser&un&entero).&& & math.log!(x)! Devuelve&el&logaritmo&natural&de&x.&&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&97&8& & math.log10!(x)! Devuelve&el&logaritmo&decimal&(base&10)&de&x.&& & math.max!(x,!·∙·∙·∙)! Devuelve&el&mayor&valor&de&entre&sus&argumentos.&& & math.min!(x,!·∙·∙·∙)! Devuelve&el&menor&valor&de&entre&sus&argumentos.&& & math.modf!(x)! Devuelve&dos&números,&las&partes&entera&y&fraccional&de&x&.&& & math.pi! El&valor&de&pi.&& & math.pow!(x,!y)! Devuelve&xy.&(Se&puede&también&usar&la&expresión&x^y¶&calcular&este&valor.)&& & math.rad!(x)! Devuelve&en&radianes&el&valor&del&ángulo&x&(dado&en&grados&sexagesimales).&& & math.random!([m![,!n]])! Esta&función&es&un&interface&a&rand,&generador&simple&de&números&pseudo8aleatorios& proporcionado&por&el&ANSI&C.&(Sin&garantías&de&sus&propiedades&estadísticas.)&& & Cuando&se&invoca&sin&argumentos&devuelve&un&número&pseudoaleatorio&real&uniforme&en& el&rango&[0,1).&Cuando&se&invoca&con&un&número&entero&m,&math.random&devuelve&un& número&pseudoaleatorio&entero&uniforme&en&el&rango&[1,&m].&Cuando&se&invoca&con&dos& argumentos&m&y&n&enteros,&math.random&devuelve&un&número&pseudoaleatorio&entero& uniforme&en&el&rango&[m,&n].&& & math.randomseed!(x)! Establece&x&como&"semilla"¶&el&generador&de&números&pseudoaleatorios:&iguales& semillas&producen&iguales&secuencias&de&números.&& & math.sin!(x)! Devuelve&el&seno&de&x&(se&asume&que&está&en&radianes).&& & math.sinh!(x)! Devuelve&el&seno&hiperbólico&de&x.&& & math.sqrt!(x)! Devuelve&la&raiz&cuadrada&de&x.&(Se&puede&usar&también&la&expresión&x^0.5¶&calcular& este&valor.)&& & math.tan!(x)! Devuelve&la&tangente&de&x&(se&asume&que&está&en&radianes).&&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&98&8& & math.tanh!(x)! Devuelve&la&tangente&hiperbólica&de&x.&& & 8.1.6 FuncionesAdeAentradaAyAsalidaA La&biblioteca&de&entrada/salida&(I/O&de&sus&siglas&en&inglés)&proporciona&dos&estilos& diferentes&de&manejo&de&ficheros.&El&primero&de&ellos&usa&descriptores&de&fichero& implícitos;&esto&es,&existen&dos&ficheros&por&defecto,&uno&de&entrada&y&otro&de&salida,&y&las& operaciones&se&realizan&sobre&éstos.&El&segundo&estilo&usa&descriptores&de&fichero& explícitos.&& & Cuando&se&usan&descriptores&implícitos&todas&las&operaciones&soportadas&están&en&la&tabla& io.&Cuando&se&usan&descriptores&explícitos,&la&operación&io.open&devuelve&un&descriptor&de& fichero&y&todas&las&operaciones&se&proporcionan&como&métodos&asociados&al&descriptor.&& & La&tabla&io&también&proporciona&tres&descriptores&de&fichero&predefinidos&con&sus& significados&usuales&en&C:&io.stdin,&io.stdout&e&io.stderr.&La&biblioteca&de&entrada/salida& nunca&cierra&esos&ficheros.&& & A&no&ser&que&se&especifique,&todas&las&funciones&de&entrada/salida&devuelven&nil&en&caso& de&fallo&(más&un&mensaje&de&error&como&segundo&resultado&y&un&código&de&error& dependiente&del&sistema&como&un&tercer&resultado)&y&valores&diferentes&de&nil&si&hay&éxito.& & Manipulación!de!ficheros!implícita! & io.close!([descriptor_de_fichero])! Equivalente&a&descriptor_de_fichero:close().&Sin&argumento&cierra&el&fichero&de&salida&por& defecto.&& & io.flush!()! Equivalente&a&descriptor_de_fichero:flush&aplicado&al&fichero&de&salida&por&defecto.&& & io.input!([descriptor_de_fichero!|!nombre_de_fichero])! Cuando&se&invoca&con&un&nombre&de&fichero&entonces&lo&abre&(en&modo&texto),&y& establece&su&manejador&de&fichero&como&fichero&de&entrada&por&defecto.&Cuando&se&llama& con&un&descriptor&de&fichero&simplemente&lo&establece&como&manejador¶&el&fichero&de& entrada&por&defecto.&Cuando&se&invoca&sin&argumento&devuelve&el&fichero&por&defecto& actual.&& & En&caso&de&errores&esta&función&activa&error&en&lugar&de&devolver&un&código&de&error.&& & io.lines!([nombre_de_fichero])! Abre&el&fichero&de&nombre&dado&en&modo&lectura&y&devuelve&una&función&iteradora&que,& cada&vez&que&es&invocada,&devuelve&una&nueva&línea&del&fichero.&Por&tanto,&la&construcción&& & &&&&&&&for&linea&in&io.lines(nombre_de_fichero)&do&bloque&end& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&99&8& iterará&sobre&todas&las&líneas&del&fichero.&Cuando&la&función&iteradora&detecta&el&final&del& fichero&devuelve&nil&(para&acabar&el&bucle)&y&cierra&automáticamente&el&fichero.&& La&llamada&a&io.lines()&(sin&nombre&de&fichero)&equivale&a&io.input():lines();&esto&es,&itera& sobre&todas&las&líneas&del&fichero&por&defecto&de&entrada.&En&ese&caso&no&cierra&el&fichero& cuando&acaba&el&bucle.&& & io.open!(nombre_de_fichero![,!modo])! Esta&función&abre&un&fichero,&en&el&modo&especificado&en&el&string&mode.&Devuelve&un& descriptor&de&fichero&o,&en&caso&de&error,&nil&además&de&un&mensaje&de&error.&& & El&string&que&indica&modo&puede&ser&uno&de&los&siguientes:&& & Ø "r":&modo&lectura&(por&defecto);&& Ø "w":&modo&escritura;&& Ø "a":&modo&adición;&& Ø "r+":&modo&actualización,&todos&los&datos&preexistentes&se&mantienen;&& Ø "w+":&modo&actualización,&todos&los&datos&preexistentes&se&borran;&& Ø "a+":&modo&adición&con&actualización,&todos&los&datos&preexistentes&se&mantienen,& y&la&escritura&se&permite&sólo&al&final&del&fichero.&& El&string&que&indica&el&modo&puede&contener&también&'b'&al&final,&lo&que&es&necesario&en& algunos&sistemas¶&abrir&el&fichero&en&modo&binario.&Este&string&es&exactamente&el&que& se&usa&en&la&función&estándar&de&C&fopen.&& & io.output!([descriptor_de_fichero!|!nombre_de_fichero])! Similar&a&io.input,&pero&operando&sobre&el&fichero&por&defecto&de&salida.&& & & io.popen!(prog![,!modo])! Comienza&a&ejecutar&el&programa&prog&en&un&proceso&separado&y&retorna&un&descriptor&de& fichero&que&se&puede&usar¶&leer&datos&que&escribe&prog&(si&modo&es&"r",&el&valor&por& defecto)&o¶&escribir&datos&que&lee&prog&(si&modo&es&"w").&& & Esta&función&depende&del&sistema&operativo&y&no&está&disponible&en&todas&las&plataformas.&& & io.read!(·∙·∙·∙)! Equivalente&a&io.input():read.&& & io.tmpfile!()! Devuelve&un&descriptor&de&fichero¶&un&fichero&temporal.&Éste&se&abre&en&modo& actualización&y&se&elimina&automáticamente&cuando&acaba&el&programa.&& & io.type!(objeto)! Verifica&si&objeto&es&un&descriptor&válido&de&fichero.&Devuelve&el&string&"file"&si&objeto&es& un&descriptor&de&fichero&abierto,&"closed&file"&si&objeto&es&un&descriptor&de&fichero& cerrado,&o&nil&si&objeto&no&es&un&descriptor&de&fichero.&& & io.write!(·∙·∙·∙)! Equivalente&a&io.output():write.&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&100&8& & Manipulación!de!ficheros!explícita! fichero:close!()! Cierra&el&descriptor&de&fichero.&Téngase&en&cuenta&que&los&ficheros&son&cerrados& automáticamente&cuando&sus&descriptores&se&eliminan&en&un&ciclo&de&liberación&de& memoria,&pero&que&esto&toma&un&tiempo&impredecible&de&ejecución.&& & fichero:flush!()! Salva&cualquier&dato&escrito&en&fichero.&& & fichero:lines!()! Devuelve&una&función&iteradora&que,&cada&vez&que&es&invocada,&devuelve&una&nueva&línea& leída&del&fichero.&Por&tanto,&la&construcción&& & &&&&&&&for&linea&in&fichero:lines()&do&bloque&end& & iterará&sobre&todas&las&líneas&del&fichero.&(A&diferencia&de&io.lines,&esta&función&no&cierra&el& fichero&cuando&acaba&el&bucle.)&& & fichero:read!(·∙·∙·∙)! Lee&en&el&fichero,&de&acuerdo&el&formato&proporcionado,&el&cual&especifica&qué&leer.&Para& cada&formato,&la&función&devuelve&un&string&(o&un&número)&con&los&caracteres&leídos,&o&nil& si&no&pudo&leer&los&datos&con&el&formato&especificado.&Cuando&se&invoca&sin&formato&se&usa& uno&por&defecto&que&lee&la&próxima&línea&completa&(véase&más&abajo).&& & Los&formatos&disponibles&son&& & § "*n":&lee&un&número;&éste&es&el&único&formato&que&devuelve&un&número&en&lugar& de&un&string.&& § "*a":&lee&el&resto&del&fichero&completo,&empezando&en&la&posición&actual.&Al&final& del&fichero&devuelve&un&string&vacío.&& § "*l":&lee&la&próxima&línea&(saltándose&el&final&de&línea),&retornando&nil&al&final&del& fichero.&Éste&es&el&formato&por&defecto.&& § un&número:&lee&un&string&con&como&máximo&este&número&de&caracteres,& devolviendo&nil&si&se&llega&al&final&del&fichero.&Si&el&número&es&cero&no&lee&nada&y& devuelve&un&string&vacío,&o&nil&si&se&alcanza&el&final&del&fichero.&& & fichero:seek!([de_dónde]![,!desplazamiento])! Establece&(o&solicita)&la&posición&actual&(del&puntero&de&lectura/escritura)&en&el&fichero,& medida&desde&el&principio&del&fichero,&en&la&posición&dada&por&desplazamiento&más&la&base& especificada&por&el&string&dónde,&como&se&especifica&a&continuación:&& § "set":&sitúa&la&posición&base&en&0&(comienzo&del&fichero);&& § "cur":&sitúa&la&posición&base&en&la&actual;&& § "end":&sitúa&la&posición&base&al&final&del&fichero.&& & En&caso&de&éxito&la&función&seek&retorna&la&posición&final&(del&puntero&de&lectura/escritura)& en&el&fichero&medida&en&bytes&desde&el&principio&del&fichero.&Si&la&llamada&falla&retorna&nil,& más&un&string&describiendo&el&error.&&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&101&8& El&valor&por&defecto&de&dónde&es&"cur",&y¶&desplazamiento&es&0.&Por&tanto,&la&llamada& fichero:seek()&devuelve&la&posición&actual,&sin&cambiarla;&la&llamada&fichero:seek("set")& establece&la&posición&al&principio&del&fichero&(y&devuelve&0);&y&la&llamada& fichero:seek("end")&establece&la&posición&al&final&del&fichero&y&devuelve&su&tamaño.&& & fichero:setvbuf!(modo![,!tamaño])! Establece&un&modo&buffer¶&un&fichero&de&salida.&El&argumento&modo&puede&ser&uno&de& estos&tres:&& Ø "no":&sin&buffer;&el&resultado&de&cualquier&operación&de&salida&se&produce& inmediatamente.&& Ø "full":&con&buffer&completo;&la&operación&de&salida&se&realiza&sólo&cuando&el&buffer& está&lleno&o&cuando&se&invoca&explícitamente&la&función&flush&en&el&descriptor&del& fichero.&& Ø "line":&con&buffer&de&línea;&la&salida&se&demora&hasta&que&se&produce&una&nueva& línea&en&la&salida&o&existe&una&entrada&de&algún&fichero&especial&(como&una& terminal).&& Para&los&dos&últimos&casos,&tamaño&especifica&el&tamaño&del&buffer,&en&bytes.&El&valor&por& defecto&es&un&tamaño&adecuado.&& & fichero:write!(·∙·∙·∙)! Escribe&el&valor&de&sus&argumentos&en&el&fichero&dado&por&su&fichero.&Los&argumentos& pueden&ser&strings&o&números.&Para&escribir&otros&valores&úsese&tostring&o&string.format& antes&que&write.! 8.1.7 FuncionesAdeAsistemaAoperativoA Esta&biblioteca&está&implementada&a&través&de&la&tabla&os.&& & os.clock!()! Devuelve&una&aproximación&al&total&de&segundos&de&CPU&usados&por&el&programa.&& & os.date!([formato![,!tiempo]])! Devuelve&un&string&o&una&tabla&conteniendo&la&fecha&y&hora,&formateada&de&acuerdo&con&el& string&dado&en&formato.&& & Si&el&argumento&tiempo&está&presente&entonces&ese&tiempo&concreto&es&el&que&se& formatea&(véase&la&función&os.time¶&una&descripción&de&este&valor).&En&caso&contrario,& date&formatea&el&tiempo&actual.&& & Si&formato&comienza&con&'!'&entonces&el&tiempo&se&formatea&de&acuerdo&al&Tiempo& Universal&Coordinado.&Después&de&este&carácter&opcional,&si&formato&es&*t&entonces&date& devuelve&una&tabla&con&los&siguientes&campos:&& Ø year&(cuatro&dígitos),&& Ø month&(18812),&& Ø day&(18831),&& Ø hour&(08823),&& Ø min&(08859),&& Ø sec&(08861),&& Ø wday&(día&de&la&semana,&el&domingo&es&1),&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&102&8& Ø yday&(día&dentro&del&año),&& Ø e&isdst&(booleano,&verdadero&si&es&horario&de&verano).&& & Si&formato&no&es&*t&entonces&date&devuelve&el&tiempo&como&un&string,&formateado&de& acuerdo&con&las&mismas®las&que&la&función&strftime&de&C.&& & Cuando&se&invoca&sin&argumentos&date&devuelve&una&representación&razonable&de&la&fecha& y&la&hora&que&depende&de&la&máquina&y&del&sistema&local&(esto&es,&os.date()&equivale&a& os.date("%c")).&& & os.difftime!(t2,!t1)! Devuelve&el&número&de&segundos&desde&el&instante&t1&hasta&el&t2.&En&POSIX,&Windows&y& algunos&otros&sistemas&este&valor&es&exactamente&t28t1.&& & os.exit!([código])! Invoca&la&función&exit&de&C,&con&un&código&entero&opcional,¶&terminar&el&programa& anfitrión.&El&valor&por&defecto&de&código&es&el&valor&correspondiente&a&éxito.&& & os.remove!(nombre_de_fichero)! Elimina&el&fichero&o&directorio&dado.&Los&directorios&deben&estar&vacíos¶&poder&ser& eliminados.&Si&la&función&falla&retorna&nil,&más&un&string&describiendo&el&error.&& & & os.rename!(nombre_viejo,!nombre_nuevo)! Renombra&un&fichero&o&directorio&de&nombre_viejo&a&nombre_nuevo.&Si&la&función&falla& retorna&nil,&más&un&string&describiendo&el&error.&& & os.time!([tabla])! Devuelve&el&tiempo&actual&cuando&se&llama&sin&argumentos,&o&un&tiempo&representando&la& fecha&y&hora&especificadas&en&la&tabla&dada.&Ésta&debe&tener&los&campos&year,&month&y& day,&y&puede&tener&los&campos&hour,&min,&sec&e&isdst&(para&una&descripción&de&esos& campos,&véase&la&función&os.date).&& & El&valor&retornado&es&un&número,&cuyo&significado&depende&del&sistema.&En&POSIX,& Windows&y&algunos&otros&sistemas&este&número&cuenta&el&número&de&segundos&desde& alguna&fecha&inicial&dada&(la&"época").&En&otros&sistemas&el&significado&no&está& especificado,&y&el&número&retornado&por&time&puede&ser&usado&sólo&como&argumento&de& las&funciones&date&y&difftime.& & 8.2 Librerías!de!Corona!SDK! Corona&SDK&posee&su&propio&conjunto&de&bibliotecas&sobre&las&bibliotecas&estándar&de&Lua.& Algunas&bibliotecas&están&incorporadas&internamente,&mientras&que&otras&deben&ser& cargadas&explícitamente.& & &Las&siguientes&son&las&bibliotecas¢rales&de&Corona&y&se&cargan&automáticamente& cuando&se&inicia&la&aplicación:&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&103&8& Ø display&&8&proporciona&todas&las&rutinas¶&la&creación&de&objetos&de& visualización.& Ø transition&&8&funciones¶&la&animación&de&objetos&de&visualización,&lo&que& simplifica&el&proceso&de&creación&de&movimientos&básicos.& Ø timer&8&ofrece&funciones&básicas&de&tiempo.& Ø media&8&permite&el&acceso&a&las&capacidades&multimedia&del&dispositivo.& Ø native&8&proporciona&acceso&a&los&elementos&de&la&interfaz&nativa&de&los& dispositivos.& Ø system&8&es&un&conjunto&de&funciones&de&sistema.& & 8.2.1 BibliotecaAdisplayA La&biblioteca&display&contiene&todas&las&funciones&relacionadas&con&la&creación&de&objetos& de&visualización.& & Esta&biblioteca&está&organizada&en&3&grupos&de&funciones&que&permiten&crear&objetos&en& pantalla,&la&modificación&de&las&propiedades&de&la&pantalla&en&sí,&y&otras&funciones& funciones&de&utilidad.& & Crear!objetos!de!visualización! Todo&lo&que&se&dibuja&en&la&pantalla&es&un&DisplayObject.&Todos&tienen&propiedades&y& métodos&comunes.& & display.newGroup()! Crea&un&grupo&en&el&que&se&pueden&anadir&y&borrar&objetos&hijos.&Devuelve&un&objeto& grupo&(GroupObject)&que&lo&representa.& & display.newImage(!filename![,!baseDirectory]![,!left,!top]!)! Devuelve&un&objeto&con&la&imagen&cargada&desde&el&fichero&especificado&en&filename.& & display.newImageRect(![parentGroup,]!filename![,!baseDirectory]!width,!height!)! Devuelve&un&objeto&con&la&imagen&cargada&desde&el&fichero&especificado&en&filename& utilizando&aquella&cuya&resolución&está&de&acuerdo&a&la&escala&de&contenido&actual,& determinada&por&Corona,&que&es&la&relación&entre&la&pantalla&actual&y&las&dimensiones&de& contenido&de&la&base&se&define&en&config.lua.&En&base&a&esta&escala,&Corona&utiliza&la&tabla& imageSuffix&(también&definida&en&config.lua),&que&enumera&los&sufijos&de&la&misma&familia& de&las&imágenes,¶&encontrar&la&mejor&combinación&de&las&opciones&de&imagen& disponibles.& & display.loadRemoteImage(!url,!method,!listener![,!params],!destFilename![,!baseDir]![,! x,!y]!)! Este&método&devuelve&un&objeto&con&la&imagen&que&se&obtiene&de&forma&remota&de& acuerdo&a&los&parámetros.& & display.newCircle(!xCenter,!yCenter,!radius!)! Crea&un&círculo&con&radio&radius¢rado&en&(xCenter,&yCenter).&Devuelve&un&objeto& vector&(vectorObject)&que&lo&representa.& &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&104&8& display.newRect(!left,!top,!width,!height!)! Crea&un&rectángulo&con&las&dimensiones&especificadas&(width,&height)&con&la&esquina& superior&situada&en&las&coordenadas&(left,&top)&.&&Devuelve&un&objeto&vector&(vectorObject)& que&lo&representa.& & display.newRoundedRect(!left,!top,!width,!height,!cornerRadius!)! Es&similar&al&caso&anterior&pero&devuelve&el&rectangulo&con&las&esqueinas&redondeadas&de& acuerdo&al&valor&cornerRadius.& & display.newLine(![parent,]!x1,y1,!x2,y2!)! Dibuja&una&linea&desde&un&punto&a&otro.&Opcionalmente&se&pueden&añadir&nuevos&puntos& al&final&de&la&línea&(metodo&object:append)& & display.newText(!string,!x,!y,!font,!size!)! Crea&un&objeto&de&texto&con&la&cadena&string&con&su&esquina&superior&izquierda&en&(x,&y).& Devuelve&un&TextObject&que&lo&representa.& Se&debe&especificar&el&nombre&de&la&fuente&y&el&tamaño.& & & & & & Propiedades!de!la!pantalla! & Propiedad! Descripción! display.contentCenterX& Equivalente&a&display.contentWidth/2& display.contentCenterY& Equivalente&a&display.contentHeight/2& display.contentHeight& Altura&original&del&contenido&en&pixels.&Este&valor&por& defecto&coincide&con&la&altura&de&la&pantalla,&pero&puede& ser&otro&valor&si&se&utiliza&la&escala&de&contenido&en& config.lua.& display.contentWidth& Ancho&original&del&contenido&en&pixels.&Este&valor&por& defecto&coincide&con&el&ancho&de&la&pantalla,&pero&puede& ser&otro&valor&si&se&utiliza&la&escala&de&contenido&en& config.lua.& display.viewableContent Width& Una&propiedad&de&sólo&lectura&que&contiene&la&anchura& en&píxeles&de&la&zona&visible&de&la&pantalla,&en&el&sistema& de&coordenadas&del&contenido&original.&Esto&es&útil&ya&que& dependiendo&del&modo&de&adaptación&dinámica&de&la& escala&que&se&utiliza,&y&la&relación&de&aspecto&del& dispositivo&que&se&utiliza,&algunos&de&los&contenidos& originales&se&pueden&escalar&de&manera&que&las&porciones& queden&fuera&de&la&pantalla.& display.viewableContentH eight& Una&propiedad&de&sólo&lectura&que&contiene&la&altura&en& píxeles&de&la&zona&visible&de&la&pantalla,&en&el&sistema&de& coordenadas&del&contenido&original.& display.contentScaleX& Es&la&proporción&entre&la&anchura&del&contenido&y&de&la& pantalla&en&pixels.&Este&valor&por&defecto&es&1,&pero&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&105&8& puede&ser&otro&valor&si&se&utiliza&la&escala&de&contenido&en& config.lua.& display.contentScaleY& Es&la&proporción&entre&la&altura&del&contenido&y&de&la& pantalla&en&pixels.&Este&valor&por&defecto&es&1,&pero& puede&ser&otro&valor&si&se&utiliza&la&escala&de&contenido&en& config.lua.& display.screenOriginX& Devuelve&la&distancia&x&desde&la&izquierda&de&la&pantalla& de&referencia&a&la&izquierda&de&la&pantalla&actual,&en& unidades&de&pantalla&de&referencia.&En&los&modos& "letterbox"&o&"zoomEven"&la&escala&hace&que&se&puedan& modificar&la&superficie&visible&en&la&pantalla&del& dispositivo&actual.&Estos&métodos&permiten&averiguar&la& cantidad&de&área&visible&se&ha&añadido&o&eliminado&en&el& dispositivo&actual.& display.screenOriginY& Devuelve&la&distancia&y&desde&la&parte&superior&de&la& pantalla&de&referencia&a&la&parte&superior&de&la&pantalla& actual,&en&unidades&de&pantalla&de&referencia.&& display.statusBarHeight& Altura&de&la&barra&de&estado.& & & & Otras!funciones! ! display.save(!displayObject,!filename![,!baseDirectory]!)! Hace&que&el&objeto&de&visualización&referencia&DisplayObject&se&guarde&en&una&imagen& JPEG&y&lo&guarda&en&el&nombre&de&archivo&filename.& & display.captureScreen(!saveToAlbum!)! Captura&el&contenido&de&la&pantalla&y&lo&devuelve&como&un&objeto&de&imagen&con&origen& en&la&parte&superior&izquierda&de&la&pantalla.& & display.setStatusBar(!mode!)! cambia&la&apariencia&de&la&barra&de&esado&del&iPhone&y&iPod&Touch.&El&valor&mode&puede& ser:& § display.HiddenStatusBar& § display.DefaultStatusBar& § display.TranslucentStatusBar& § display.DarkStatusBar& 8.2.2 BibliotecaAtransitionA La&biblioteca&de&transiciones&permite&animar&un&objeto&de&visualización&por&interpolación& de&una&o&más&propiedades&durante&un&tiempo&determinado.& & transition.to(!target,!params!)! Devuelve&una&transición&que&anima&las&propiedades&de&un&objeto&de&visualización&durante& un&tiempo.&El&valor&de&las&propiedades&se&especifica&en&la&tabla&de&parámetros¶ms.& Para&personalizar&la&transición&se&pueden&especificar&las&siguientes&propiedades:&
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&112&8& Figura&8.4.&TableView&de&la&biblioteca&widget& widget.newTabBar(![options]!)!! Si&queremos&que&nuestra&aplicación&tenga&pestañas&esta&es&una&opción&muy&útil.&Nos& permite&cambiar&entre&ellas&con&solo&pulsar&el&botón&correspondiente.& & & Figura&8.5.&TabBar&de&la&biblioteca&widget& & widget.newPickerWheel(![options]!)!! Crea&un&objeto&que&puede&servirnos¶&seleccionar&una&fecha.&Deslizando&entre&sus& cifras&seleccionamos&el&dia&,&mes&y&año&que&estamos.&Puede&adaptarse¶&otros& menesteres&como&por&ejemplo&seleccionar&peso,&altura&,&edad.&Es&muy&configurable.& & & Figura&8.6.&Picker&Wheel&de&la&biblioteca&widget& & & & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&113&8& 8.2.7 BibiotecaAStoryBoardA & Es&la&nueva&librería&nativa&que&Corona&SDK&ha&implementado&recientemente.&Ha&incluido& esta&aplicación&tras&la&versión&no&oficial&de&gestión&de&escenas,&la&directorClass&que&lleva& utilizándose&prácticamente&desde&que&apareció&Corona&SDK.&A&continuación&se&explica&en& detalle&su&funcionamiento.& & Lo&primero&es&añadir&la&librería&a&nuestra&aplicación:& & local&storyboard&=&require&"storyboard"& & El&siguiente&paso&es&cargar&la&primera&escena&de&la&aplicación:& & storyboard.gotoScene(escena,efecto,tiempo)& & La&estructura&que&presenta&una&escena&es&la&siguiente:& & local&storyboard&=&require(&"storyboard"&)& local&scene&=&storyboard.newScene()& & function&scene:createScene(&event&)& & local&group&=&self.view& & & end& & function&scene:enterScene(&event&)& & local&group&=&self.vie& & & end& & function&scene:exitScene(&event&)& & local&group&=&self.view& & & end& & function&scene:destroyScene(&event&)& & local&group&=&self.view& & & end& & scene:addEventListener(&"createScene",&scene&)& scene:addEventListener(&"enterScene",&scene&)& scene:addEventListener(&"exitScene",&scene&)& scene:addEventListener(&"destroyScene",&scene&)& & return&scene& & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&114&8& Las&escenas&son&archivos&que&están&dentro&del&directorio&principal&de&la&aplicación&y&cuya& extensión&es&la&misma&que&el&archivo&main.lua.&& & Como&vemos&la&estructura&de&las&escenas&esta&definida.&En&la&función&createScene&se& introduce&lo&referido&a&la&creación&de&la&escena.&& & En&la&función&enterScene&colocamos&el&código&que&queremos&que&se&ejecute&al&entrar&en&la& escena.& & En&la&función&exitScene&es&necesario&eliminar&todos&los&objetos&creados¶&las&escena&asi& como&los&listeners.&& & Para&finalizar&la&función&detroyScene&nos&permite&ejecutar&código&cuando&la&escena&es& eliminada.&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
Curso&de&introducción&a&la&programación&de&videojuegos¶&dispositivos&móviles&en&Corona&SDK& 8&115&8& ÍNDICE'DE'FIGURAS' FIGURA&1.1&.&ESQUEMA&DEL&OBJETIVO&DEL&PROYECTO& 9! FIGURA&2.1&.&ESQUEMA&DE&REALIZACIÓN&DEL&PROYECTO&BASADO&EN&CICLO&DE&VIDA&EVOLUTIVO&11! FIGURA&2.2&.&DIAGRAMA&DE&GANTT&EN&EL&CUAL&PUEDE&VERSE&LA&PLANIFICACIÓN&DEL&PROYECTO&12! FIGURA&3.1.&OPCIONES&DE&LA&APLICACIÓN&14! FIGURA&3.2.&DIAGRAMA&DE&ACTIVIDAD&DE&LA&CARGA&DE&LA&PANTALLA&PRINCIPAL&16! FIGURA&3.3.&DIAGRAMA&DE&ACTIVIDAD&DE&LA&CARGA&DEL&CONTENIDO&DE&LA&ESCENA&TIPO&1& 17! FIGURA&3.4.&DIAGRAMA&DE&ACTIVIDAD&DE&LA&CARGA&DEL&CONTENIDO&TIPO&2& 18! FIGURA&3.5.&PANTALLA&DE&CARGA&DE&LA&APLICACION&19! FIGURA&3.6.&PANTALLA&DE&BIENVENIDA&DE&LA&APLICACION&20! FIGURA&3.7.&PANTALLA&DEL&MENU&PRINCIPAL&DE&LA&APLICACION&21! FIGURA&3.8.&PANTALLA&DE&PRESENTACIÓN&DE&DIAPOSITIVAS&22! FIGURA&3.9.&PANTALLA&DE&INTRODUCCIÓN&A&UN&CAPITULO&DE&EJEMPLOS&23! FIGURA&3.10.&PANTALLA&DE&VISUALIZACIÓN&DE&UN&CAPITULO&DE&EJEMPLOS&24! FIGURA&3.11.&PANTALLA&CON&LA&BARRA&DE&CONTENIDO&26! FIGURA&3.12.&PANTALLA&DE&CONFIGURACIÓN&DE&LA&APLICACION&26! FIGURA&3.13.&PANTALLA&DE&REINICIO&DE&APLICACIÓN.& 27! FIGURA&3.14.&PANTALLA&DE&INICIO&DEL&JUEGO&BUBBLE&BALL&27! FIGURA&3.15.&PANTALLA&DEL&JUEGO&SPACE&SHOOTER&28! FIGURA&3.16&ESTRUCTURA&DE&ESCENAS&DE&LA&APLICACION&29! FIGURA&3.17.&ESTRUCTURA&DE&DIRECTORIOS&DEL&PROYECTO&EN&CORONA&SDK&30! FIGURA&3.18&PANTALLA&DE&ACCESO&A&LA&ULTIMA&POSICIÓN&GUARDADA.& 31! FIGURA&3.19.&PRIMER&PASO&PARA&CREACIÓN&DE&TITULO&40! FIGURA&3.20.&SEGUNDO&PASO&PARA&CREACIÓN&DE&TITULO&40! FIGURA&3.21.&ASPECTO&DEL&TITULO&DEFINITIVO&41! FIGURA&3.22.&DISPOSITIVO&MÓVIL&IPAD&41! FIGURA&3.23.&CONSTRUCCIÓN&APLICACIÓN&EN&IOS&45! FIGURA&3.1.&EVOLUCION&DE&LA&UTILIZACIÓN&DE&S.O.&MÓVILES.& 49! FIGURA&4.1.&ORIGEN&DE&COORDENADAS&EN&LAS&PANTALLAS&DE&LOS&DISPOSITIVOS&68! FIGURA&8.1.&BOTON&DE&LA&BIBLIOTECA&WIDGET&110! FIGURA&8.2.&SLIDER&DE&LA&BIBLIOTECA&WIDGET&110! FIGURA&8.3.&SCROLLVIEW&DE&LA&BIBLIOTECA&WIDGET&111! FIGURA&8.4.&TABLEVIEW&DE&LA&BIBLIOTECA&WIDGET&112! FIGURA&8.5.&TABBAR&DE&LA&BIBLIOTECA&WIDGET&112! FIGURA&8.6.&PICKER&WHEEL&DE&LA&BIBLIOTECA&WIDGET&112! &