Moongazer
A brick breaker game inspired by Arkanoid.
Install / Use
/learn @teppyboy/MoongazerREADME
Moongazer - Story-Driven Arkanoid Game
Author
Group vibEcoderS - Class INT2204 6
- Nguyễn Thế Hưng - 24020150
- Nguyễn Quốc Khánh - 24022671
- Phạm Quang Minh - 24020239
- Nguyễn Gia Quang - 24020619
Instructor: Kiều Văn Tuyên Semester: HK1 2025-2026
Description
Moongazer is a story-driven Arkanoid game that combines classic brick-breaking gameplay with visual novel storytelling elements. Set in the world of Wuthering Waves, players experience an engaging narrative while enjoying challenging Arkanoid mechanics.
Key features:
- Dual Game Modes: Story Mode with narrative chapters and Endless Mode for infinite gameplay
- Visual Novel Integration: Fully voiced story scenes with character dialogues
- Modern Tech Stack: Built with Java 25 and LibGDX framework
- Comprehensive Save System: Multiple save slots with progress tracking
- Rich Visual Effects: Parallax backgrounds, combo animations, and smooth transitions
- Database-Driven: SQLite database for high scores, saves, and leaderboards
- Professional UI: Wuthering Waves-inspired interface with custom fonts and assets
Game mechanics:
- Control a paddle to bounce balls and destroy bricks
- Collect power-ups for enhanced abilities (Expand Paddle, Multi Ball, Laser Gun, etc.)
- Progress through 5 story chapters with unique narratives
- Compete in Endless Mode with increasing difficulty waves
- Track high scores for each stage and endless mode
- Experience smooth parallax effects and dynamic visuals
UML Diagram

Design Patterns Implementation
1. Scene Management Pattern
Used in: Game class and all Scene implementations
Purpose: Manages game states and transitions between different scenes (Main Menu, Story Mode, Endless Mode, etc.)
2. Factory Pattern
Used in: Brick creation system
Purpose: Creates different types of bricks (breakable, unbreakable, power-up bricks) with various durability levels
3. Observer Pattern
Used in: UI callbacks and game event handling
Purpose: Handles button clicks, menu actions, and game state changes through callback systems
4. Strategy Pattern
Used in: Different game modes (Story vs Endless)
Purpose: Different scoring, progression, and win/lose conditions for each game mode
Multithreading Implementation
The game uses multiple threads to ensure smooth performance:
- Main Game Thread: LibGDX's application thread handles the game loop at 60 FPS
- Asset Loading Thread: Asynchronous loading of audio files and resources
- Audio Playback: Background music and sound effects play on separate threads
- Database I/O Thread: SQLite operations for saves and high scores run asynchronously
- Video Playback: Background video in main menu runs on dedicated thread
Installation
Prerequisites
- Java 25 or higher
- Gradle 9.0+ (included via wrapper)
Steps
-
Clone the repository:
git clone https://github.com/teppyboy/Moongazer.git cd Moongazer -
Build the project:
./gradlew build -
Run the game:
./gradlew run
Usage
Controls
| Key | Action |
| --------------- | -------------------------- |
| ← (Changable) | Move paddle left |
| → (Changable) | Move paddle right |
| SPACE | Launch ball / Shoot bullet |
| ESC | Pause game / Go back |
| Mouse Click | UI interactions |
Game Modes
Story Mode
- Select Story Mode from the main menu
- Choose from 5 chapters (Victory?, Echoes of Oblivion, The Realm of Chaos, Fate Rewritten, A New Beginning)
- Experience visual novel scenes between gameplay
- Complete objectives to progress through the story
- Save your progress at any time
- Track high scores for each chapter
Endless Mode
- Select Endless Mode from the main menu
- Survive through infinite waves of bricks
- Difficulty increases with each wave
- Compete for the highest score on the leaderboard
- Track your best wave and score
Power-ups
| Power-up | Effect | Duration | | ------------- | ------------------------------------------- | ---------- | | Expand Paddle | Increases paddle width | 10 seconds | | Extra Life | Grants an additional life | Permanent | | Fast Ball | Increases ball speed by 100% | Temporary | | Slow Ball | Decreases ball speed by 50% | Temporary | | Multi Ball | Spawns 2 additional balls | Permanent | | Super Ball | Ball passes through bricks without bouncing | 15 seconds | | Laser Gun | Shoot lasers to destroy bricks | 12 seconds | | Explosive | Destroys nearby bricks on impact | Instant |
Special Features
Combo System
- Hit bricks consecutively without missing to build combo multiplier
- Visual feedback with Iuno character appearance at 10x, 20x, 30x combos
- Combo resets when ball is missed
Save/Load System
- Story Mode: Save progress at any time during gameplay
- Multiple Slots: Support for 3 separate save slots
- Auto-save: High scores are automatically saved
- Load Game: Resume from last checkpoint
Demo
Screenshots
Main Menu with Parallax Effect

