Cuando desarrollamos un juego en Cocos2d-x, tenemos que tener en cuenta que hay particularidades entre dispositivos iOS y Android.

Por defecto iOS tiene multitouch desactivado. En cambio en Android, el multitouch está habilitado.

Si queremos habilitar multitouch en iOS, sólo tenemos que habilitarlo en AppController.mm:

- application:application didFinishLaunchingWithOptions:launchOptions {
    // Override point for customization after application launch.
    // Add the view controller’s view to the window and display.
    window = initWithFrame: bounds]]; EAGLView *glView = [EAGLView viewWithFrame: [window bounds] pixelFormat: kEAGLColorFormatRGBA8
        depthFormat: GL_DEPTH_COMPONENT16_OES
        preserveBackbuffer: NO
        sharegroup: nil
        multiSampling: NO
        numberOfSamples: 0 ];
    [_glView setMultipleTouchEnabled:YES];
    // enable multi-touch here!
    return YES;
}

Por el contrario, si queremos deshabilitar el multitouch en Android, la opción más sencilla es ir a la clase Cocos2dxGLSurfaceView.java y en el método onTouchEvent comentar el case de MotionEvent.ACTION_POINTER_DOWN:

    //            case MotionEvent.ACTION_POINTER_DOWN:
    //                final int indexPointerDown = pMotionEvent.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT;
    //                final int idPointerDown = pMotionEvent.getPointerId(indexPointerDown);
    //                final float xPointerDown = pMotionEvent.getX(indexPointerDown);
    //                final float yPointerDown = pMotionEvent.getY(indexPointerDown);
    //
    //                this.queueEvent(new Runnable() {
    //                    @Override
    //                    public void run() {
    // Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionDown(idPointerDown, xPointerDown, yPointerDown);
    //                    }
    //                });
    //                break;


El proceso de creación y distribución de binarios en iOS de forma manual es lento y repetitivo. Sería fantástico poder automatizarlo y poderlo integrar con nuestro servidor de integración continua. Hoy vamos a ver cómo podemos hacer esto de forma sencilla utilizando shenzhen y deliver.

Shenzhen es una utilidad que nos permite generar IPAs desde la línea de comandos. Por otra parte, deliver nos permite distribuir aplicaciones a iTunes Connect para revisión de Apple o para distribuir internamente a nuestros testers via Testflight.

Primero de todo, vamos a instalar shenzhen (asumiendo que tenemos Ruby on Rails instalado en nuestro sistema):

sudo gem install shenzhen
Shenzhen es una herramienta que nos permite compilar nuestra aplicación y generar el correspondiente ipa desde línea de comandos. Para ello, nos posicionamos en el directorio que tiene nuestro proyecto y ejecutamos:
ipa build 
Shenzhen nos permite distribuir nuestra aplicación usando RivieraBuild, HockeyApp, Crashlytics, Deploygate, fir.im, Pgyer, Amazon S3 y TestFairy. También nos permite distribuirlo por FTP y a iTunes Connect para revisión.

Sin embargo, no nos permite subirlo a Testflight para distribución interna. Utilizaremos otra herramienta llamada deliver:
sudo gem install deliver
Nos aseguramos que tengamos xcode command line instalado:
xcode-select --install
Inicializamos deliver en nuestro proyecto:
deliver init
Este proceso descarga la utilidad, descarga la información de AppStore/iTunes Connect si la aplicación ya está distribuida.

Editamos el fichero Deliverfile con nuestro editor de texto favorito y ponemos la versión correcta.

Y ya podemos distribuir nuestra aplicación:
deliver testflight
Para hacerlo más sencillo de recordar, crearemos un fichero shell script que realice estos dos pasos en uno solo:
echo "ipa build && deliver testflight" > deploy.sh
chmod +x deploy.sh
Y ya podemos compilar y distribuir nuestra aplicación en un paso:
./deploy.sh
Aquí podemos ver más documentación de shenzhen y de deliver:

https://github.com/nomad/shenzhen

https://github.com/KrauseFx/deliver

Errores frecuentes

Si observáis el siguiente Warning al ejecutar el comando de deliver:

[Transporter Warning Output]: WARNING ITMS-90191: "Missing beta entitlement. Your app does not include the beta-reports-active entitlement. If you intend to distribute this build via TestFlight for beta testing, please re-build this app with a newly generated provisioning profile."

Es porque al generar el IPA habéis utilizado un provisioning profile de tipo Ad Hoc en vez de utilizar el de AppStore. El provisioning profile de AppStore contiene el entitlement de beta-reports-active activado.

Para ello, nos aseguramos de seleccionar el provisioning profile correcto en el Build Settings de nuestro target:


A principios de mayo publiqué una aplicación que llevaba rondando mi cabeza durante meses. Se trata de CalQ, un juego multiplataforma (iOS y Android) que reta tus habilidades matemáticas. El objetivo del juego es bastante sencillo: tienes que combinar celdas numéricas para conseguir el resultado que te indican.


