Bài toán yêu cầu xây dựng 1 game mà người chơi điểu khiển nhân vật trong một bản đồ 2D được lưu bởi mảng 2 chiều, trong đó mỗi ô tương ứng với một phần bản đồ với dạng khác nhau như: đá, cỏ, ..và các nhân vật như: quái vật, người chơi có thể di chuyển trên bản đồ.
Trang 1Phân công các thành viên trong nhóm
Họ và tên Công việc thực hiện Hoàn thành
-Phân tích thiết kế mã nguồn-Phát triển mã nguồn
-Làm báo cáo-Thuyết trình
100%
-Phân tích thiết kế mã nguồn-Phát triển mã nguồn
-Thiết kế bản đồ-Làm báo cáo
100%
Trang 2I. KHẢO SÁT, ĐẶC TẢ YÊU CẦU BÀI TOÁN
1 Mô tả yêu cầu bài toán
Bài toán yêu cầu xây dựng 1 game mà người chơi điểu khiển nhân vật trong một bản
đồ 2D được lưu bởi mảng 2 chiều, trong đó mỗi ô tương ứng với một phần bản đồ với dạng khác nhau như: đá, cỏ, và các nhân vật như: quái vật, người chơi có thể di chuyển trên bản đồ
Các nhân vật người chơi và kẻ thù có các thuộc tính , chỉ số về thể lực như: Attack, Speed, máu,…Người chơi có thể tấn công kẻ thù và dùng skill đặc biệt
Kẻ thù sẽ có thể phát hiện người chơi trong 1 phạm vi tầm nhìn nhất định, có thể đi theo tấn công người chơi
Để chiến thắng, người chơi cần tiêu diệt hết kẻ thù theo từng màn Game được chia thành 4 màn, theo độ tăng của màn thì địa hình bản đồ sẽ càng khó, nhiều kẻ thù hơn nên đòi hỏi người chơi phải tập trung cao và có kĩ năng chơi tốt để có thể giành chiến thắng Trong mỗi màn người chơi có thể tăng chỉ số nhân vật bằng cách phá các hộp, thùng trên đường và nhặt các bình thuốc
2 Nội dung đã cải tiến
Trang 3Bản đồ
Bản đồ đơn giản, tẻ nhạt, địa hình bằng phẳng, ít kẻ thù
Bản đồ địa hình khó dần qua từng màn, nhiều quái vật và bẫy hơn, đòi hỏi người chơi có kỹ năng chơi tốt hơn
Di chuyển Người chơi có thể di chuyển sang
trái, phải, nhảy chéo trái, chéo
phải.
Người chơi có thể di chuyển sang trái, phải, nhảy chéo trái, chéo phải.Người chơi có thể tăng tốc khi nhấnnút E
Số màn 3 màn với địa hình gần giống
- Bản đồ được được tạo thành bằng các lấy các ô 32x32 từ img lớn(Hình 1) Sau
đó vẽ bản đồ theo ý muốn của mình bằng phần mềm GIMP
Trang 4Hình 1 outside
- Về player và kẻ thù, menu được xây dựng dựa trên các hình ảnh có sẵn trên youtube Nhóm em sử dụng các tấm ảnh dạng spritesheet để tạo ra các animation chuyển động
Hình 2 Player_Sprites
Trang 5Hình 3 Crabby_Sprites
Hình 4 Objects_Sprites
Trang 6Hình 5 Potion_sprites
Hình 6 Menu
Hình 7 Button_menu
2. Biểu đồ gói và biểu đồ lớp
2.1 Giới thiệu hệ thống các package
● entities : chứa class để tạo thành các thực thể động như: người chơi, kẻ thù,
Trang 7● Gamestates: Mô tả, định dạng trạng thái của game như đang chơi hay đang sử dụng mục menu…
● Inputs: package này xử lí đầu vào từ bàn phím và thao tác với chuột
● levels: package chứa các class để tạo thành bản đồ của game
● main: là package chứa class Main và class GamePanel quản lí toàn bộ các trạng thái, hành động, hình ảnh, mọi thứ liên quan về game
● objects: chứa các class để tạo thành đồ vật trong game như hộp, thùng, bình thuốc, …
● ui: chứa các class tạo các giao diện menu, chọn chế độ chơi, các button,…
● utilz: Chứa các class và interface hỗ trợ các class khác thực hiện công việc 1 cách dễ dàng hơn, như helpmethods, giúp vẽ ảnh qua tên file như LoadSave2.2 Biểu đồ lớp
Trang 83. Chi tiết các lớp
3.1 Class Crabby
Trang 9Đây là lớp con kế thừa từ lớp Enemy, dùng để tạo hitbox và attackbox của quái vật, giúp xử lý va chạm và vùng tấn công của quái vật.
+ Crabby(float x, float y) : Vẽ ra quái vật có chiều cao, độ rộng theo đơn vị pixel , khung hitbox và attackbox của quái vật
Trang 10+ initAttackBox() : Dùng để tạo vùng tấn công của quái vật, nếu người chơi trong vùng này sẽ bị chịu sát thương.
Trang 11+ updateAttackBox(): Cập nhật lại vùng tấn công của quái vật.
+ updateBehavior(int[][] lvlData, Player player) : Dùng để cập lại hành vi của quái vậttuỳ thuộc theo từng trạng thái của quái vật
Trang 12+ flipX(), flipW(): Dùng để xử lý logic lật ảnh quái vật lúc quái gặp tường và quay đầu trong hành vi Patrol(tuần tra).
3.2 Class Enemy:
Đây là lớp cha quan trọng để cho các lớp con quái vật có thể kể kế thừa lại Trong class này cho biết trạng thái của quái vật, hướng di chuyển của nhân vật, quái vật có còn tồn tại, Một số phương thức quan trọng như:
Trang 13+ move(int[][] lvlData): Giúp hitbox của quái vật có thể di chuyển tương ứng với quái, nếu có thể di chuyển( không vướng vật cản và không phải là vực) thì quáivật sẽ di chuyển, nếu vướng vật cản thì quái vật sẽ đổi hướng ngược lại
Trang 14+ changeWalkDir():Hàm giúp đảo ngược chiều đi của quái vật
Trang 15+ canSeePlayer(int[][] lvlData, Player player):Kiểm tra xem player có nằm trong tầm nhìn của quái vật hay không
Trang 16+ isPlayerInRange(Player player):Kiểm tra xem người chơi có nằm trong vùng quái vật kiểm soát
Trang 17+ isPlayerCloseForAttack(Player player):Kiểm tra xem người chơi có nằm trong vùng tấn công của quái vật không
Trang 18+ hurt(int amount): Trừ máu của quái vật khi bị người chơi tấn công, chuyển trạng thái của quái vật khi quái vật chết hoặc bị đánh
Trang 19+
Trang 20Logic cho hành vi của quái vật để nhận diện khi người chơi khi trong phạm vi
có thể tấn công
Trang 22bắt đầu game thì sẽ cập nhật vị trí của quái vật kiểm tra xem quái vật có đang trên không khí để cho quái vật rơi xuống sàn Khi ở dưới sàn thì quái vật sẽ chuyển sang trạng thái IDLE rồi chuyển luôn sang trạng thái RUNNING trong lúc quái vật đang RUNNING tuần tra nếu phát hiện người chơi trong vùng kiểm soát (isPlayerInSight) thì nó sẽ di chuyển đến đến gần nhân vật(move towards player), Đến một khoảng cách nhất định quái vật sẽ kiểm tra xem nhânvật có đủ gần để chuyển sang trạng thái tấn công (isPlayerInRang) nếu không thì tiếp tục di chuyển đến lại gần nhân vật Khi trạng thái ATTACKING được kích hoạt thì quái vật sẽ thực hiện animation tấn công
Trang 233.3 Class Entity:
Đây là lớp cha quan trọng để cho các lớp con thực thể động như: người chơi, kẻ thù
kế thừa Trong lớp này, ngoài những phương thức cơ bản như getter, setter thì nhóm
em xây dựng các thuộc tính liên quan đến tọa độ của các object, các biến lưu hoạt ảnh, biến đếm, …Một số phương thức quan trọng như:
+ initHitbox(int width, int height): vẽ hitbox thực thể
+ getState(): hàm get trạng thái
+ drawAttackBox( ): hàm vẽ box tấn công
Trang 243.4 Class player:
Là lớp con biểu tượng cho người chơi được kế thừa từ lớp cha Entity
+ update( ): cập nhật trạng thái của người chơi như: thanh máu, vị trí và cập nhật hoạt ảnh
+ setAnimation( ): từ trạng thái hiện tại của người chơi set lại hoạt ảnh của nhân vật
+ loadAnimations( ): Xử lý việc tạo hiệu ứng chuyển động cho nhân vật khi đứng im, di chuyển, tấn công
+ checkAttack(): Kiểm tra xem nhân vật đã gây sát thương chưa
+ updateAttackBox(): Thay đổi vùng tấn công của nhân vật khi nhân vật di chuyển, nhảy
+ updateHealthBar(): Cập nhật thanh máu của người chơi
+ drawUI(Graphics g): Vẽ thanh máu và thanh năng lượng cho nhân vật
+ updatePos(): Thay đổi vị trí của nhân vật khi di chuyển
+ resetAll( ): đưa nhân vật về trạng thái IDLE, thanh máu max
3.5 Class Menu
+ loadBackground(): cài đặt chiều cao, chiều rộng cho background và chiều rộng, chiều cao cho nút option
+ loadButton(): khởi tạo các nút lựa chọn cho menu
+ update(): cập nhật lại menu và option
+ draw(Graphic g): vẽ bảng menu và nút option của game
+ resetButtons: đưa các nút về trạng thái ban đầu
+ keyPressed(KeyEvent e): nhấn giữ phím để bắt đầu chơi game
+ keyReleased(KeyEvent e): thả phím
Trang 253.6 Class Playing:
loadNextLevel(): khởi tạo một cấp chơi mới tiếp theo khó hơn cấp cũ
loadStartLevel(): khởi tạo cấp độ của bắt đầu của các đối tượng
calcLvOffset(): tính toán cấp độ chơi
initClasses(): mở rộng quy mô của người chơi
update(): cập nhật lại trạng thái
checkCloseToBorder(): kiểm tra độ gần với đường biên
draw(Graphics g): vẽ toàn bộ các phần như background, layout, nhân vật, map drawClouds(Graphic g): Vẽ ra background mây nền đằng sau khung trò chơiresetAll(): Thực hiện việc reset các giá trị boolean, quái vật, người chơi và vật phẩm khi qua màn mới
setGameOver(), setLevelCompleted(boolean LevelCompleted),
setMaxLvlOffset(int lvlOffset):Các setter để thay đổi các giá trị boolean hỗ trợ logic của việc trò chơi có hoàn thành hay thất bại
Trang 26unpauseGame(): Không dừng trò chơi
Và các setter và getter khác
3.7 Class LevelManager:
Trang 27Bản đồ là một phần quan trọng trong game, nó là nơi để các nhân vật: người chơi, quái vật, các đối tượng thực hiện hành vi của mình Để tạo và quản lí bản đồ thì ta cầntạo ra class LevelManager Lớp này sẽ quản lí về hình ảnh bản đồ theo từng màn Nhóm em tạo 1 mảng 2 chiều, mỗi vị trí trong mảng sẽ tương ứng với 1 ô trong map, mỗi phần tử Để tạo hình ảnh các ô, ta thông qua các phương thức:
+ loadNextLevel(): Nếu còn bản đồ sẽ hiển thị ra bản đồ tiếp theo, nếu không còn sẽ hiển thị menu, gamestate sẽ chuyển thành MENU
+ buildAllLevers(): Lưu toàn bộ map của tất cả các màn chơi vào một mảng BufferedImage
+ importOutsideSprites(): phương thức lấy hình ảnh địa hình bên ngoài từ 1 ảnh outside được chia thành 48 ô (4x12)
+ draw(Graphics g, int lvlOffset): vẽ hình ảnh bản đồ
+ update(): cập nhật bản đồ
+ getCurrentlLevel(): lấy Level hiện tại
Trang 28+ getAmountOfLevels(): số lượng level
3.8 Class GameObject:
Đây là 1 lớp cha quan trọng để cho các lớp con liên quan đến object như:
container(thùng, hộp), potion(thuốc máu và sát thương), spike kế thừa Trong lớp này,ngoài những phương thức cơ bản như getter, setter thì nhóm em xây dựng các thuộc tính liên quan đến tọa độ của các object, các biến lưu hoạt ảnh, biến đếm, …Một số phương thức quan trọng như:
+ updateAnimationTick() : cập nhật hoạt ảnh của objects: box, barrel, potion.+ reset(): thiết lập lại trạng thái active, doAnimation của các object
Trang 29+ drawHitbox(Grapics g, int xLvOffset): vẽ Hitbox của object.
4 Một số kĩ thuật hướng đối tượng được sử dụng
+ Tính đóng gói: Hầu hết các thuộc tính của các class đều được khai báo với giới hạn truy cập private, đồng thời có các getter, setter tương ứng
+ Tính kế thừa: Được thể hiện rõ qua việc các class như Player, Enemy kế thừa từclass Entity, hay là các class Crabby kế thừa từ Enemy
+ Tính đa hình: Được thể hiện qua việc các lớp con kế thừa từ lớp cha, nhưng mỗi phương thức ở lớp con lại có các xử lý khác nhau
+ Tính trừu tượng: Thể hiện qua 1 số class kế thừa từ các interface được định nghĩa sẵn trong Java như là Runnable, KeyListener
III XÂY DỰNG CHƯƠNG TRÌNH MINH HỌA
1. Kết quả chương trình minh họa
● Kết quả đạt được:
- Sau một thời gian làm việc nhóm phát triển game, nhóm đã xây dựng được 1 chương trình và đóng gói thành 1 game 2D đơn giản
● Thông tin về Game:
- Tên game: Game PIRATE
Trang 30- Xác định va chạm vào vật tĩnh và động
2. Giao diện game
❖ Giao diện menu:
Bao gồm các nút bấm là : PLAY ( bắt đầu chơi game), OPTIONS và QUIT( thoát game)
❖ Giao diện màn 1
Trang 31❖ Giao diện màn 2
Trang 32❖ Giao diện màn 3
❖ Giao diện màn 4
❖ Giao diện khi thua game
Trang 33▪ Nhược điểm: Chưa cải tiến được nhiều, số lượng nhân vật còn ít, bản đồ còn đơn giản Mặt khác, do thời gian bị hạn chế nên code chưa được tối ưu, vẫn còn xuất hiện nhiều lỗi nhỏ.
▪ Sau khi hoàn thành bài tập lớn này, chúng em đã học được rất nhiều điều về phát triểnphần mềm và tư duy lập trình hướng đối tượng Vì là sản phẩm đầu tiên nên các thành viên đều hăng hái học hỏi
Trang 34▪ Nhóm em sẽ cố gắng hoàn thiện và phát triển game hơn nữa trong tương lai Nhóm
sẽ khắc phục những nhược điểm và cải tiến thêm nữa để game được sinh động và hấp dẫn người chơi hơn
Trang 35IV KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Trong quá trình thực hiện bài tập lớn này, chúng em đã học được rất nhiều thứ Đầutiên, chúng em đã vận dụng, làm quen với các kiến thức đã được học trong môn lậptrình hướng đối tượng Theo sau, chúng em biết thêm được các kiến thức mới về ngônngữ lập trình java Đặc biệt, chúng em được rèn luyện tư duy, tìm hiểu sâu về lập trìnhhướng đối tượng, nâng cao khả năng tự học tự tìm tòi các kiến thức mới Chúng emcũng đã biết cách làm thế nào để làm việc nhóm hiệu quả hơn
Một vài hướng phát triển trong tương lai:
- Thêm nhiều objects hơn cho game
- Tạo thêm nhiều hình ảnh nhân vật để người chơi có thể lựa chọn nhân vật
- Một nhân vật sẽ có nhiều mạng và có nhiều công cụ chiến đấu hơn
- Tạo thêm bản đồ sinh động hơn, chân thật, hấp dẫn hơn
- Thêm nhiều dạng kẻ thù với nhiều skill khác nhau
- Có thể chơi theo team
- Sửa chữa những lỗi còn sót lại trong game
V TÀI LIỆU THAM KHẢO
1, Slide bài giảng môn lâp trình hướng đối tượng của thầy Nguyễn Hoàng Anh
2 Youtube Kaarin Gaming
Link youtube: https://www.youtube.com/@KaarinGaming/playlists