Entradas

Unity: Generación procedural de niveles para juego de plataformas (2D)

Estoy iniciándome en el desarrollo de videojuegos, de momento 2D, en Unity; siguiendo algunos tutoriales en YouTube he creado el principio de un juego básico de plataformas. Una vez lo tenía todo listo me asaltó la duda, ¿ Diseño de niveles o niveles procedurales ? Como la segunda opción parecía mas interesante a modo de reto, he estado viendo como podría hacer esto y al final la solución ha sido bastante sencilla; obviamente habrán mejores formas de generarlos pero para hacer algo tipo Mario Bross queda bastante resultón. La solución se basa en tener un objeto (GameObject) que recorre el mapa desde un punto y va instanciando objetos. Tiene una lista de plataformas diferentes, va avanzando como máximo lo mismo que puede avanzar el jugador que son 5 espacios, y dependiendo de unos valores generados aleatoriamente dibujan suelo o añaden enemigos. Este es el script resultante. public   class   LevelCreator   :   MonoBehaviour   {    ...

Qt cross platform UI scaling ( Android / Windows / Linux )

Sé que Qt tiene otros métodos para disfrutar de una escala apropiada en cualquier plataforma, pero es bastante común el trabajar sobre un proyecto en el cual no puedes hacer uso de esos métodos y necesitas al final usar un factor común de escala para todos los elementos. Tras mucho investigar y hacer pruebas empíricas he conseguido tener un factor de escala que realmente funcione en todas las plataformas ( he probado en Android, Windows y linux ) resultando en un mismo aspecto en cualquier dispositivo sin importar de su resolución o densidad.   Aquí os cuento como hacerlo.   1.- El primer paso es obtener los dpi en los que el dispositivo está funcionando realmente   - Android - // Android tiene density baseline de 160dpi ( mdpi )  QAndroidJniObject qtActivity =  QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");  QAndroidJniObject resources = qtActivity.callObjectMetho...

Convertir una cadena que contiene un valor hexa a entero, util para convertir luego a carácter imprimible.

Si alguna vez habéis trabajado directamente con carácteres para hacer conversiones de Unicode y demás ( por ejemplo el típico caso de un parser de emoji ) os habréis dado con la puerta en las narices a la hora de convertir de String a entero y luego poder guardar este formato, tras mucho divagar conseguí la solución y os la expongo aqui. Integer.decode("0x"+cadena); // Convertir a entero. String.format("%C",Integer.decode("0x"+cadena))// Convertir al carácter correspondiente. En cuanto tenga otro rato pondré como pasar una cadena URLEncoded que contiene el valor de un carácter en hexa octal a un valor guardable como cadena para después ser usado con el snippet de arriba. Happy coding!.

Recorrer drawables obteniendo su id y su nombre, solución a "code too large"

Con el siguiente snippet de código podéis recorrer todos los recursos de la aplicación e ir uno a uno obteniendo su nombre y su identificador de recurso. Puede parecer una tontería pero es especialmente útil para por ejemplo cargar un array con los recursos que empiezan llamándose de una forma. Por ejemplo es común utilizar esto cuando se necesita un array con imaginad 800 recursos cargados en un cuerpo static. ( de otra forma obtendríais el poco conocido error de compilación "Code too large"). Field[] drawables = R.drawable.class.getFields(); R.drawable drawableResources = new R.drawable(); for (Field f : drawables) { try { if(f.getName().startsWith("ejemplo_")) { arrayRecursos.put(f.getName(),f.getInt(drawableResources)); } } catch (Exception e) { e.printStackTrace(); } } Happy coding!.

Android: Optimización de accesos en SQLite

Os regalo un snippet que os va a volver locos a todos los que desarrolléis una aplicación que tenga un acceso intenso a datos en SQL. Está sacado de un bugfix incluido en Mozilla Firefox para Android y yo he comprobado en mis carnes el sustancial aumento de rendimiento, en vuestro SQLiteOpenHelper, añadir: @Override public void onOpen(SQLiteDatabase db) { // From Honeycomb on, it's possible to run several db // commands in parallel using multiple connections. if (Build.VERSION.SDK_INT >= 11) { db.enableWriteAheadLogging(); } else { // Pre-Honeycomb, we can do some lesser optimizations. Cursor cursor = null; try { cursor = db.rawQuery("PRAGMA synchronous=NORMAL", null); } finally { if (cursor != null) cursor.close(); } cursor = null; try { cursor = db.rawQuery("PRAGMA journal_mode=PERSIST", null); } finally { if (cursor != null) cursor.close(); } } super.onOpen(db); } Según las pruebas de aumento de rendimiento de la gente de ...

SQLException: SQL logic error or missing database

Estas usando tu content provider y alegremente recibes esta excepción "SQLException: SQL logic error or missing database" por supuesto no te cuadra de donde puede venir. Pues bien, ojo que los de sqlite han escrito esa excepción con un mensaje algo extraño o quizá es muy genérica. Cuando a mi me ha ocurido es por: - Estas ejecutando una instrucción SQL con un "?" que no se está reemplazando por nada ( ejemplo un WHERE ? que no intercambia el ? por la selección ). - Se está intentando introducir NULL en una columna que es non-NULL Humor: lo cojonudo es que te diga que a lo mejor no existe la base de datos.

Android Tip: "No me funciona el Log Cat"

Voy a comentar un problema que he tenido hoy con un terminal HUAWEI U8650 el cual me ha chocado bastante, tanto el problema como la solución. El caso es que estaba yo intentando depurar el teléfono y no me aparecía el logcat en IntelliJ Idea.. y digo.. raro. Como es normal voy a la consola corriendo y pongo adb logcat. A lo que me responde: “Unable to open log device '/dev/log/main': No such file or directory” Entonces ya me interesa el problema, me digo, va a ser de traca; pues tras mucho divagar, ojo a la solución.. 1.- Marcas en el teclado de llamada: *#*#2846579#*#* 2.- Esto abrirá un menú oculto de servicio, en el vamos a: "ProjectMenu" -> "Background Setting" -> "Log Setting" 3.- Configuramos el logcat. "Log switch" para activarlo o desactivarlo. "Log level setting" para seleccionar el nivel de log. 4.- Importante, reiniciar el teléfono al terminar. Nota: Probablemente en este menú se pueda hac...

Android Tip: .git, doc and META-INF folders

Alguna vez veréis que estas carpetas están dentro de vuestros apk y alguien puede incluso que os diga que sois descuidados y habéis dejado documentación sensible dentro de vuestro apk. GOLPE DE REMO a toda esa gente.  Son propios del apk e incluyen control de versiones y documentación necesaria para el propio apk; además ant en su versión 1.8.2 y superiores ya se encarga de excluir .git por ejemplo. Os invito a que lo comprobéis viendo que es lo que hay realmente dentro de esas carpetas ;). Happy coding.

Android Tips: Unique pending intent based on extras

Seguramente a muchos os ha pasado que al crear varias notificaciones cada una con su pending intent con flag UPDATE CURRENT pues aunque los extras cambian se os reemplazan los pending intent por el último y al darle a la notificación ( da igual cual ) se ejecuta el último pending intent. Pues bien, hay un truco bien sencillo para que el intent sea único basado en los extras que transporta, al intent que vais a pasar al pending intent le ponéis lo siguiente: intentDeEjemplo.setData(Uri.parse(intentDeEjemplo.toUri(Intent.URI_INTENT_SCHEME))); De esta forma el intent será único por los extras que contiene y no se reemplazará a menos que estos sean los mismos. Happy coding.

Android Tips: Inauguramos sección. | Android column '_id' does not exist?

Programando para Android, uno descubre muchos pequeños trucos y soluciones que son dificiles de encontrar y están mal documentadas. Iré añadiendo aquí los tips que vaya viendo para mi propia búsqueda y para a quien le pueda servir. Tip 1: Android column '_id' does not exist? En Android para usar cursores como el del SimpleCursorAdapter, este necesita que la tabla tenga una columna "_id"; si no la tiene creadla, si usais otra ponedle un AS ( otra AS _id ) y aquí viene el truco: Si estais en SDK 7 y usáis una consulta compleja SQL para recuperar los datos y devolvéis las columnas con un identificador de tabla ( C._id, C.nombre por ejemplo ) necesitais obligatoriamente poner el AS en todos los campos ( C._id AS _id, C.nombre AS nombre ) o no encontrará ninguno de ellos. Tip 2: String.isEmpty(); Si pretendéis que vuestra aplicación funcione en Android 2.1 no hagáis uso de esa función, pues no existe.

Novedades en mi vida.. yuilop.

Imagen
Tras unas andanzas como PMO en Droiders y Beltia ambas empresas de mi gran amigo Julian Moreno Beltrán me incorporé hace unos meses primero como PMO y Software Architect a ratos y por fin y recientemente de forma estable como PMO.. Decir que me encuentro muy agusto y orgulloso con el nuevo puesto y con la utilidad de la que me siento y me gustaría compartir con quien me lea ( si esque alguien lo hace ) Que he salido en TechCrunch !! Enlace a la entrada de TechCrunch Próximamente vamos a salir en varios países los cuales no puedo descubrir (puedo decir que estamos en Alemania de momento) por temas contractuales pero puedo adelantar que cosas que siempre hemos pensado que no pueden ser posibles y que no podemos entender su gratuidad van a pasar a ser reales a nuestro paso.. seguid a la escucha.. LO VAIS A FLIPAR !! Enlace a la web de yuilop

Cazando mitos de baterías… Litio-ion

Desde siempre todos hemos oído eso de hacerle las 3 primeras cargas a las baterías de 8 horas o algo por el estilo; Esta leyenda urbana seguramente heredada de las baterías de níquel es totalmente incierta y de hecho poco recomendable en baterías de Iones de Litio. Las baterías Litio-ion o de iones de litio: No tienen efecto memoria, no hay que descargarlas, de hecho es una mala práctica pues dañan su vida útil; la recomendación es cargarlas antes de que bajen del 5%. Si vas a estar mucho tiempo sin utilizarlas, es recomendable almacenarlas al 40% de su capacidad, esta es la razón por la cual ahora cuando compráis un móvil os viene con algo de carga. Es inadecuado mantenerlas a carga completa durante periodos prolongados de tiempo. Se deben cargar con sus cargadores específicos para esta tecnología ( ojo con los cargadores de los mercadillos ). Una ultima recomendación es llevar cuidado con exponerlas a altas temperaturas pues...

¿ Monitor CRT Oscuro o Borroso ?

Seguro que mas de uno pensará, "pues te compras otro" o "¿quien narices sigue usando monitores CRT?". Pues hay gente que no quiere gastarse pelas y os aseguro que muchísima gente sigue utilizándo este tipo de monitores.. ¡Manos a la obra! Lo primero es apagar y desconectar el monitor. Desmontamos la carcasa trasera. Pegada a la pantalla propiamente dicha veréis una "chupetilla" de plástico, la localizáis (si no la tocáis mejor). Seguís el cable que va unido a esa "chupetilla" y llegaréis a una caja normalmente negra que es el "amplificador de línea". Pueden haber 2 o 3 potenciómetros en el lateral de él, 1 o 2 para el focus y otro para el brillo. Colocamos el monitor en una posición en la que podamos verlo y sea fácil acceder a estos potenciómetros para manipularlos, teniendo en cuenta que si la placa del monitor queda al aire y este se apoya en ella debe quedar de alguna manera aislada. ...

XSMS – Nuevo proyecto.

Buenas, hace tiempo que no escribo, lo sé; pero peor sería escribir sin tener nada que contar. Hace unas semanas me encargaron desarrollar una aplicación que pudiese conectarse a varios móviles de una marca concreta, recibiese los sms y los introdujese en una base de datos estándar ( o en XML ). Tras intentarlo a la antigua usanza utilizando comandos AT, caí en la cuenta de que los móviles de esta marca modernos no utilizan comandos AT cuando se trata de los buzones, por unos motivos que no voy a tocar aquí. El caso es que ya teniendo el código finiquitado me tocó volver a programarlo desde cero, esta vez disparando con pólvora de rey; directamente con la api de la marca concreta en cuestión, así me aseguré la conectividad con cualquier dispositivo de esa marca, pero no sólo esto, sino con un número ilimitado de los mismos. El proyecto pudo ser entregado a tiempo y ahora mismo es lo que se está utilizando para la recepción de los mensajes en el proyecto Vodafone Infinity . Ni ...

Proyectos, futuro..

… será por esto que hace días que no cago duro? Bien, sé que hace bastante que no actualizo el blog pero los últimos cambios acaecidos en la vida de un trabajador de una empresa en la que no cobras y ves como se gastan la pasta en tus narices, ha tenido la culpa. Ahora mismo persigo principalmente 2 proyectos, uno de ellos que ha pasado hace poco por un bache pero que parece que remonta el vuelo y es un sistema de hotspots wifi con publicidad con servidor RADIUS y todo.. vamos un calvario de narices. El otro que posiblemente se le coloque a la Admón. pública, no pienso dar ningún detalle hasta que no lo tenga colocado, pero daré una pista; si eres de Murcia y nos lo cogen.. seguro que lo usas alguna vez ;)