Existen dos modos de juego: 
  • Modo normal: Consigue la mayor puntuación posible en 90 segundos
  • Modo time attack: A medida que vas haciendo combinaciones, vas ganando tiempo. El objetivo es aguantar el máximo tiempo que puedas
El resultado es fantástico: en tan sólo 2 meses lo han descargado 47.000 personas (de las cuales 37.000 son de Android y 10.000 de iOS). Se han jugado cerca de 350.000 partidas, con una media de 7 partidas por usuario. 

La forma de generar ingresos con la aplicación es con publicidad. Al finalizar la partida, aparece un banner intersticial que muestra un anuncio. Teniendo en cuenta que las redes de anuncios con las que he trabajado pagan 1$ por cada 1000 impresiones (aprox.), los ingresos rondan los 300-350$. 

Teniendo en cuenta que han sido varios meses de trabajo duro tanto mío como de mi compañero Eulogi Bordas, la sensación es agridulce: esperábamos obtener más ingresos con este modelo. 

Hace dos semanas desarrollamos un evolutivo (compras In-App para comprar una versión premium sin publicidad). En las dos primeras semanas, hemos obtenido unos 25$ de ingresos. 

Las conclusiones que extraigo de todo el proceso son las siguientes:
  • El modelo de ingresos con publicidad sólo funciona con aplicaciones de muchísima repercusión. En el resto de casos, es mejor combinarlo con compras In-App
  • Cometimos el error de no tener compras In-App desde el primer momento: Durante las 4 primeras semanas la actividad fue muy superior a las dos últimas. Perdimos la oportunidad inicial para generar más ingresos
  • Traduce tu aplicación: los mercados que mejor han funcionado son aquellos a los que hemos traducido la aplicación. El coste de traducción es muy inferior al beneficio obtenido
  • El trabajo de marketing es más importante que el de desarrollo. De nada sirve hacer una aplicación muy interesante si no tienes buen trabajo de marketing. Nadie conocerá tu trabajo sin alguien que lo promocione. 
  • Escucha a tus usuarios, ellos son los que juegan. El roadmap de tu producto debe ir dirigido a sus peticiones

Para poder instalar una aplicación de Windows 8 que no está publicada en Windows Store, debemos registrar el dispositivo para poder utilizarlo como dispositivo de desarrollo.


Recientemente caducó la licencia de una de las tablets Windows que utilizo. Al final encontré la forma de renovar la licencia de desarrollo. 
  • Debemos ejecutar PowerShell con privilegios de administrador. Para ello, vamos a la barra de búsqueda lateral y escribimos "PowerShell". Seleccionamos la aplicación haciendo swipe hacia abajo y clicamos en "Run as administrator" del menú contextual. 
  • Una vez abierto PowerShell ejecutamos el comando: show-WindowsDeveloperLicenseRegistration
  • Introducimos nuestro usuario y password de desarrolladores de Windows 8 
Y ya está, ya tenemos nuestro dispositivo listo para desarrollar. 

Gestionar traducciones en un proyecto grande es complicado. Generalmente cuando terminamos un proyecto que requiere que esté en varios idiomas, enviamos a traducir los ficheros de strings.xml a alguien y una vez traducidos los añadimos a nuestro proyecto.


El problema surge cuando hacemos evolutivos sobre el proyecto: en ocasiones el programador se descuida y olvida apuntarse que faltan traducciones en uno u otro idioma. Esto supone un problema cuando el proyecto es grande, puesto que comprobar qué falta en cada idioma es una ardua tarea.

Buscando soluciones por GitHub, encontré el siguiente proyecto:


Este proyecto nos permite comparar todos los ficheros de traducciones de nuestro proyecto Android y nos devuelve qué claves faltan en cada uno de ellos respecto los demás.

Ejemplo de uso:
$git clone git://github.com/4e6/android-localization-helper.git
$cd android-localization-helper
$./bin/alh.sh /path/to/android/project
Ejemplo de salida:

[filename]
 *[resource type]
  *[T] [resource name]
  *[O] [resource name]

Hello World

Me presento ante todos vosotros y os presento mi blog, un lugar dirigido a desarrolladores que pretende ofrecer tutoriales sencillos para iniciarse en ciertas tecnologías.

¿Cuál es el motivo por el cual he decidido abrir el sitio? Muchas veces me enfrento a problemas nuevos y consigo resolverlos. Dicen que el ser humano es la única especie en tropezar dos veces en la misma piedra, por lo que pasado un tiempo me olvido de cómo lo solucioné y vuelvo a perder el mismo tiempo.

Para solventarlo, explicaré paso a paso cómo resolver los problemas que me voy encontrando. Así puedo ayudar a mi yo del futuro y a otros que se encuentren con las mismas piedras.



Blogger news

Blogroll