Flappy Bird para Android, escrito en C, por debajo de 100 KB
(github.com/VadimBoev)- Este proyecto busca implementar un clon de Flappy Bird para Android en C y reducir el tamaño del APK a menos de 100 KB
- Tras descubrir rawdrawandroid en 2021, su autor quiso crear un juego con un APK pequeño, y en septiembre de 2024 ver un Flappy Bird en C# en el Discord de Raylib fue el detonante para intentar una implementación en C
- La implementación empaqueta en el APK una biblioteca nativa escrita en C y combina OpenGL ES 2, shaders y Android Native Activity
- El sonido se comprime en MP3 y se reproduce con OpenSLES, mientras que para decodificar PNG se usa upng
- Soporta compilación con Visual Studio Code en Windows y con Makefile en Linux/macOS, y aclara que los derechos del juego y los recursos pertenecen a DotGEARS
Objetivo y contexto del proyecto
- Flappy Bird in C es un proyecto que busca escribir un clon de Flappy Bird en C para Android y mantener el tamaño del APK en menos de 100 KB
- El punto de partida fue rawdrawandroid, que conoció en 2021, y el objetivo era crear un juego que fuera comprensible e interesante mientras minimizaba al máximo el tamaño del APK
- Como Flappy Bird ya ha sido porteado a muchos lenguajes, se eligió de forma natural como objetivo para hacer un clon
Intentos anteriores y problemas
- En 2021 estudió Raylib y su primer intento de crear un juego en C++ usando ImGui fracasó
- En ese momento hubo varios problemas
- El APK pesaba alrededor de 1 MB
- El juego se cerraba inesperadamente
- El APK solo incluía la biblioteca armeabi-v7a
- Según los requisitos de Google de 2022, era necesario incluir también la biblioteca arm64-v8a
Qué motivó el nuevo intento en 2024
- En septiembre de 2024, después de ver un Flappy Bird en C# en el canal de Discord de Raylib, comenzó el intento de implementar Flappy Bird para Android en C y dejar el APK por debajo de 100 KB
- Aunque la meta parecía poco realista, el reto competitivo fue lo que motivó la implementación
Cómo está hecho
- Todo comenzó compilando un Hello World escrito en C y empaquetando esa biblioteca dentro de un APK
- El sonido se comprime en formato MP3 y se reproduce usando OpenSLES
- Para decodificar archivos PNG se eligió upng
- Los gráficos y la integración con Android usan en conjunto OpenGL ES 2, shaders y Android Native Activity
Cómo compilarlo
- En Windows se toma como base el entorno de Visual Studio Code
- Crear
.enva partir de.env.example - Ejecutar
build.bat
- Crear
- En Linux y macOS se puede compilar con el Makefile incluido
- Es necesario instalar Android command-line tools
- Configurar variables de entorno en el archivo
.envde la raíz del proyecto - Ejecutar
cd FlappyBirdy luegomake
- Para instrucciones más detalladas de compilación, se indica consultar
BUILDING.md - El APK firmado se genera en
FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk
Derechos y proyectos de referencia
- El autor del proyecto aclara que no reclama derechos de autor y que los derechos del juego y los recursos pertenecen a DotGEARS
- Los proyectos que sirvieron de inspiración son los siguientes
1 comentarios
Comentarios de Hacker News
Me gustaría que las tiendas de apps tuvieran un filtro para ver solo apps de menos de 10 MB
Las apps más rápidas y con menos anuncios y micropagos suelen ser las pequeñas
Es mucho más probable que quedes satisfecho descargando una app de termómetro de 3 MB que una de 150 MB
Todas esas apps eran realmente pequeñas, de menos de 200 KB
Los reclutadores muchas veces pedían resultados para mostrar, como si fueran un portafolio artístico, incluso de apps que ya no existían o cuyos servidores de producción estaban caídos
Un criterio aún más arbitrario era verificar si habías trabajado en alguna app grande, y si usando muchas técnicas de optimización que parecían demostrar capacidad lograbas un paquete de 8 a 12 MB, lo tomaban como señal de que la app, el servicio o la base de usuarios eran pequeños
En realidad, aunque tuviera cientos de millones de descargas y usuarios, eso no tenía nada que ver con ese criterio, y en este campo hay un incentivo enorme para crear apps infladas
Por ejemplo, incluso incluyendo anuncios, tuve que buscar unas 9 veces para encontrar una app de termómetro de más de 7 MB
Trabajé varios años en ambas plataformas y no sé exactamente por qué; si tuviera que adivinar, quizá sea porque Android tiene una tradición mucho más fuerte de arte vectorial que de bitmaps, y porque las bibliotecas de Swift, gracias a la estabilidad de ABI, durante años tuvieron que compilarse junto con la app hasta que se empezó a usar el enlazado dinámico del lado del sistema operativo
Me gustaría poder filtrar por apps de pago, sin anuncios y, a veces, sin compras dentro de la app
Es un poco tangencial, pero hace tiempo escribí una revisión bibliográfica sobre por qué la gente juega Flappy Bird
En ese momento era estudiante de posgrado en investigación de juegos y al final no seguí en la academia, pero lo comparto por diversión
Está aquí para quien tenga curiosidad [1]
[1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
Por un lado, el juego en sí no tiene progreso real ni aumento de dificultad. La dificultad es la misma sin importar si tu puntaje actual es 0, 10 o 100
Pero cada nuevo récord se convierte en una nueva cima que el jugador debe superar. La primera, y quizá la más frustrante, es conseguir 1 punto; para llegar a puntajes de dos cifras, básicamente hay que dominar los controles centrales, incluida la física y el timing precisos, y aprender a manejar distintas situaciones
Los obstáculos para llegar a tres cifras o más parecen casi autogenerados, y el miedo y la tensión al acercarse al récord personal son el mayor obstáculo para superarlo
Una vez que superas ese récord, el temblor de manos desaparece mágicamente la próxima vez que te acercas a él, pero vuelve a aparecer cuando te acercas a un nuevo récord
El concepto básico de gameplay es engañosamente simple, pero para quien quiera analizarlo tiene muchas capas por desentrañar
https://www.foddy.net/Athletics.html
Son menos de 4 mil líneas
457 android_native_app_glue.c
360 audio.c
802 game.c
201 init.c
93 main.c
39 mouse.c
38 shaders.c
229 texture.c
1377 upng.c
27 utils.c
3623 total
No es un programa tan complejo, así que sinceramente creo que incluso 4 mil líneas son demasiadas
En 2020 hice y publiqué algo similar en Nim, aunque los gráficos eran menos bonitos
La diferencia es que fui más a fondo y de hecho escribí hasta un ensamblador para bytecode de Dalvik y archivos .apk
https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
Lamentablemente, el código del repositorio se rompió con el tiempo, y a veces pienso en revivirlo algún día
A veces se me ocurren apps que podría hacer fácilmente si aquello estuviera un poco más pulido
Realmente genial
Es bueno ver una app de Android de menos de 1 MB que corre en todas partes, incluso en un HTC viejo
Pensaba que para crear un APK de Android hacía falta código de enlace en Java, así que me alegra ver este proyecto
0 archivos Java, excelente
También vale la pena ver el proyecto rawandroid que mencionaron otros
https://github.com/cnlohr/rawdrawandroid/tree/master
Hagas lo que hagas, necesitas una instancia de Activity para ejecutarlo, y aunque también se puede crear en C, requiere mucho código repetitivo que en Java se resuelve en gran parte mediante herencia
En C puro se hace así: https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi... https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi...
Super Mario Bros ocupaba apenas 40 KB
https://news.ycombinator.com/item?id=21213421
Este clon de Flappy Bird corre en incontables dispositivos con configuraciones de hardware y software muy variadas
Perdieron la oportunidad de llamarlo Floppy Bird, ya que cabe en un disquete de 3,5 pulgadas
El más llamativo es una simple versión con cambio de skin que usa un ícono de disquete en lugar de un pájaro
Por supuesto, “angry birds” es “ongry beards”
¿Esta técnica de crear aplicaciones en C para Android con rawdrawandroid podría aplicarse también a otros frameworks en C, como raylib?
¿Y se podría usar este sistema de desarrollo a través de Termux para montar un entorno de desarrollo en C para Android sobre Android?
Tengo un script de compilación algo incompleto que uso para mi proyecto con raylib
Obviamente habría que manejar mejor la firma, quizá quieras compilar para objetivos además de aarch64, y puede que el SDK tampoco esté instalado en /home/denis
Además, no estoy seguro de que agregar el archivo .so al apk de esta forma sea el método preferido por Android moderno, pero todavía funciona
https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
Si es “para Android”, eso significa que se puede usar Java, y el bytecode puede ser muy compacto, así que parece que podría hacerse aún más pequeño
No es que quiera desmerecer este proyecto basado en Android. Tampoco está afirmando haber hecho el clon de Flappy Bird más pequeño
[0] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy/...
[1] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy
[2] https://www.youtube.com/watch?v=m839Vg_qXzM
En mi cabeza debería poder bajarse mucho más, y hasta 10 KB suena vagamente realista