Ángeles González-Sinde

Imagen
Bien como no podría ser de otra manera, me uno a las protestas del resto de internautas y usuarios de internet en general por el cese de ésta nueva ministra de cultura que podría suponer darle aún mas la puntilla a internet en España en cuanto a censura y recorte de derechos del usuario. Artículo de Enrique Dans Facebook pidiendo que se vaya Una provocación de Zapatero contra internet ( Asoc. Internautas ) Página en Twitter pidiendo su dimisión Menciones de Sinde en la búsqueda en Twitter

El juego del impávido.

Se cuenta que en la lujuriosa Francia del siglo XVIII, algunos anfitriones obsequiaban a sus invitados con el divertido juego de “El Impávido”. Este consistía en sentar a los caballeros, desprovistos de pantalones y calzón, en torno a una gran mesa redonda con largos faldones que llegaban hasta el suelo. La esposa del anfitrión se introducía debajo de la mesa, y elegía aleatoriamente a uno de los sedentes, introduciéndose entre sus piernas, por debajo del faldón, y procediendo a practicarle una fellatio. De este modo, y sucesivamente, la dama iba probando todos y cada uno de los penes de los invitados sin ser vista desde la parte superior de la mesa. El objeto del juego, era adivinar quien estaba siendo en cada momento objeto de la succión, basándose únicamente en el rostro de los participantes, que, como el propio nombre del juego indica, habían de permanecer “impávidos” para ocultar su condición de “felados”. Cuando alguien creía descubrir que otro jugador estaba siendo objeto de...

