19 años en Internet

24 noviembre 2012

Programando en Android: Tu propia calculadora con App Inventor

Recientemente descubrí el App Inventor, una aplicación web elaborada por el Instituto Tecnológico de Massachusetts (el famoso M.I.T.) que permite crear, en un par de pasos, aplicaciones para el sistema operativo Android.

¿Cómo funciona App Inventor?
  • Por un lado accedes a su página web haciendo uso de una cuenta válida de Google. En esa página web puedes crear (o gestionar) tus proyectos, además de editar su interfaz gráfica. Todas las aplicaciones que creas se compilan en el servidor, de forma que no tienes que instalar ningún software en tu ordenador. Básicamente esta web te monta una apk lista para instalar en tu dispositivo Android.
  • Por otro lado, esta web te facilita la descarga de una aplicación Java, necesaria para editar la parte lógica de la aplicación. Toda la programación realizada es visual y se realiza rellenando piezas de puzzle.
Bien es cierto que, pese a ser muy sencillo de manejar, esta herramienta requiere ciertas nociones básicas de programación, pero eso sí, muy básicas. Eso sí, cabe destacar que esta aplicación web permite hacer aplicaciones simples y no grandes proyectos. Y es que pese a permitirte poder hacer uso de componentes de geolocalización, detección de los sensores o incluso de la cámara de fotos, hay que destacar que tanto el editor gráfico como el diseño de las funcionalidades son muy limitadas, además de que se da el limitante de que las aplicaciones finales no pueden pesar más de 5MB para poder ser compilables.

De todas formas, para mostraros las capacidades de esta web, os voy a demostrar cómo se puede emplear para realizar una calculadora.

1. Creando el proyecto.

Entramos en appinventor.mit.edu (página web del proyecto) y pulsamos sobre invent. Una vez ingresemos con nuestra cuenta de Google, pulsamos el botón New e insertamos un nombre para nuestro proyecto.


Y así luce la pantalla de edición de proyectos. En el centro tendremos la pantalla principal de nuestra aplicación Android. A la izquierda tenemos todos los componentes que podemos utilizar. Por último, a la derecha tenemos dos columnas: Una lista con todos los componentes que hemos añadido y las propiedades editables del componente seleccionado.


Para añadir un componente basta con seleccionarlo en la lista de la izquierda y arrastrarlo con el ratón hasta el lugar que nos interese. Para este ejemplo vamos a empezar añadiendo dos componentes: Una etiqueta (label) y una tabla (TableArrangement).


La etiqueta la usaremos como la pantalla digital de nuestra calculadora. Es decir, siempre que pulsemos una cifra, este "label" se irá actualizando. Además nos mostrará el resultado de la operación cada vez que pulsemos la tecla "=" o que concatenemos con otras operaciones.

Por ello, seleccionaremos el componente y editaremos la propiedad "text" para que su valor inicial sea "0". Además seleccionaremos el valor "Fill parent" dentro del campo "width". De esta forma este "label" ocupara toda la anchura de la pantalla.


Por su parte, el TableArrangement lo emplearemos para contener todos los botones de la calculadora. Para poder realizar tal acción, definiremos 4 columnas (propiedad "columns") y 4 filas (propiedad "rows").


A continuación llenaremos cada celda de la tabla con un botón nuevo.


El tamaño del texto de los botones no nos permite rellenar correctamente la tabla. Será necesario cambiar su texto (propiedad "text") para poder rellenar la última columna.


Por último, añadidmos un botón más debajo de la tabla, cambiándole la propiedad "text" por "=" y asignándole "fill parent" en el campo "width". Con ello ya tendremos la interfaz gráfica básica de una calculadora.


Antes de pasar a la parte lógica de la aplicación, seleccionaremos todos los campos y haremos uso del botón "rename" para asignarles un nombre más acorde con su funcionalidad. Esto nos permitirá programar de forma más cómoda.


Para editar la parte lógica debemos hacer clic en el botón "Open the Blocks Editor".


Este botón básicamente nos hace descargar una aplicación Java, por lo que es muy probable que tu navegador web te avise de ello:


