mirror of
https://github.com/VadimBoev/FlappyBird.git
synced 2024-11-16 07:47:29 +01:00
Merge branch 'master' of https://github.com/VadimBoev/FlappyBird
This commit is contained in:
commit
70a4ba7457
3 changed files with 189 additions and 96 deletions
99
FlappyBird/build.sh
Normal file
99
FlappyBird/build.sh
Normal file
|
@ -0,0 +1,99 @@
|
|||
#! /bin/bash
|
||||
|
||||
export ANDROID_SDK_ROOT=~/Android/Sdk
|
||||
export ANDROID_NDK_ROOT=~/Android/Sdk/ndk/26.1.10909125
|
||||
export PATH=$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH
|
||||
|
||||
export ADB=~/Android/Sdk/platform-tools/adb
|
||||
|
||||
export APKNAME=FlappyBird
|
||||
export ANDROIDVERSION=34
|
||||
export ANDROIDTARGET=34
|
||||
|
||||
export KEYSTORE_PASSWORD=12345678
|
||||
|
||||
echo Cleaning previous builds...
|
||||
rm -r app/build
|
||||
|
||||
echo Creating build directories...
|
||||
mkdir -p app/build/intermediates/ndk
|
||||
mkdir -p app/build/outputs/apk
|
||||
|
||||
echo Building native code...
|
||||
cd app/src/main
|
||||
$ANDROID_NDK_ROOT/ndk-build
|
||||
ret_code=$?
|
||||
if [ $ret_code != 0 ]; then
|
||||
echo Error building native code!
|
||||
echo Error code: $ret_code
|
||||
exit $ret_code
|
||||
fi
|
||||
cd ../../..
|
||||
|
||||
echo Creating empty APK...
|
||||
$ANDROID_SDK_ROOT/build-tools/30.0.3/aapt package -f -M app/src/main/AndroidManifest.xml -S app/src/main/res -A app/src/main/assets -I $ANDROID_SDK_ROOT/platforms/android-$ANDROIDTARGET/android.jar -F app/build/outputs/apk/unaligned.apk
|
||||
ret_code=$?
|
||||
if [ $ret_code != 0 ]; then
|
||||
echo Error creating empty APK!
|
||||
echo Error code: $ret_code
|
||||
exit $ret_code
|
||||
fi
|
||||
|
||||
mkdir lib
|
||||
|
||||
echo Copy files from libs to a temporary folder
|
||||
cp app/src/main/libs/* lib/ -R
|
||||
|
||||
echo Add the contents of the temporary folder to the archive in the lib folder
|
||||
zip app/build/outputs/apk/unaligned.apk -r lib/* lib/
|
||||
|
||||
echo Aligning APK...
|
||||
$ANDROID_SDK_ROOT/build-tools/30.0.3/zipalign -f 4 app/build/outputs/apk/unaligned.apk app/build/outputs/apk/$APKNAME.apk
|
||||
ret_code=$?
|
||||
if [ $ret_code != 0 ]; then
|
||||
echo Error aligning APK!
|
||||
echo Error code: $ret_code
|
||||
exit $ret_code
|
||||
fi
|
||||
|
||||
# create a keystore if needed
|
||||
if [ 0 ]; then
|
||||
echo y | $JAVA_HOME/bin/keytool -genkeypair \
|
||||
-dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US" \
|
||||
-alias business \
|
||||
-keypass $KEYSTORE_PASSWORD \
|
||||
-keystore mykeystore.jks \
|
||||
-storepass $KEYSTORE_PASSWORD \
|
||||
-validity 20000
|
||||
fi
|
||||
|
||||
echo Signing APK...
|
||||
$ANDROID_SDK_ROOT/build-tools/30.0.3/apksigner sign --ks mykeystore.jks --ks-pass pass:$KEYSTORE_PASSWORD --out app/build/outputs/apk/$APKNAME-signed.apk app/build/outputs/apk/$APKNAME.apk
|
||||
ret_code=$?
|
||||
if [ $ret_code != 0 ]; then
|
||||
echo Error signing APK!
|
||||
echo Error code: $ret_code
|
||||
exit $ret_code
|
||||
fi
|
||||
|
||||
echo Delete temporary folder
|
||||
rm -r lib
|
||||
|
||||
echo Deleting unnecessary files...
|
||||
rm app/build/outputs/apk/$APKNAME.apk
|
||||
rm app/build/outputs/apk/$APKNAME-signed.apk.idsig
|
||||
rm app/build/outputs/apk/unaligned.apk
|
||||
|
||||
echo APK successfully created: app/build/outputs/apk/$APKNAME-signed.apk
|
||||
|
||||
echo Debug moment
|
||||
echo Clear logcat
|
||||
$ADB logcat -c
|
||||
echo Installing APK
|
||||
$ADB install app/build/outputs/apk/$APKNAME-signed.apk
|
||||
echo Launching APK
|
||||
$ADB shell am start -n com.flappybird.game/android.app.NativeActivity
|
||||
echo Starting logging
|
||||
$ADB logcat -s flappy
|
||||
|
||||
exit
|
93
README.md
93
README.md
|
@ -4,61 +4,58 @@
|
|||
|
||||
[Dev blog in Telegram (ENG/RU)](https://t.me/boevdev)
|
||||
|
||||
# Flappy Bird, only C, without Java/Kotlin, weight APK (armeabi-v7a + arm64-v8a) < 100 kilobytes
|
||||
# 🐦 Flappy Bird in C: APK Size < 100 Kilobytes! 🚀
|
||||
|
||||
## History:
|
||||
|
||||
It all started in 2021. Then I came across the [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid) repository.
|
||||
There was a motivation to make some kind of game with the lowest possible APK weight, but at the same time, so that the game would be simple and understandable.
|
||||
At that moment, the idea came up to make a clone of the long-forgotten Flappy Bird game. Which has already been ported to many programming languages.
|
||||
Then, later in 2021, I found another interesting repository [Raylib](https://github.com/raysan5/raylib).
|
||||
But, the first attempt to make this game was in C++, using [ImGui](https://github.com/ocornut/imgui/), because I already knew him.
|
||||
And so, all the difficulties were presented in Android Native Activity and building a clean APK from apktool without Android Studio.
|
||||
The first attempt failed.
|
||||
Firstly, the weight of the APK was about 1 Megabyte.
|
||||
Secondly, there could be crashes of the game.
|
||||
Thirdly, there was only a library for armeabi-v7a inside the APK, and since 2022 Google's rules require the presence of arm64-v8a libraries.
|
||||
Fourthly, the structure of the project and its organization were terrible, it created a mess in the eyes and made it difficult to navigate the project normally.
|
||||
In general, I tried something, it didn't work out, the thought was stored in my head throughout this time, but no more attempts were made.
|
||||
## 📜 History:
|
||||
|
||||
## Motivation:
|
||||
|
||||
Around September 14, 2024, in the Raylib discord channel, I saw a guy make a Flappy Bird in C#.
|
||||
Then it became very interesting to me to try a crazy idea, to make this game in C, for Android, with an APK weighing less than 100 Kilobytes.
|
||||
The idea seemed crazy, as well as unsuccessful.
|
||||
Just imagine, today, when the weight of the APK reaches 500 Megabytes, you only need to keep less than 100 Kilobytes.
|
||||
What are these frames for? It's a sporting interest, will it work out? It worked! But it wasn't easy at all.
|
||||
|
||||
## Implementation:
|
||||
|
||||
At first, I put together a solution that compiled Hello World in C, packaged the library into an APK, everything was signed and sent to my device via USB.
|
||||
As soon as everything was ready, I went on to explore the resources of the game. The sounds were in ogg format at first, I compressed them, but there were some problems, I don't remember this moment anymore.
|
||||
Then the sounds still became mp3 format, compressed at 16 (kilobytes per second) each, thereby reducing the weight as much as possible, and the sound quality remained tolerable.
|
||||
The first difficulty arose if I had previously used [BASS](https://www.un4seen.com/) to play the sound, and it's heavy for my purpose, I had to study OpenSLES, which reads MP3 format without problems.
|
||||
Further, png images remain from the resources. There is no other way to use the format. Then it was necessary to find something easier than [stb_image](https://github.com/nothings/stb ).
|
||||
So I came across [upng](https://github.com/elanthis/upng), which completely solved the issue of decoding png files for their further rendering.
|
||||
It all started in 2021 when I stumbled upon [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid). My goal was simple: to create a game with the minimal APK size, yet still be understandable and interesting. 🎯
|
||||
|
||||
In general, everything is simpler than it seems.
|
||||
OpenGL ES 2 + shaders for rendering, OpenSLES for sounds, upng for decoding png format and of course Android Native Activity.
|
||||
|
||||
## Build:
|
||||
- Download [Visual Studio 2022](https://visualstudio.microsoft.com/)
|
||||
- - Open Visual Studio Installer
|
||||
- - Click "Edit"
|
||||
- - Check the following items: Development of classic applications in C++, Development of mobile applications in C++
|
||||
- Download Android Studio (we need apktool, sdk, ndk from it)
|
||||
- - Install NDK 25.2.9519653 (you can use the version above)
|
||||
- In the project, the setting is made for "Debug ARM", but make changes to build.bat (look at the paths)
|
||||
- Compile via CTRL + B
|
||||
|
||||
## Copyright:
|
||||
I do not claim copyright. The right to this game and resources belongs to **DotGEARS**.
|
||||
The idea of making a Flappy Bird clone seemed logical, given that this game had already been ported to many languages. 🐤
|
||||
|
||||
In 2021, I also studied [Raylib](https://github.com/raysan5/raylib), but my first attempt to make a game in C++ using [ImGui](https://github.com/ocornut/imgui/) failed. 💔
|
||||
|
||||
The problems were everywhere: the APK size was around 1 MB, the game crashed, and the APK only contained the armeabi-v7a library (Google's 2022 requirements state that the arm64-v8a library must be included!). 🤯
|
||||
|
||||
## 💡 Motivation:
|
||||
|
||||
In September 2024, seeing Flappy Bird in C# in the Raylib Discord channel, I decided to try implementing this game in C for Android with an APK size of less than 100 KB. 🚀
|
||||
|
||||
The idea seemed crazy, but the competitive interest took over. 💪
|
||||
|
||||
## 🛠️ Implementation:
|
||||
|
||||
I started by compiling a "Hello World" in C and packaging the library into an APK. 📦
|
||||
|
||||
Sounds were compressed to MP3 format, and OpenSLES was used for playback. 🎵
|
||||
|
||||
For PNG file decoding, I chose [upng](https://github.com/elanthis/upng). 🖼️
|
||||
|
||||
All of this was combined using OpenGL ES 2, shaders, and Android Native Activity. 🎮
|
||||
|
||||
## 🔧 Build:
|
||||
|
||||
1. Download [Visual Studio 2022](https://visualstudio.microsoft.com/).
|
||||
2. Install components: C++ Desktop Development and C++ Mobile Development.
|
||||
3. Download Android Studio (for apktool, sdk, ndk).
|
||||
4. Install NDK 27.1.12297006.
|
||||
5. Configure the project for "Debug ARM" and make changes to build.bat.
|
||||
6. Compile via CTRL + B. 🛠️
|
||||
|
||||
## 📄 Copyright:
|
||||
|
||||
I do not claim any copyright. The rights to the game and resources belong to **DotGEARS**. 📜
|
||||
|
||||
## 🌟 Inspiration:
|
||||
|
||||
## Inspiration:
|
||||
- [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid)
|
||||
- [Flapper](https://github.com/its-Lyn/Flapper)
|
||||
- [Raylib](https://github.com/raysan5/raylib)
|
||||
- [ImGui](https://github.com/ocornut/imgui/)
|
||||
|
||||
## Star History
|
||||
## 🌠 Star History
|
||||
|
||||
[![Star History Chart](https://api.star-history.com/svg?repos=VadimBoev/FlappyBird&type=Timeline)](https://star-history.com/#VadimBoev/FlappyBird&Timeline)
|
||||
|
||||
---
|
||||
|
||||
🎉 Enjoy the game and don't forget to star it! 🌟
|
||||
|
|
93
README_RU.md
93
README_RU.md
|
@ -1,58 +1,55 @@
|
|||
# Flappy Bird, только Си, без Java/Kotlin, вес APK (armeabi-v7a + arm64-v8a) < 100 kilobytes
|
||||
# 🐦 Flappy Bird на Си: Вес APK < 100 Килобайт! 🚀
|
||||
|
||||
## История:
|
||||
|
||||
Всё началось в 2021 году. Тогда я наткнулся на репозиторий [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid).
|
||||
Появилась мотивация сделать какую-нибудь игру с максимально меньшим весом APK, но при этом, что бы игра была простой и понятной.
|
||||
В моменте появилась идея сделать клон давно забытой игры Flappy Bird. Которую уже портировали на многие языки программирования.
|
||||
Тогда, позднее в 2021 году, я нашел ещё один интересный репозиторий [Raylib](https://github.com/raysan5/raylib).
|
||||
Но, первая попытка сделать эту игру была на C++, при использовании [ImGui](https://github.com/ocornut/imgui/), потому что я уже был с ним знаком.
|
||||
А так, все трудности были представлены в Android Native Activity и сборке чистого APK из apktool без Android Studio.
|
||||
Первая попытка потерпела крах.
|
||||
Во-первых, вес APK был примерно 1 Мегабайт.
|
||||
Во-вторых, могли случаться вылеты игры.
|
||||
В-третьих, внутри APK была только библиотека для armeabi-v7a, а с 2022 года правила Google требуют наличие arm64-v8a библиотек.
|
||||
В-четвертых, структура проекта и его организация были ужасными, это создавало кашу в глазах и мешало нормально ориентироваться в проекте.
|
||||
В целом, что-то попробовал, не получилось, мысль в голове хранилась на протяжении всего этого времени, но попыток больше не предпринималось.
|
||||
## 📜 История:
|
||||
|
||||
## Мотивация:
|
||||
|
||||
Примерно 14 сентября 2024 года, в дискорд-канале Raylib я увидел как один парень сделал Flappy Bird на языке C#.
|
||||
Тогда мне стало очень интересно, попробовать безумную идею, сделать эту игру на Си, для Android, весом APK меньше 100 Килобайт.
|
||||
Идея казалось безумной, а также, безуспешной.
|
||||
Просто представьте, сегодня, когда вес APK достигает по 500 Мегабайт, нужно уложиться всего лишь меньше, чем 100 Килобайт.
|
||||
Для чего такие рамки? Это спортивный интерес, получится ли такое? Получилось! Но было совсем не просто.
|
||||
|
||||
## Реализация:
|
||||
|
||||
По началу я собрал себе решение которое компилировало Hello World на Си, упаковывало библиотеку в APK, всё подписывалось и отправлялось мне на устройство по USB.
|
||||
Как только всё было готово, дальше я пошел изучать ресурсы игры. Звуки сначала были в формате ogg, я их сжал, но были какие-то проблемы, я уже не помню этот момент.
|
||||
Дальше звуки всё же стали форматом mp3, сжатым по 16 (килобайт в секунду) каждый, тем самым максимально уменьшив вес, а также качество звука оставалось терпимым.
|
||||
Возникла первая трудность, если раньше для воспроизведения звука я использовал [BASS](https://www.un4seen.com/), а он тяжелый для моей цели, то пришлось изучить OpenSLES который без проблем читает формат MP3.
|
||||
Дальше из ресурсов остаются картинки, формата png. Иного вариант использования формата нет. Тогда надо было найти что-то легче, чем [stb_image](https://github.com/nothings/stb).
|
||||
Так я наткнулся на [upng](https://github.com/elanthis/upng), которая полностью решила вопрос с декодированием png файлов для дальнейшего их рендера.
|
||||
Всё началось в 2021 году, когда я наткнулся на [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid). Моя цель была проста: создать игру с минимальным весом APK, но при этом, чтобы она была понятной и интересной. 🎯
|
||||
|
||||
В целом всё проще чем кажется.
|
||||
OpenGL ES 2 + шейдеры для отрисовки, OpenSLES для звуков, upng для декодирования png формата и конечно же Android Native Activity.
|
||||
|
||||
## Сборка:
|
||||
- Скачайте [Visual Studio 2022](https://visualstudio.microsoft.com/)
|
||||
- - Откройте Visual Studio Installer
|
||||
- - Нажмите "Изменить"
|
||||
- - Отметьте пункты: Разработка классических приложений на С++, Разработка мобильных приложений на языке С++
|
||||
- Скачайте Android Studio (от него нам нужен apktool, sdk, ndk)
|
||||
- - Установите NDK 25.2.9519653 (можно версию выше)
|
||||
- В проекте настройка сделана для "Debug ARM", но внесите изменения в build.bat (посмотрите пути)
|
||||
- Компилируйте через CTRL + B
|
||||
|
||||
## Авторское право:
|
||||
Я не претендую на авторское право. Право на эту игру и ресурсы принадлежит **DotGEARS**.
|
||||
Идея сделать клон Flappy Bird казалась логичной, учитывая, что эта игра уже была портирована на множество языков. 🐤
|
||||
|
||||
В 2021 году я также изучил [Raylib](https://github.com/raysan5/raylib), но первая попытка сделать игру на C++ с использованием [ImGui](https://github.com/ocornut/imgui/) потерпела неудачу. 💔
|
||||
|
||||
Проблемы были везде: вес APK был около 1 МБ, игра вылетала, и в APK была только библиотека для armeabi-v7a (требования Google от 2022 года это наличие arm64-v8a библиотеки!). 🤯
|
||||
|
||||
## 💡 Мотивация:
|
||||
|
||||
В сентябре 2024 года, увидев Flappy Bird на C# в дискорд-канале Raylib, я решил попробовать реализовать эту игру на Си для Android с весом APK менее 100 КБ. 🚀
|
||||
|
||||
Идея казалась безумной, но спортивный интерес взял верх. 💪
|
||||
|
||||
## 🛠️ Реализация:
|
||||
|
||||
Начал с компиляции "Hello World" на Си и упаковки библиотеки в APK. 📦
|
||||
|
||||
Звуки были сжаты до формата MP3, а для их воспроизведения использовался OpenSLES. 🎵
|
||||
|
||||
Для декодирования PNG файлов я выбрал [upng](https://github.com/elanthis/upng). 🖼️
|
||||
|
||||
Всё это было объединено с помощью OpenGL ES 2, шейдеров и Android Native Activity. 🎮
|
||||
|
||||
## 🔧 Сборка:
|
||||
|
||||
1. Скачайте [Visual Studio 2022](https://visualstudio.microsoft.com/).
|
||||
2. Установите компоненты: Разработка классических приложений на С++ и Разработка мобильных приложений на языке С++.
|
||||
3. Скачайте Android Studio (для apktool, sdk, ndk).
|
||||
4. Установите NDK 27.1.12297006.
|
||||
5. Настройте проект для "Debug ARM" и внесите изменения в build.bat.
|
||||
6. Компилируйте через CTRL + B. 🛠️
|
||||
|
||||
## 📄 Авторское право:
|
||||
|
||||
Я не претендую на авторские права. Право на игру и ресурсы принадлежит **DotGEARS**. 📜
|
||||
|
||||
## 🌟 Вдохновение:
|
||||
|
||||
## Вдохновление:
|
||||
- [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid)
|
||||
- [Flapper](https://github.com/its-Lyn/Flapper)
|
||||
- [Raylib](https://github.com/raysan5/raylib)
|
||||
- [ImGui](https://github.com/ocornut/imgui/)
|
||||
|
||||
## Star History
|
||||
## 🌠 Star History
|
||||
|
||||
[![Star History Chart](https://api.star-history.com/svg?repos=VadimBoev/FlappyBird&type=Timeline)](https://star-history.com/#VadimBoev/FlappyBird&Timeline)
|
||||
|
||||
---
|
||||
|
||||
🎉 Наслаждайтесь игрой и не забудьте поставить звезду! 🌟
|
||||
|
|
Loading…
Reference in a new issue