Conclusión de la informática, nada es difícil sino tedioso

Nada es difícil, algo puede ser tedioso pero no difícil; la dificultad expresada como tal es la incapacidad de tener paciencia.

La España actual, La bella flor de la mierda.

“Plantad la semilla de la avaricia en la infértil tierra de la estupidez y obtendréis la bella flor de la mierda” ( Confucio ). Y con esa frase resumes la trayectoria social y económica de España en los últimos 10 años.

FOR DUMMIES: El microondas.

Imagen
Bien, creo que voy a ocupar varios artículos en explicar el funcionamiento de cosas comunes pues me encuentro con muchísima falta de conocimiento a diario, imagino que por dejadez y falta de interés en como funcionan las cosas. El funcionamiento del microondas es extremadamente simple aunque parezca un invento del diablo. Voy a intentar explicarlo con la mayor simplicidad. Cuando aplicamos un campo eléctrico a un alimento, las moléculas del mismo tienden a alinearse y de hecho se alinean según la polaridad. Si invertimos la polaridad una vez están así, las moléculas se darán la vuelta para alinearse en el nuevo campo eléctrico, si efectuamos una serie de cambios de polaridad con la suficiente frecuencia el movimiento constante de las molécula provocará fricción entre ellas y por lo tanto calor.   Bien, pues desde hace años se sabe que una emisión electromagnética es la conjunción de un campo eléctrico y un campo magnético. Así que si se aplica una señal electr...