Si tienes instalado Java 6 (o superior), no deberías de tener ningún problema para poder ejecutar la aplicación. Seguramente podrás arrancarla con hacer doble clic sobre ella. La aplicación te dará un error, debido a que nos hemos saltado el paso de configuración de drivers o la instalación del emulador de terminales Android. De todas formas no te preocupes, ese paso no es realmente necesario para poder montar tu aplicación.

Y esta es la interfaz gráfica del editor de bloques. Arriba tienes una barra con las opciones de la aplicación. A la izquierda una barra con las listas de acciones y de componentes y por último en la esquina abajo-derecha tienes una papelera para borrar piezas.


Si haces clic en "My Blocks" verás que salen listados todos los componentes que hemos añadido en la web del proyecto. Esta lista se genera de forma dinámica, si añades nuevos componentes o los borras en la web, aquí se irán actualizando:


Para demostrar su funcionamiento básico, en Button0 arrastraremos al panel principal la pieza "When Butto0.Click". Acto seguido seleccionaremos el componente LabelResultado (o como hayas llamado al "label") y le pegaremos la pieza "Set LabelResultado.Text to".


Nos interesa que cada vez que pulsemos un cero, este se añada a la pantalla digital de nuestra calculadora. Así que iremos a la pestaña "Built-in" y haciendo uso del componente Text iremos añadiendo las piezas "Join" y "Text".




Básicamente, acabamos de crear una función que significa lo siguiente: "Cuando pulsemos el botón 0, se añadirá 0 al final del texto". Si hiciéramos lo mismo para todos los botones numéricos (no lo hagáis), nos quedaría algo así:


No obstante siguiendo este funcionamiento habría que pensar que siempre que haya un 0 en pantalla, siempre que pulsemos un dígito acabaremos teniendo ese dichoso 0 a la izquierda, algo que no pasa con las calculadoras. Si nos fijamos, cuando en la pantalla digital aparece cero y pulsas otro dígito, la pantalla pasa a tener únicamente ese nuevo dígito.


Si tuviéramos que tener en cuenta eso una vez hubiéramos creado todas las acciones de botones, gastaríamos un tiempo tonto en actualizarlos uno a uno:


Así que lo más simple es hacer un proceso (bautizado como "addNumber"), que reciba como parámetro el número del botón. Este proceso analizará si ya existe un cero, para saber si machaca el valor de la pantalla digital o lo concatena a la derecha:


Esto ya parece más "actualizable" y mantenible:


Ahora pensemos detenidamente en el funcionamiento de una calculadora. Cada vez que pulsas un botón "+" o cualquier otra operación, se reinicia la pantalla para poder escribir un nuevo parámetro. Por lo tanto, nos hace falta saber dos cosas que habrá que recordar una vez hagamos la tecla "igual":

  1. Cuál es el número anterior al que hay en la pantalla para poder operar.
  2. Qué operación hay que realizar.
De esta forma, haciendo uso de la pestaña "Built-in", crearemos dos nuevas variables:


Ahora, haciendo uso de estas variables y de cómo realizar un proceso (visto antes sobre los botones numéricos), pensemos en el funcionamiento de una operación:
  • Necesitamos saber el número que hay en la pantalla.
  • Necesitamos saber la operación a realizar.
  • Por ejemplo, si es una suma, sumaremos el texto de la pantalla con la variable "LastResult" (el número que había antes de pulsar +).
  • Una vez sumado, actualizamos la pantalla con el resultado:

Y así quedaría una vez añadamos la resta, el producto y la división:


Y así quedarían los botones de operaciones:


Ahora tengamos en cuenta otra cosa. Cuando obtenemos un resultado, este se imprime en pantalla. No obstante, ese valor no se conversa cuando volvamos a pulsar un botón numérico. Es decir, si en pantalla me aparece como resultado el número 128 y quiero hacer ahora otra operación... pues si por ejemplo pulso la tecla "2" quiero ver en pantalla sólo un "2" y no un "1282". Así que nos hace falta almacenar una nueva variable, una que nos permita saber cuando se debe reinicia la pantalla cuando pulsemos un dígito:


Básicamente, cada botón numérico haría uso de este comportamiento:


Y habría que ponerlo del proceso "addNumber":


Por su parte, habría que hacer un "ClearScreen = true" al final  de la función de cálculo de operaciones:



Ahora vayamos con las teclas especiales: el botón "coma" para añadir decimales y el botón "C" para resetear la pantalla. En este caso, para hacer uso de decimales tendremos que añadir un punto "." al "label" de resultados. No obstante hay que tener en cuenta una cosa: Cuando añadas un "." para decimales, debes verificar que no exista ya más de uno en dicho label:


Por su parte, el botón "C" deber realizar un reinicio de todas las variables y actualizar el label de resultados con valor "0":



Con ello ya disponemos de una aplicación plénamente funcional. Guardaremos los cambios haciendo uso de "Save" (necesario para sincronizar los datos con el servidor). Una vez sincronizado, el botón pasará a llamarse "Saved" y será deshabilitado por la aplicación:


Una vez realizado el guardado, en la web del proyecto seleccionaremos el desplegable "Package for Phone" y seleccionaremos "Download to this Computer":


Esto hará que el servidor pase a compilar nuestra aplicación y como resultado, tras casi un minuto de cálculos, nos suministrará un archivo "apk" a ejecutar en nuestro dispositivo móvil. Para poder habilitar la instalación de software casero en tu dispositivo Android, deberás de ir a "Ajustes> Aplicaciones" y activar la opción de "Orígnenes desconocidos".



Puedes suministrar el fichero "apk" vía conexión USB o a través de alguna memoria externa. Sea como fuere, necesitarás disponer de algún navegador de archivos para poder localizar el instalable.


Seleccionándolo se te abrirá un sencillo menú de instalación:


Ahora mismo disponemos de una calculadora plénamente funcional:


Aún así hay que reconocer que nos ha quedado bastante fea, pero esto se puede corregir con dos sencillos puntos:

  1. Cambiar los colores de los componentes.
  2. Cambiar el tamaño de estos dependiendo del de la pantalla del dispositivo.
El primer paso no es muy complicado de hacer:


Para la parte del redimensionado, necesitaremos almacenar varias variables: La anchura de los botones, la altura de estos y el número de píxeles a dejar entre cada botón:



También nos resultaría útil conocer el número de columnas y de filas que va a tener nuestra pantalla. Sí, he dicho pantalla, no tabla. Si tenemos en cuenta el label de operaciones y el botón de resultado, estamos hablando de que tenemos 6 filas:


Este proceso podría sernos útil para cambiar la anchura de un botón:



No obstante podemos renombrar la función y hacer que no sólo cambie la anchura de un botón, si no también su altura:


Ahora pensemos en una serie de puntos:

  1. La anchura de todos los botones debe de ser "anchura total de la pantalla" dividido por el número de columnas que hemos definido.
  2. La altura de todos los botones debe de ser "altura total de la pantalla" dividido por el número de filas que hemos definido.
  3. Esta redimensión de componentes sólo debe de aplicarse cuando la aplicación arranque, así que realizaremos todos los cálculos sobre el componente "Screen1", haciendo uso de su función "When Screen1.Initialize".
  4. El único botón que no se verá afectado es el botón "igual".

El resultado sería el siguiente:



También sería interesante que el label de resultados tuviera la misma altura que los botones:



También nos interesa que el texto del label no se quede pequeño. Crearemos una variable global llamada "FontSize" y le aplicaremos un valor por defecto. Dentro de la función "When Screen1.Initialize" recalcularemos su valor, siendo 2/3 la altura de un botón. Al final de la función actualizaremos el tamaño de la fuente del label con el valor de dicha variable.






El resultado final de nuestro esquema sería el siguiente:



Para finalizar quedaría bien que elaboráramos un icono para nuestra aplicación. En este caso he dibujado una calculadora:


Acuérdate de redimensionarlo a un tamaño lógico de icono. Por ejemplo, a este le he puesto una anchura de 128 píxeles:


Para subir una imagen a nuestra aplicación debemos dirigirnos a la sección "Media" y seleccionar el botón "Upload new...".


Se nos abrirá un diálogo desplegable donde seleccionaremos el archivo de nuestra computadora a subir En este caso mi imagen "icon.png".


