Sebuah game billiard 8-ball klasik yang dibangun menggunakan JavaFX dengan physics engine realistis dan kontrol two-stage aiming system.
- Two-Stage Aiming System: Klik pertama untuk mengunci sudut, drag untuk mengatur power
- Realistic Physics Engine: Sistem tabrakan elastis, friction, dan momentum yang akurat
- Ball-in-Hand: Penalti untuk foul dengan sistem drag-and-drop bola putih
- Visual Aim Line: Garis bantu prediksi jalur bola dan hasil tabrakan
- Aturan 8-ball standar (Solids vs Stripes)
- Open table di awal permainan
- Sistem deteksi foul:
- Bola putih masuk lubang
- Tidak mengenai bola apapun
- Memasukkan bola lawan
- Bola 8 masuk sebelum waktunya
- Win condition: Memasukkan semua 7 bola grup + bola 8
- Meja billiard dengan cushion realistis
- 6 pockets (corner + middle)
- Warna bola standar (1-15 + cue ball)
- HUD dinamis menampilkan:
- Bola yang sudah masuk per pemain
- Grup pemain (SOLIDS/STRIPES)
- Highlight giliran aktif
- Power bar indicator
- Stick visual dengan shadow dan gradient
- Java 17 atau lebih tinggi
- JavaFX SDK 17+
- Clone repository
git clone https://github.com/DeoDaniel/BL.git
cd billiard-javafx- Compile project
javac --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml -d out src/billiard/*.java- Run game
java --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml -cp out billiard.BilliardGame- Import project sebagai Java project
- Tambahkan JavaFX library ke project dependencies
- Set VM options:
--module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml
- Run
BilliardGame.java
| Aksi | Kontrol |
|---|---|
| Aiming | Gerakkan mouse untuk membidik |
| Lock Angle | Klik kiri pertama untuk mengunci sudut |
| Set Power | Drag mundur (menjauhi bola) untuk power |
| Shoot | Lepas mouse untuk menembak |
| Cancel | Klik kanan untuk membatalkan lock |
| Ball-in-Hand | Drag bola putih ke posisi yang diinginkan |
| Confirm Position | Klik kiri untuk konfirmasi posisi bola |
billiard/
├── Ball.java # Class bola dengan physics properties
├── BallGroup.java # Enum untuk SOLIDS/STRIPES
├── BilliardGame.java # Main game class & logic
├── Cue.java # Stick billiard dengan aiming system
├── GamePanel.java # Canvas panel dengan game loop
├── GameState.java # Enum state game
├── PhysicsEngine.java # Engine untuk collision & friction
├── Player.java # Class pemain
├── Pocket.java # Class lubang meja
├── Table.java # Meja billiard dengan rendering
└── module-info.java # Java module descriptor
RESTITUTION = 0.98 // Elastisitas tabrakan bola (0-1)
WALL_RESTITUTION = 0.95 // Elastisitas pantulan dinding
MIN_SPEED = 0.3 // Threshold kecepatan minimum- Rolling friction: 0.996 (konstan)
- Air drag: Speed-dependent (quadratic)
- Combined friction memberikan deselerasi realistis
- Bola pertama yang masuk menentukan grup pemain
- Pemain yang memasukkan bola pertama mendapat giliran lanjutan
- Memasukkan bola grup sendiri (tanpa foul)
- Tidak ada foul dalam tembakan
- Tidak memasukkan bola apapun
- Terjadi foul (lawan dapat ball-in-hand)
- Masukkan semua 7 bola grup sendiri
- Masukkan bola 8 terakhir
- Tidak boleh foul saat memasukkan bola 8
- Cue ball masuk lubang → Ball-in-hand untuk lawan
- No hit (tidak mengenai bola apapun) → Ball-in-hand
- Wrong ball pocketed (memasukkan bola lawan) → Bola masuk ke lawan
- Ball 8 early (bola 8 masuk sebelum 7 bola selesai) → Dikembalikan ke meja
Edit di Ball.java, method render():
case 1: mainColor = Color.YELLOW; break;
case 2: mainColor = Color.BLUE; break;
// dst...Edit di Table.java:
public final double WIDTH = 1120;
public final double HEIGHT = 560;Edit di Cue.java:
public double maxPower = 2500;- Bola kadang bisa "stuck" jika tabrakan terlalu banyak sekaligus
- Ball-in-hand tidak membatasi area kitchen (zona break)
- Tidak ada animasi transisi untuk bola yang masuk
- Tambah sound effects (tabrakan, masuk lubang)
- Implementasi spin/english (backspin, sidespin)
- AI opponent mode
- Online multiplayer
- Replay system
- Tournament mode
- Customizable table skins
- Statistics tracking
Kontribusi sangat diterima! Silakan:
- Fork repository ini
- Buat branch fitur (
git checkout -b feature/AmazingFeature) - Commit perubahan (
git commit -m 'Add some AmazingFeature') - Push ke branch (
git push origin feature/AmazingFeature) - Buat Pull Request
Project ini dilisensikan di bawah MIT License - lihat file LICENSE untuk detail.
- Inspirasi dari game 8-ball pool klasik
- JavaFX documentation dan community
- Physics simulation references dari berbagai sumber billiard physics papers
Untuk pertanyaan atau saran, silakan buat issue di repository ini.
Selamat bermain! 🎱