Skip to content
This repository was archived by the owner on Dec 24, 2025. It is now read-only.

Commit 652a762

Browse files
authored
Merge pull request #28 from CodeStormOOP/dev
Update to version 1.1.0
2 parents b24e6a9 + e263374 commit 652a762

233 files changed

Lines changed: 9225 additions & 1341 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/buildRelease.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
- name: Build release
2222
run: |
2323
chmod +x gradlew
24-
./gradlew clean buildRelease
24+
./gradlew clean release
2525
2626
- name: Upload to Release assets
2727
uses: softprops/action-gh-release@v2

.gitignore

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ target/
99

1010
### IntelliJ IDEA ###
1111
.idea/
12-
!.idea/misc.xml
1312
*.iws
1413
*.iml
1514
*.ipr
@@ -53,4 +52,5 @@ bin/
5352
**/cache/
5453
**/prefs/
5554

56-
### Workspace
55+
### Workspace
56+
/settings.*.toml

.idea/misc.xml

Lines changed: 0 additions & 10 deletions
This file was deleted.

.run/build.run.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="build" type="GradleRunConfiguration" factoryName="Gradle" folderName="build">
3+
<ExternalSystemSettings>
4+
<option name="executionName" />
5+
<option name="externalProjectPath" value="$PROJECT_DIR$" />
6+
<option name="externalSystemIdString" value="GRADLE" />
7+
<option name="scriptParameters" value="" />
8+
<option name="taskDescriptions">
9+
<list />
10+
</option>
11+
<option name="taskNames">
12+
<list>
13+
<option value="build" />
14+
</list>
15+
</option>
16+
<option name="vmOptions" />
17+
</ExternalSystemSettings>
18+
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
19+
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
20+
<DebugAllEnabled>false</DebugAllEnabled>
21+
<RunAsTest>false</RunAsTest>
22+
<method v="2" />
23+
</configuration>
24+
</component>

.run/bytecode.run.xml

Lines changed: 0 additions & 25 deletions
This file was deleted.

.run/release.run.xml

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
<component name="ProjectRunConfigurationManager">
2-
<configuration default="false" name="release" type="GradleRunConfiguration" factoryName="Gradle" folderName="build">
3-
<ExternalSystemSettings>
4-
<option name="executionName"/>
5-
<option name="externalProjectPath" value="$PROJECT_DIR$"/>
6-
<option name="externalSystemIdString" value="GRADLE"/>
7-
<option name="scriptParameters" value=""/>
8-
<option name="taskDescriptions">
9-
<list/>
10-
</option>
11-
<option name="taskNames">
12-
<list>
13-
<option value="buildRelease"/>
14-
</list>
15-
</option>
16-
<option name="vmOptions"/>
17-
</ExternalSystemSettings>
18-
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
19-
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
20-
<DebugAllEnabled>false</DebugAllEnabled>
21-
<RunAsTest>false</RunAsTest>
22-
<method v="2"/>
23-
</configuration>
2+
<configuration default="false" name="release" type="GradleRunConfiguration" factoryName="Gradle" folderName="build">
3+
<ExternalSystemSettings>
4+
<option name="executionName" />
5+
<option name="externalProjectPath" value="$PROJECT_DIR$" />
6+
<option name="externalSystemIdString" value="GRADLE" />
7+
<option name="scriptParameters" value="" />
8+
<option name="taskDescriptions">
9+
<list />
10+
</option>
11+
<option name="taskNames">
12+
<list>
13+
<option value="release" />
14+
</list>
15+
</option>
16+
<option name="vmOptions" />
17+
</ExternalSystemSettings>
18+
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
19+
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
20+
<DebugAllEnabled>false</DebugAllEnabled>
21+
<RunAsTest>false</RunAsTest>
22+
<method v="2" />
23+
</configuration>
2424
</component>

README.md

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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+
![Preview](https://s12.gifyu.com/images/b9Mf5.png)
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.

build.gradle

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,24 @@ dependencies {
2323
implementation 'com.github.almasb:fxgl:21.1'
2424
implementation 'com.google.guava:guava:33.5.0-jre'
2525
implementation 'com.moandjiezana.toml:toml4j:0.7.2'
26+
implementation 'com.google.guava:guava:33.5.0-jre'
2627
implementation 'com.google.auto.service:auto-service-annotations:1.1.1'
2728
annotationProcessor 'com.google.auto.service:auto-service:1.1.1'
2829
}
2930

3031
application {
3132
mainClass = 'com.github.codestorm.bounceverse.Bounceverse'
3233
applicationDefaultJvmArgs = [
33-
"--enable-native-access=javafx.graphics"
34+
"--enable-native-access=javafx.graphics",
35+
"--enable-native-access=javafx.media",
36+
'-Dprism.forceGPU=true',
37+
'-Dmedia.gpu.decoder=true'
3438
]
3539
}
3640

3741
defaultTasks('run')
3842

39-
tasks.register('buildRelease', Jar) {
43+
tasks.register('release', Jar) {
4044
group = 'build'
4145
description = "Test this project and assemble a release JAR file."
4246

@@ -63,16 +67,24 @@ javafx {
6367
}
6468

6569
spotless {
66-
enforceCheck = false
67-
format 'misc', {
68-
target '*.gradle', '.gitattributes', '.gitignore'
70+
enforceCheck = false
6971

70-
trimTrailingWhitespace()
71-
leadingSpacesToTabs()
72-
endWithNewline()
73-
}
74-
java {
75-
googleJavaFormat().aosp().reflowLongStrings()
76-
formatAnnotations()
77-
}
72+
format 'misc', {
73+
target '*.gradle', '.gitattributes', '.gitignore'
74+
trimTrailingWhitespace()
75+
endWithNewline()
76+
}
77+
78+
java {
79+
target 'src/**/*.java'
80+
targetExclude 'src/**/libs/**/*';
81+
82+
googleJavaFormat('1.17.0')
83+
.aosp()
84+
.reorderImports(true)
85+
.reflowLongStrings(true)
86+
.formatJavadoc(true)
87+
formatAnnotations()
88+
removeUnusedImports()
89+
}
7890
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
#
44
name=Bounceverse
55
group=com.github.codestorm
6-
version=1.0.0-dev
6+
version=1.1.0-dev

0 commit comments

Comments
 (0)