Para asignar nuestra imagen como el icono de la aplicación, seleccionaremos el componente Screen1 y marcaremos el "icon.png" de la lista que nos sale en la propiedad "Icon".


Este icono saldrá reflejado en el menú de instalación y en la lista de aplicaciones de nuestro launcher:



Y así queda mi calculadora con su nueva interfaz:



Y por último, aquí tenemos un vídeo con el resultado final:


Actualización:

En vista de que hay gente con problemas, os dejo aquí las fuentes de mi proyecto:

12 noviembre 2012

Dragon's Dogma


Rara vez Capcom se arriesga a hacer una franquicia nueva y cuando lo hace debe de ser porque sabe que será un super ventas. Concrétamente, hace medio año Capcom se arriesgó sacando a la venta su novedoso Dragon's Dogma y parece ser que le ha salido bien la jugada, puesto que a pesar de llevar menos de un año a la venta, la multinacional japonesa ya ha anunciado oficialmente el desarrollo de Dragon's Dogma 2.


B'z - Into the free: Tema principal del juego.

Y razón no les falta, este título tiene todo lo necesario para ser un juego de éxito: RPG de estética medieval, con sistemas de misiones muy similar a Monster Hunter, un sistema de fichajes de peones (compañeros), peleas con jefes finales al más puro estilo Shadow of the colossus y unos gráficos que pese a no ser nada del otro mundo cumplen muy bien con su cometido. De hecho, si no fuera por un par de apartados críticos, sobretodo debido a su fase de diseño, estaríamos hablando del juego de rol perfecto.

¿Pero qué clase de juego es exáctamente Dragon's Dogma? Básicamente es un juego de rol como los de antaño: Haciendo uso de un modesto guión debes de ir haciendo misiones que te acabarán llevando de un punto A a un punto B y de paso salvas el mundo. El guión, para qué engañarnos, nos servirá como excusa para entrar en la piel de nuestro personaje y nos servirá principalmente para poder explorar el vasto mundo... pero poco más. Básicamente la historia principal sólo sirve para crear un inicio, un amaño de nudo y un extraño desenlace, pero en todo caso no cumple con las exigencias literarias que deberíamos de esperar. Aún así, este punto flaco de Dragon's Dogma también es su punto fuerte: Estamos ante el arte del sandbox en todo su esplendor... Ahora bien, ¿de qué te sirve tanta libertad si luego la historia acaba siendo lineal a más no poder?


Si nos fijamos, el juego lleva vendidos más de 1,12 millones de copias, de las cuales el 70% pertenecen a la versión de PS3 y el 30% restante al de Xbox 360. Este dato choca bastante, puesto que en otros títulos las cifras suelen ser bastante parejas e incluso en los Call of Duty o en los Assanssin's Creed suelen venderse más en Xbox 360. Esto en todo caso no se debe a que la gente de PS3 adore más los juegos de rol, si no que es consecuencia de un pésimo diseño del juego en si, puesto que este título aporta unas cuantas funcionalidades online que son requeridas para poder disfrutar del juego de forma completa. Y como es de esperar, a la gente que compre este título en Xbox 360 pues no le quedará otra que poseer una cuenta de Xbox Live Gold para poder hacer uso de todas sus funcionalidades online.

Es decir:
  1. La gente de PS3 puede tener gratis todas las funcionalidades online.
  2. La gente de Xbox 360 debe de tener una cuenta Xbox Live Gold si quiere usar las funciones online.

Lo gracioso de todo, es que este juego no tiene modo multijugador.


Entonces, ¿de qué sirven esas funciones online si el juego carece de modo multijugador? Bueno, el juego incluye un sistema de compra de peones. Un peón no es más que un aliado que contratas para combatir a tu lado. Puedes tener un máximo de tres aliados, uno creado por ti y otros dos contratados. Esos peones que contratas, son símplemente personajes aliados creados por otros jugadores.

Es decir, la principal función online es poder compartir tu peón con otros jugadores y a su vez poder contratar peones creados por otros usuarios. Si careces de las funciones online, pues también puedes hacer uso del mercado de compra de peones, pero sólo dispondrá una escueta lista de peones prefabricados por Capcom.