Story Mode Selection

Visual Novel Scene

Gameplay with Combo System

Endless Mode

Save/Load System

Leaderboard

Video Demo
[Video Demo Coming Soon]
Gameplay videos will be available in docs/demo/ folder
Project Structure
Moongazer/
├── app/
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/org/vibecoders/moongazer/
│ │ │ │ ├── arkanoid/ # Core game objects
│ │ │ │ ├── dialogue/ # Visual novel system
│ │ │ │ ├── managers/ # Asset & Audio managers
│ │ │ │ ├── scenes/ # Game scenes
│ │ │ │ │ ├── arkanoid/ # Arkanoid gameplay
│ │ │ │ │ └── story/ # Story stages
│ │ │ │ ├── ui/ # UI components
│ │ │ │ ├── Game.java # Main game class
│ │ │ │ └── SaveGameManager.java # Database management
│ │ │ └── resources/
│ │ │ ├── textures/ # Game sprites
│ │ │ ├── audio/ # Music & SFX
│ │ │ ├── videos/ # Background videos
│ │ │ └── fonts/ # UI fonts
│ │ └── test/ # Unit tests
│ └── build.gradle.kts # Build configuration
├── docs/ # Documentation
└── README.md
Technologies Used
| Technology | Version | Purpose | | --------------- | --------------- | ------------------- | | Java | 25 | Core language | | LibGDX | 1.13.0 | Game framework | | Gradle | 9.0.0 | Build tool | | SQLite | 3.46.1.0 | Database (via JDBC) | | SLF4J + Logback | 2.0.16 / 1.5.12 | Logging | | JUnit Jupiter | 5.11.3 | Unit testing | | gdx-video | 1.3.3 | Video playback |
For all dependencies please referer to build.gradle.kts
Testing
The project includes comprehensive unit tests for core game mechanics:
# Run all tests
./gradlew test
# Run specific test class
./gradlew test --tests "org.vibecoders.moongazer.arkanoid.BallTest"
Test Coverage:
- Ball mechanics (velocity, launch, combo, properties)
- Brick system (durability, power-ups, destruction)
- Paddle movement and controls
- Bullet mechanics
Future Improvements
Planned Features
-
Enhanced Story Mode
- Additional chapters and story branches
- Multiple endings based on player choices
- More character interactions and voiced dialogues
-
Gameplay Enhancements
- More power-up varieties (Shield, Time Slow, Magnet, etc.)
- Boss battles with unique mechanics
- Challenge mode with special objectives
- Co-op multiplayer support
-
Technical Improvements
- Achievement system with rewards
- Cloud save synchronization
- Steam integration for leaderboards
- Mobile version (Android/iOS)
- Modding support for custom stages
-
Visual & Audio
- More particle effects and animations
- Additional background music tracks
- Customizable themes and skins
- Replay system for recording gameplay
Known Issues
- None currently reported
Please report any bugs or issues on the GitHub Issues page
License
GNU GPLv3, Wuthering Waves assets belong to KURO GAMES.
Acknowledgments
- Instructor: Kiều Văn Tuyên for guidance and support
- Kuro Games: For inspiration from Wuthering Waves
- LibGDX Community: For excellent documentation and support
- Group Members: For vibe coding and collaborative effort
Contact
For questions or feedback about this project:
- GitHub: teppyboy/Moongazer
- Group: vibEcoderS
Notes
- The game was developed as part of the Object-Oriented Programming with Java course curriculum
- All code is written by group members with guidance from the instructor
- Project demonstrates practical application of OOP principles, design patterns, and modern Java development
- Assets are used for educational purposes o
