Skip to content

Latest commit

ย 

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽฑ Billiard Game JavaFX

Sebuah game billiard 8-ball klasik yang dibangun menggunakan JavaFX dengan physics engine realistis dan kontrol two-stage aiming system.

Java JavaFX License

โœจ Fitur Utama

๐ŸŽฎ Gameplay

  • 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

๐ŸŽฏ Sistem Permainan

  • 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

๐ŸŽจ Visual

  • 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

๐Ÿš€ Cara Menjalankan

Prerequisites

  • Java 17 atau lebih tinggi
  • JavaFX SDK 17+

Instalasi

  1. Clone repository
git clone https://github.com/DeoDaniel/BL.git
cd billiard-javafx
  1. Compile project
javac --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml -d out src/billiard/*.java
  1. Run game
java --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml -cp out billiard.BilliardGame

Menggunakan IDE (IntelliJ IDEA / Eclipse)

  1. Import project sebagai Java project
  2. Tambahkan JavaFX library ke project dependencies
  3. Set VM options:
--module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml
  1. Run BilliardGame.java

๐ŸŽฎ Kontrol

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

๐Ÿ“ Struktur Project

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

๐Ÿ”ง Konfigurasi Physics

Constants (PhysicsEngine.java)

RESTITUTION = 0.98        // Elastisitas tabrakan bola (0-1)
WALL_RESTITUTION = 0.95   // Elastisitas pantulan dinding
MIN_SPEED = 0.3           // Threshold kecepatan minimum

Friction System

  • Rolling friction: 0.996 (konstan)
  • Air drag: Speed-dependent (quadratic)
  • Combined friction memberikan deselerasi realistis

๐ŸŽฏ Aturan Permainan

Open Table

  • Bola pertama yang masuk menentukan grup pemain
  • Pemain yang memasukkan bola pertama mendapat giliran lanjutan

Giliran Berlanjut Jika:

  • Memasukkan bola grup sendiri (tanpa foul)
  • Tidak ada foul dalam tembakan

Giliran Berganti Jika:

  • Tidak memasukkan bola apapun
  • Terjadi foul (lawan dapat ball-in-hand)

Win Condition

  1. Masukkan semua 7 bola grup sendiri
  2. Masukkan bola 8 terakhir
  3. Tidak boleh foul saat memasukkan bola 8

Foul

  1. Cue ball masuk lubang โ†’ Ball-in-hand untuk lawan
  2. No hit (tidak mengenai bola apapun) โ†’ Ball-in-hand
  3. Wrong ball pocketed (memasukkan bola lawan) โ†’ Bola masuk ke lawan
  4. Ball 8 early (bola 8 masuk sebelum 7 bola selesai) โ†’ Dikembalikan ke meja

๐ŸŽจ Customization

Mengubah Warna Bola

Edit di Ball.java, method render():

case 1: mainColor = Color.YELLOW; break;
case 2: mainColor = Color.BLUE; break;
// dst...

Mengubah Ukuran Meja

Edit di Table.java:

public final double WIDTH = 1120;
public final double HEIGHT = 560;

Mengubah Power Stick

Edit di Cue.java:

public double maxPower = 2500;

๐Ÿ› Known Issues

  • 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

๐Ÿ”ฎ Roadmap

  • 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

Kontribusi sangat diterima! Silakan:

  1. Fork repository ini
  2. Buat branch fitur (git checkout -b feature/AmazingFeature)
  3. Commit perubahan (git commit -m 'Add some AmazingFeature')
  4. Push ke branch (git push origin feature/AmazingFeature)
  5. Buat Pull Request

๐Ÿ“„ License

Project ini dilisensikan di bawah MIT License - lihat file LICENSE untuk detail.

๐Ÿ™ Acknowledgments

  • Inspirasi dari game 8-ball pool klasik
  • JavaFX documentation dan community
  • Physics simulation references dari berbagai sumber billiard physics papers

๐Ÿ“ž Contact

Untuk pertanyaan atau saran, silakan buat issue di repository ini.


Selamat bermain! ๐ŸŽฑ

About

BL

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages