|
| 1 | +# Bounceverse - A Modern Arkanoid Clone |
| 2 | +### Báo cáo Bài tập lớn OOP |
| 3 | + |
| 4 | +**Bounceverse** là một bản làm lại hiện đại của tựa game brick-breaker kinh điển, được xây dựng hoàn toàn bằng **Java** và game engine **FXGL**. Dự án này tập trung vào việc áp dụng kiến trúc **Entity-Component-System (ECS)** tiên tiến, được hỗ trợ bởi các nguyên tắc Lập trình Hướng đối tượng, để tạo ra một cấu trúc game linh hoạt, dễ bảo trì và mở rộng. |
| 5 | + |
| 6 | +Game không chỉ tái hiện lối chơi gốc mà còn bổ sung nhiều tính năng nâng cao như hệ thống sinh màn chơi ngẫu nhiên, hệ thống vật phẩm (power-up) đa dạng, kỹ năng chủ động cho Paddle và các hiệu ứng "game feel" hiện đại để mang lại trải nghiệm hấp dẫn. |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | + |
| 11 | + |
| 12 | +--- |
| 13 | + |
| 14 | +## ✨ Tính năng nổi bật |
| 15 | + |
| 16 | +Dự án Bounceverse có các tính năng nâng cao như sau: |
| 17 | + |
| 18 | +* **Sinh màn chơi ngẫu nhiên:** Mỗi lần chơi là một trải nghiệm mới với thuật toán sinh map dựa trên `FastNoiseLite`, tạo ra các layout gạch độc đáo (`GameSystem.java`). |
| 19 | + |
| 20 | +* **Đa dạng các loại gạch:** |
| 21 | + * **Gạch Thường (Normal Brick):** Gạch 1 HP. |
| 22 | + * **Gạch Cứng (Strong Brick):** Gạch nhiều HP, có hiệu ứng nứt vỡ trực quan (`StrongBrickTextureUpdater`) khi nhận sát thương. |
| 23 | + * **Gạch Khiên (Shield Brick):** Chỉ có thể bị phá từ một hướng nhất định. |
| 24 | + * **Gạch Nổ (Exploding Brick):** Khi bị phá hủy sẽ tạo ra một vụ nổ (`Explosion`), gây sát thương cho các gạch xung quanh. |
| 25 | + * **Gạch Chìa khóa (Key Brick):** Luôn luôn rơi ra vật phẩm (`Power-Up`) khi bị phá hủy. |
| 26 | + |
| 27 | +* **Hệ thống Vật phẩm (Power-Ups) phong phú:** |
| 28 | + * `GUN`: Trang bị súng cho Paddle, tự động bắn đạn lên trên để phá gạch. |
| 29 | + * `EXPAND_PADDLE`: Tăng kích thước thanh đỡ tạm thời. |
| 30 | + * `SHRINK_PADDLE`: Thu nhỏ kích thước thanh đỡ tạm thời (vật phẩm bất lợi). |
| 31 | + * `REVERSE_PADDLE`: Đảo ngược điều khiển của thanh đỡ (vật phẩm bất lợi). |
| 32 | + * `MULTIPLE_BALL`: Nhân đôi tất cả bóng đang có trên màn hình. |
| 33 | + * `FAST_BALL` / `SLOW_BALL`: Tăng hoặc giảm tốc độ của bóng. |
| 34 | + * `SHIELD`: Tạo một tấm khiên ở đáy màn hình, ngăn bóng không bị rơi ra ngoài trong một thời gian. |
| 35 | + |
| 36 | +* **Hệ thống UI/Menu hoàn chỉnh và hiện đại:** |
| 37 | + * Menu chính và menu tạm dừng được thiết kế riêng (`scenes/Menu.java`) với hiệu ứng hạt (particle effects) và hoạt ảnh mượt mà. |
| 38 | + * Màn hình Game Over (`DeathSubscene`) hiển thị điểm số và cho phép nhập tên nếu lọt vào top 10. |
| 39 | + * Giao diện trong game (HUD) hiển thị điểm số và mạng sống (`Hearts`, `HorizontalPositiveInteger`). |
| 40 | + |
| 41 | +* **Hệ thống Điểm cao (Leaderboard):** |
| 42 | + * Sử dụng `LeaderboardManager` để tự động **lưu và tải 10 điểm số cao nhất** vào file `leaderboard.dat`. |
| 43 | + |
| 44 | +* **Hiệu ứng & "Game Feel" nâng cao:** |
| 45 | + * **Nền động:** Màu nền của game thay đổi mượt mà (`BackgroundColorManager`) dựa trên tiến độ phá gạch của người chơi. |
| 46 | + * **Giao diện Synthwave:** Toàn bộ giao diện game được thiết kế với phong cách neon-synthwave độc đáo (`UISystem.java`). |
| 47 | + * **Âm thanh:** Quản lý âm thanh đầy đủ cho các hành động trong game. |
| 48 | + |
| 49 | +--- |
| 50 | + |
| 51 | +## 🎮 Hướng dẫn chơi |
| 52 | + |
| 53 | +* **Mục tiêu:** Phá vỡ tất cả gạch để đạt điểm cao nhất. |
| 54 | +* **Điều khiển:** |
| 55 | + * `Mũi tên Trái/Phải`: Di chuyển thanh đỡ (Paddle). |
| 56 | + * `SPACE`: Phóng bóng khi bóng đang dính vào thanh đỡ (đầu màn/sau khi mất mạng). |
| 57 | + * `ESC`: Tạm dừng game. |
| 58 | + * `S`: Kích hoạt kỹ năng chủ động của Paddle. |
| 59 | +--- |
| 60 | + |
| 61 | +## 🏗 Cấu trúc dự án (Thiết kế ECS & OOP) |
| 62 | + |
| 63 | +Dự án được xây dựng trên nền tảng game engine **FXGL**, tuân thủ chặt chẽ kiến trúc **Entity-Component-System (ECS)**, kết hợp với các nguyên tắc OOP (Đóng gói, Kế thừa, Đa hình) và các Mẫu thiết kế phần mềm (Design Patterns). |
| 64 | + |
| 65 | +### 1. Gói `systems` (Hệ thống & Vòng đời game) |
| 66 | +* **Bộ não của game:** Thay vì một lớp `GameManager` (God Class) khổng lồ, logic cốt lõi được chia nhỏ thành các hệ thống độc lập, kế thừa từ `InitialSystem`. |
| 67 | +* `Bounceverse.java`: Lớp chính điều phối các vòng đời của FXGL (`initGame`, `initPhysics`, `initUI`...). |
| 68 | +* `GameSystem`: Khởi tạo các thực thể ban đầu (gạch, paddle, bóng). |
| 69 | +* `PhysicSystem`: Định nghĩa toàn bộ logic va chạm trong game. |
| 70 | +* `InputSystem`: Quản lý toàn bộ input từ người chơi. |
| 71 | +* **Mẫu thiết kế Singleton:** Các lớp System và Manager (`LeaderboardManager`, `UserSettingsManager`) được triển khai theo mẫu Singleton (sử dụng inner class `Holder`) để đảm bảo chỉ có một thực thể duy nhất và có thể truy cập toàn cục. |
| 72 | + |
| 73 | +### 2. Gói `factory.entities` (Sản xuất Thực thể) |
| 74 | +* **Mẫu thiết kế Factory:** Logic tạo ra các đối tượng trong game (`Entity`) được tách biệt hoàn toàn khỏi logic chính. |
| 75 | +* Mỗi lớp (`BallFactory`, `BrickFactory`, `PaddleFactory`...) chịu trách nhiệm xây dựng một loại `Entity` cụ thể, đóng gói các components và thuộc tính cần thiết cho thực thể đó. |
| 76 | + |
| 77 | +### 3. Gói `components` (Hành vi & Thuộc tính) |
| 78 | +* **Trái tim của kiến trúc ECS:** Logic và dữ liệu của một `Entity` được định nghĩa bởi các `Component` mà nó chứa. |
| 79 | +* **`Behavior` (Hành vi):** Các lớp kế thừa từ `Behavior` định nghĩa những gì một `Entity` có thể **làm**. |
| 80 | + * `Attack.java`: Hành vi gây sát thương. |
| 81 | + * `HealthDeath.java`: Hành vi "chết" khi hết máu. |
| 82 | + * `PaddleShooting.java`: Hành vi bắn đạn của Paddle. |
| 83 | + * `Explosion.java`: Hành vi nổ của gạch. |
| 84 | +* **`Property` (Thuộc tính):** Các lớp kế thừa từ `Property` định nghĩa những **dữ liệu** mà một `Entity` có. |
| 85 | + * `Attributes.java`: Chứa các chỉ số như phòng thủ. |
| 86 | + * `Shield.java`: Chứa thông tin về các mặt được bảo vệ của gạch khiên. |
| 87 | + |
| 88 | +### 4. Gói `scenes` & `ui` (Giao diện & Trải nghiệm) |
| 89 | +* Chịu trách nhiệm về mọi thứ người chơi nhìn thấy. |
| 90 | +* `Menu.java`: Một lớp tùy chỉnh hoàn toàn, kế thừa `FXGLMenu`, để tạo ra menu chính và menu tạm dừng với phong cách riêng. |
| 91 | +* `ViewElement`: Lớp cơ sở cho các thành phần UI độc lập như `Hearts` (hiển thị mạng) và `HorizontalPositiveInteger` (hiển thị điểm số). |
| 92 | + |
| 93 | +--- |
| 94 | + |
| 95 | +### Yêu cầu: |
| 96 | +* Java JDK 24 (hoặc cao hơn). |
| 97 | +* IDE. |
| 98 | +* Gradle được tích hợp sẵn trong dự án. |
| 99 | + |
| 100 | +## 🛠 Công nghệ sử dụng |
| 101 | + |
| 102 | +* **Ngôn ngữ:** Java (Eclipse Temurin 24) |
| 103 | +* **Framework:** **FXGL (FX Game Library)** - một game engine xây dựng trên nền tảng JavaFX. |
| 104 | +* **Công cụ Build:** Gradle. |
| 105 | +* **IDE:** IntelliJ IDEA / Visual Studio Code. |
| 106 | + |
| 107 | +--- |
| 108 | + |
| 109 | +## 👨💻 Thành viên nhóm |
| 110 | +| Leader Mai Hải Thành | 24021627 | [@thnhmai06](https://github.com/thnhmai06) | |
| 111 | +| --------------------- | -------- | ------------------------------------------------ | |
| 112 | +| Trần Mạnh Tân | 24021619 | [@ManhTanTran](https://github.com/ManhTanTran) | |
| 113 | +| Nguyễn Huỳnh Anh Tuấn | 24021659 | [@huynhtuan372](https://github.com/huynhtuan372) | |
| 114 | + |
| 115 | +Phân chia công việc: |
| 116 | + |
| 117 | +| @thnhmai06 | @ManhTanTran | @huynhtuan372 | |
| 118 | +| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | |
| 119 | +| Đồng đảm nhiệm Power-up, thiết lập và quản lý các lớp cơ sở, quản lý chung project và hệ thống level. | Đảm nhiệm hệ thống vật lý, va chạm, Brick, Paddle, đồng đảm nhiệm và dẫn xuất Power-up. | Thiết kế UI và assets, các menu, leaderboard, xử lý input, hoàn thiện Ball. | |
| 120 | + |
| 121 | +Ball được thiết lập và phát triển ban đầu bởi minngoc123. |
0 commit comments