A minimalist hyper-casual mobile game built with Flutter & Flame engine. Tap to stop each moving block and stack them as perfectly as possible. How high can you go?
- One tap mechanic — tap the screen to stop the moving block
- Perfect placement — align within 8px for a bonus and no cut
- Increasing speed — the higher your tower, the faster the blocks move
- Game over — miss the overlap completely and it's over!
| Feature | Description |
|---|---|
| 🎯 Perfect Bonus | Snap & +2 score for near-perfect placements |
| 🌈 Color Transition | Background hue shifts smoothly with each block |
| 💥 Particle Effects | Block cuts trigger satisfying particle explosions |
| 📳 Screen Shake | Camera shake on every cut for impact feedback |
| 🔊 Sound Effects | Pitch-scaling blip sounds that rise with your score |
| 🏆 High Score | Persistent best score saved locally |
| 📱 AdMob Ads | Banner + interstitial ads via Google AdMob |
| 💫 PERFECT! Text | Floating animated text on perfect placements |
- Framework: Flutter 3.41+
- Game Engine: Flame 1.36+
- Audio: flame_audio
- Ads: google_mobile_ads
- Storage: shared_preferences
- Language: Dart 3.11+
- Flutter SDK 3.41+
- Android Studio / VS Code
- Android emulator or physical device (Android 5.0+)
# Clone the repository
git clone https://github.com/MehmetMagden/stack_tower.git
cd stack_tower
# Install dependencies
flutter pub get
# Run in debug mode
flutter run
# Build release APK
flutter build apk --release
# Build release AAB (recommended for Play Store)
flutter build appbundle --release
The app uses Google AdMob for monetization. To run with your own ad units:
- Replace the ad unit IDs in
lib/main.dart:
const String _bannerAdUnitId = 'your-banner-ad-unit-id';
const String _interstitialAdUnitId = 'your-interstitial-ad-unit-id';
- Update
android/app/src/main/AndroidManifest.xmlwith your AdMob App ID:
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="your-admob-app-id"/>
⚠️ For development, use Google's test ad unit IDs to avoid invalid traffic.
stack_tower/
├── lib/
│ └── main.dart # All game logic (single file)
├── assets/
│ ├── audio/
│ │ └── blip.wav # Sound effect
│ └── icon/
│ └── icon.png # App icon
├── android/
│ └── app/src/main/
│ └── AndroidManifest.xml
├── pubspec.yaml
└── README.md
StackTowerApp (StatefulWidget)
├── Splash Screen # Shows during AdMob init
└── GameWidget
├── StackTowerGame # Main Flame game
│ ├── MovingBlock # Horizontally moving blocks
│ ├── FloatingText # "PERFECT!" animation
│ └── BlockParticle # Cut particle effects
├── Main Menu Overlay
└── Game Over Overlay
- Core stack mechanic
- Perfect placement bonus
- Particle effects & screen shake
- Background color transitions
- Sound effects with pitch scaling
- High score persistence
- AdMob integration
- Main menu & game over screens
- Online leaderboard (Supabase)
- Multiple block themes / skins
- Haptic feedback
- Combo multiplier system
- Share score feature
- Optimized for 60fps on real devices
- Single
Randominstance to minimize GC pressure - Pre-allocated
Paintobjects (no per-frame allocations) - World-shift scroll technique instead of camera movement
- Canvas-level shake via
canvas.translate
https://privacypolicy.aimaden.com
This app uses Google AdMob which may collect device identifiers for advertising purposes.
Mehmet Magden
QA Automation Engineer & Indie Game Developer
aimaden.com
This project is licensed under the MIT License — see the LICENSE file for details.
Made with ❤️ using Flutter & Flame
