@ agnasg

agnasg


Cómo migrar una aplicación Android SDL2 a SDL3

15-03-2025 4:45 PM

Finalmente me ví obligado a migrar a SDL3, porque Google Play tiene nuevas regulaciones que obligan a los desarrolladores a subir a Android 14 (API level 34) o superior (en realidad esto está activo desde el 31 de agosto de 2024).

Ese requerimiento significa que en el build.gradle de nuestro proyecto tenemos que colocar los siguientes settings:

minSdkVersion 29
targetSdkVersion 34
compileSdkVersion 34

Luego de unas cuantas peripecias e intentos de hacer que la compilación funcione con SDL2 llegué a la conclusión que no tenía más alternativa que subir a SDL3.

El problema es que los desarrolladores de SDL3 decidieron jugar a Twilight Zone, es decir, cambiarle el nombre a todas las funciones, cambiar los parámetros, y otras cosas divertidas. El proceso de conversión iba a ser toda una aventura, por eso le estuve sacando el cuerpo todo este tiempo.

A continuación la lista de cambios que tuve que hacer, otras migraciones pueden ser más complicadas:

  • Problem error: use of undeclared identifier ‘IMG_INIT_PNG’
    Ya no necesitamos hacer esto antes de cargar archivos PNG:
    int imgFlags = IMG_INIT_PNG;
    if( !( IMG_Init( imgFlags ) & imgFlags ) )
  • Problem TTF_RenderText_Solid () ahora tiene un nuevo protype:
    SDL_Surface *TTF_RenderText_Solid(TTF_Font *font, const char *text, size_t length, SDL_Color fg);
    Ahora necesita la longitud del string. Como yo estoy usando STL, puedo usar std::string::size()
  • SDL_RenderFillRect () now has a new protype:
    Ahora hay que usar SDL_FRect con floats. Mi solución fue copiar y hacer casting, así:
    SDL_FRect fRect = {(float) rect.x, (float) rect.y, (float) rect.w, (float) rect.h }; // de esta forma puedo usar el rect original, y luego cuando todo funcione, optimizo. La llamada queda así:
    SDL_RenderFillRect(sdlRenderer, &fRect);
  • Problem SDL_RenderTexture () ahora tiene un nuevo protype:
    Ahora hay que usar SDL_FRect con floats. Misma solución.
  • Problem: error: use of undeclared identifier SDL_FreeSurface (surface)
    Ahora hay que usar SDL_DestroySurface (surface)
  • Problem: error: use of undeclared identifier ‘TTF_GetError
    Hay que usar SDL_GetError()
  • Problem: error: use of undeclared identifier ‘TTF_FontHeight’
    Hay que usar TTF_GetFontHeight ()
  • Problem: nativeRunMain(): Couldn’t find function SDL_main in library /data/app/~~gvhpQEv…kE_NraQ==/lib/arm64/libmain.so
    Solution: esto no era necesario en SDL2, ahora hay que declarar función main () de la siguiente forma:
    #if ANDROID
    #include
    extern “C”
    int main(int argc, char *argv[])
  • Problem: TTF_init failed
    Probé con freetype 2.9.1 and 2.13.3 y ambos se presenta el mismo problema
    El problema fue que cambié: if (TTF_Init() < 0) { a => if (TTF_Init()) debió ser if (!TTF_Init())
  • Problem SDL_GetCurrentDisplayMode () tiene un nuevo prototype:
    const SDL_DisplayMode* displayMode = SDL_GetCurrentDisplayMode(SDL_GetPrimaryDisplay ()); Yo utilizo displayMode para obtener las dimesiones de la pantalla.

Conclusión: no era tan difícil como pensaba, realmente lo que hay que hacer es resolver un problema a la vez, como siempre. Algunos de estos problemas, como por ejemplo “nativeRunMain(): Couldn’t find function SDL_main in library ” son bien difíciles de resolver, ni Copilot ni Genesis, ni Stackoverflow tienen la solución. La conversión hay que hacerla con cuidado, porque si reimplementas algo incorrectamente el error es bien difícil de entender. Como el cambio con SDL_GetCurrentDisplayMode () lo hice mal la primera vez, el juego mostraba los sprites muy grandes, y luego muy pequeños. No fue obvio desde el comienzo por qué.

Tiempo de juego

15-10-2024 2:49 PM

En reddit alguien preguntó cuál es el juego que más has jugado, y para esa pregunta yo tengo una buena respuesta.

En wow no tengo idea cómo se busca el número de horas en la cuenta, sino que es por personaje, la imágen muestra el número de dias, horas, minutos jugados por cada uno de mis personajes principales. Eso suma algo así como 10452 horas, más otras 200 horas distribuidas en una chorrera de otros personajes. La verdad nunca había hecho esta contabilidad. Creía que era más tiempo. Estos son 16 años, desde 2008, Burning Crusade estaba candente en ese tiempo. Sin embargo, yo creo que he jugado más tiempo Rogue, el papá de todos los juegos roguelike, y todo el zoológico de juegos roguelike: Hack, Moria, Angband, Nethack, etc, pero no tengo idea cuánto tiempo puede ser.

De idiotas y farsantes

24-09-2024 2:16 PM

“Es más importante estar en lo correcto moralmente

que en los hechos”

(sic) alguien en el público

Idiotas

Se siente una especie de liberación, un alivio, cuando etiquetas a alguien de idiota, porque ya no te tienes que ocupar o preocupar por él (o ella), ya no le tienes que prestar atención y tratar de entenderlo, es un idiota, a nadie le importa. Eso se ha convertido en un hack para anular a una persona, un truco para ignorar a esa persona, lo clasificas como idiota y listo, está descartado. Pero como todo poder o habilidad tiene su sección de precauciones. Úsese con cuidado.

Gánate unos puntos eliminando MongoDB

Interesante este artículo sobre un Startup que decidió cambiar MongoDB a PostgreSQL. Hace años quise ver cuál era el revuelo sobre MongoDB y comencé a aprender cómo usarlo, he inclusive estuve viendo algunos proyectos que requerían su uso. 5 minutos después salí corriendo, como si mi vida dependiera de ello. Yo no soy muy dado a hacer algo simplemente porque está de moda, y la fascinación que había en los Startup’s con MongoDB siempre me pareció sospechosa. Era como el sushy: todo el mundo quería comer sushi, y era chic saber cuáles eran los mejores restaurantes sushi de la ciudad. Yo pasé años diciendo que eso era simplemente pescado crudo mal sazonado, y que no entendía la novedad. La gente me miraba con los ojos desorbitados. Bueno, lo mismo pasaba con MongoDB, era una blasfemia hablar mal de esa tecnología. Pues bien, aquí está un hilo en hn despotricando, e inclusive llegando a “los amigos no dejan que sus amigos usen MongoDB” (“Friends don’t let friends use MongoDB”). Imagínate cómo cambian las cosas.

Hemos confirmado que ahora somos un poquito menos ignorantes.

El pasado 22 de enero murió Arno Allan Penzias, físico y radio astrónomo, quien junto a otros confirmó la existencia de la nube de radiación cósmica de microondas, uno de los tantos pasos necesarios para entender mejor el cosmos. Lo desafortunado fue el titular del New York Time: “Muere Arno A. Penzias, 90 años; el Nobel de Física que confirmó la teoría del Big Bang”, y digo desafortunado por la supersimplificación de ese titular. Es como una vez que estaba dando una presentación de una de las herramientas de Business Intelligence, que permite hacer análisis sobre data multidimensional (cubos OLAP) y dos personas que estaban adelante comentaron entre sí, “es como un manejador de archivos”. No es un manejador de archivos, permite hacer análisis, y no son archivos, son estructuras de datos altamente optimizadas.

Otra cosa que me resulta extraña, es que en esta discusión en hacker news sobre el tema realmente nadie dice que buena parte de la comunidad científica ya no está segura sobre el Big Bang. Tanto es así, que recuerdo que vi una presentación (perdí el enlace) donde el presentador pregunta a una audiencia compuesta de astrónomos y cosmólogos, quiénes creen en la teoría del Big Bang, y solamente la mitad de la audiencia levantó la mano. Yo no se si esto es posible, y estoy seguro que me van a desmentir, pero dentro de la comunidad científica es como un tema tabú hablar sobre la posibilidad de que estemos equivocados sobre el Big Bang, porque, creo yo, si efectivamente nos equivocamos (lo cual científicamente es normal) sería un horror porque entonces tendríamos que reconocer que no sabemos cómo funciona el universo.

Algo bizarro que no signifíca nada

No se si ya había reportado que que la palabra bizarro fue aceptada por la RAE en su acepción de algo raro e inusual. En inglés esta palabra siempre ha tenido ese significado, pero en español no. Pues, otra palabra interesante que tiene un significado diferente en español que el significado en inglés es ostensible: en inglés es algo que puede ser falso o no, mientras que en español es sinónimo de notorio, visible, patente. Con esta palabra no tengo ningún problema. Tal como está me parece bien. Porque de hecho el significado en español es el correcto, en base a su raiz etimológica. En inglés, al parecer, se distorsionó, por razones que sería interesante descubrir.

Volví con los farsantes

“Tú formas parte del equipo”, “estamos buscando un aliado”, “contamos contigo”, “esperamos tenerte en nuestro equipo”. Cuando un cliente me habla con estos clichés, comienzo a sospechar. Tengo tantos años trabajando como freelancer, que ya detecto las señales rápidamente. Literalmente dejo pasar un proyecto cuando el lenguaje es demasiado dulce y cariñoso: lo que vienen después son problemas. Todo ese discurso edulcoradado significa una sola cosa: voy a trabajar mucho y ganar poco. Cuando este patrón se volvió más que obvio empecé a rechazar estos proyectos. Prefería proyectos cuyo líder fuera más imparcial, menos comprometido con su bolsillo y mejor pagador.

Entonces, los accidentes pasan. Desde la pandemia para acá, el mercado freelancer cambió, mucha gente aprendió las bondades de trabajar desde casa, remoto, en pantaloncillos y pantuflas. En realidad, la mayoría de los trabajos de oficina no requieren que estés en la oficina: el commuting (el tiempo y el esfuerzo que empleas en ir del trabajo a la oficina y viceversa) es innecesario. No hay cifras oficiales, pero hoy en día, 4 años después, todavía hay un buen porcentaje que se rehúsa a regresar a la oficina (Amazon acaba de ordenar a sus empleados a regresar 5 días de la semana en la oficina. Update 27-09-24: Dell exige lo mismo a sus cuerpo de ventas, oficina 5 dias a la semana desde el 30 de septiembre) . Esa invasión de mano de obra tomó por asalto todos los mercados freelancers: no solamente eso, el mercado ha madurado, las empresas ya saben cómo maximizar el tiempo de los freelancers, minimizar costos, cambiar de freelances como cambian de toalla sanitaria, etc. Eso, junto con la ChatGPT y el resto del zoológico IA (Inteligencia Artificial) ha hecho que los proyectos sean más retadores, diferentes, que cualquier oferta tenga más de 50 cotizaciones a los minutos de ser publicada, y conseguir que un cliente se comunique contigo a se ha reducido a 1/30 cuando antes (hace 4 años) era 1/5, es decir, de cada 5 cotizaciones que hacía, al menos me llamaba un cliente y en un 70% o 80% de los casos se convertía en negocio.

El otro frente, el de los clientes directos uno por uno ha ido desapareciendo y ahora es casi imposible reemplazarlos. Algunos freelancers han decido regresar y emplearse en trabajos de 9-5 porque han llegado a situaciones desesperadas. Todo este contexto me ha llevado a considerar clientes que en el pasado hubiera rechazado en los primeros 15 minutos: ya no puedo hacer eso, no me puedo dar el lujo de perder clientes. Pero eso ha ocasionado que comience a interactuar con los clientes a los que me refería al comienzo: “Tú formas parte del equipo”, “estamos buscando un aliado”, lo cual se traduce en que voy a tener que trabajar durísimo y la paga va a ser mala, muy mala.

Creo que es hora del famoso plan B del que todos hablan.

La IA no sabe razonar

29-08-2024 5:51 PM

We’re driving Cadillacs in our dreams

Estoy tratando de limpiar un poco la bitácora de khpx de bugs viejos a los que ya le he dedicado tiempo pero que siguen ahi, incólumes, reacios a ser eliminados.

El que comencé a trabajar hoy bien temprano es con el cursor del mouse. Cuando el juego está en windowed mode, es decir, no está en full screen, o dicho de otra forma, la ventana del juego tiene los íconos del sistema para minimizar, maximizar y cerrar la ventana, y abajo están los iconos de las aplicaciones de Windows, y movemos el cursor del mouse hasta arriba, saliendo del juego, el cursor se pierde y hay que mover el mouse hasta encontrar donde se metió. Esa implementación creo que es del 2021 (o quizás del 2020) y siempre ha tenido ese problema, a pesar de mis intentos por resolverlo. Mi primera presunción es que era un problema de resolución de pantalla pero lo descarté por alguna razón. Grave error, ya veremos por qué.

Esta mañana se me ocurrió revisar de nuevo el tema de las transformaciones de view, project y world, que son las tres transformaciones que DirectX utiliza para establecer los objetos en pantalla. Agregué inicializaciones de todas estas transformaciones a la matriz identidad para garantizar que todo estaba en su estado original. Pero nada, el problema continuaba.

Se me ocurrió entonces hablar con Gemini, el ChatGPT de Google a ver si se le ocurría alguna idea adicional. Me pasó una larga lista de posibilidades, incluyendo el tema de transformaciones. Todas ya las había revisado excepto el SCISSORs, así que lo inicialicé tambien. El código antes de hacer el DrawPrimitive de DirectX quedó así:

D3DXMATRIXA16 matProj, matView, matWorld;
D3DXMatrixIdentity(&matProj);
D3DXMatrixIdentity(&matView);
D3DXMatrixIdentity(&matWorld);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, false);

