-
Notifications
You must be signed in to change notification settings - Fork 136
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of https://github.com/VadimBoev/FlappyBird
- Loading branch information
Showing
3 changed files
with
195 additions
and
102 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,58 +1,55 @@ | ||
# Flappy Bird, только Си, без Java/Kotlin, вес APK (armeabi-v7a + arm64-v8a) < 100 kilobytes | ||
|
||
## История: | ||
|
||
Всё началось в 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 файлов для дальнейшего их рендера. | ||
|
||
В целом всё проще чем кажется. | ||
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 на Си: Вес 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/) потерпела неудачу. 💔 | ||
|
||
Проблемы были везде: вес 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) | ||
|
||
--- | ||
|
||
🎉 Наслаждайтесь игрой и не забудьте поставить звезду! 🌟 |