Poca broma con este sistema de "compra de aliados", puesto que supone el principal motor de este juego: La fobia de Capcom sobre su posible hackeo (alteración o uso de trampas) son las que han hecho que este juego no tenga una versión de PC y que además sólo se te permita tener un archivo "save" por juego. Habéis leído bien: Sólo podrás tener una partida por consola/usuario, en caso de que quieras volver a jugar desde el inicio tendrás que borrar todos tus progresos, personaje principal y peón inclusives. Todo esto, claro está, es otro fallo garrafal de diseño que surge a raíz de la "fobia anti piratería": Es decir, queriendo hacer un juego más seguro y a prueba de trampas, nos encontramos al final con una experiencia de juego mutilada.


El caso es que el mercado de peones (aliados) tiene bastante juego. Mientras los días pasan, tu peón puede ser contratado por otros jugadores y cuando estos le dan el finiquito vuelve con más experiencia e incluso con algún botín. Rara vez recibes un botín interesante, puesto que suele ser alguna limosna otorgada por el usuario de turno... pero lo realmente importante es que toda la experiencia que gana tu peón en otras partidas acaba repercutiéndote a ti también y por consiguiente te conviene hacer que tu peón sea una máquina de matar para ser contratado por muchos más usuarios.

Bueno, eso sería lo ideal. En la práctica, todos los usuarios son unos babosos que sólo buscan contratar a jóvenes y lindas mozas que tengan un nivel de experiencia decente para poder combatir decéntemente a la clase de enemigos con los que se enfrentan. Esto quiere decir que la capacidad asesina de tu peón es secundaria, este mercado se parece más a la prostitución babilónica, donde una dudosa armadura que enseña más que protege acaba haciendo a un peón mucho más popular que el hecho de ser un archimago de nivel 99 que mata bichos hasta cuando respira.

Quitando el tema del mercado de peones, la otra funcionalidad online del juego para por la toma de capturas de pantalla para compartirlas a través de redes sociales, como Twitter o Facebook. De hecho, todas las imágenes que veis en esta entrada son capturas de pantalla que he ido haciendo y subiendo a mi muro de Facebook. En ellas se aprecia que la calidad gráfica es bastante buena, pero resulta incomprensible que en pleno siglo XXI la "fobia legal" de Capcom nos obligue a comernos su copyright en la esquina inferior derecha de todas las capturas de pantalla que realices.


Otro punto a tener en cuenta es que Dragon's Dogma es un juego hardcore, este título es un completo consume vidas, nada que ver con los Final Fantasy actuales. Por un lado tenemos un vasto mundo por explorar en el que no existen los teletransportes. Esto quiere decir que deberás de recorrerte a pie un mapeado similar al de Oblivion o al de Skyrim, por lo que símplemente pasarás una gran parte de horas viajando, una auténtica putada sobretodo cuando no tienes claro a dónde ir para poder continuar con la historia del juego. Bueno, eso de que no hay teletransportes es una mentira a medias. Una vez avances en el juego encontrarás un mecanismo de piedras teletransportadoras, pero sólo te sirven para volver a la capital, lo cual no es muy útil, puesto que de normal sólo irás ahí cuando tengas que comprar nuevas armaduras o buscar alguna misión nueva.

También resulta "hardcore" por su completo sistema de clases: tú y tu peón podréis seleccionar una lista de tres clases básicas predefinidas (luchador, strider y mago) y conforme ganéis puntos de experiencia y compréis habilidades (por ello los puntos de experiencia) podréis desbloquear hasta un total de nueve clases, siendo algunas de ellas especializaciones de las primeras (guerrero, ranger e invocador) o mezcla de varias (asesino, caballero místico y arquero mágico). El caso es que una clase bien seleccionada puede cambiar completamente el control, la jugabilidad y la experiencia de juego, por lo que resulta muy recomendable cambiar de clase para ver cual se adapta mejor a nuestro estilo de juego.

Juan Carlos cazando elefantes.

No ataques aldeanos, se paga con la cárcel.


En definitiva, nos encontramos ante un excelente título que con un diseño distinto podría haber llegado a ser una obra maestra.