Le formulé varias otras preguntas a Geminí pero se quedó ahí sugiriendo más o menos lo mismo. Así que no tuve más remedio que hacer lo que los humanos hacemos:

Pensar

Yo creo que no pasaron 5 minutos hasta que llegué a la conclusión de que tenía que revisar otra vez el tema de la resolución de la pantalla. Si la resolución de la pantalla no concuerda con la resolución interna de la aplicación, lógicamente cuando el cursor del mouse se mueve del juego al sistema y viceversa va a haber un cambio de posición, es decir no va a coincidir el posicionamiento. Si el juego está en resolución 1200 x 800 y mi pantalla está en 1910 x 1080, si el cursor está en 600,10 y sale al sistema va a aparecer en la posición alrededor del 33% de la longitud horizontal de la pantalla, mientras que en el juego, 600 corresponde al 50% de la pantalla: ¿cómo fue que no se me ocurrió eso antes? Peor, ¿por qué Gemini no me sugirió revisar la diferencia de resoluciones entre el juego y el sistema? La IA no sabe razonar, solo repite lo que encuentra en internet.

Ahora que corregí el bug me parece que era demasiado tonto y obvio. Sin embargo, estuve horas estancado dándole vueltas. Voy a tener que pensar con más frecuencia, y dejar de usar Gemini. Me aporta mejores dividendos.