Trò chơi này yêu cầu người chơi phải xây dựng đội hình, nâng cấp các nhân vật và kỹ năng hợp lý cùng với khả năng điều binh khiển tướng để có thể đối phó với các đợt tướng của kẻ địch..
GIỚI THIỆU ĐỀ TÀI
Phân tích đánh giá các hướng nghiên cứu đã có của các tác giả trong và ngoài nước
- Trong nghiên cứu về trò chơi chiến thuật thủ thành, nhiều tác giả đã tập trung vào việc phát triển hệ thống trí tuệ nhân tạo cho đối thủ, nhằm tạo ra hành vi thông minh và thách thức Các phương pháp như các thuật toán tìm kiếm thông minh, học máy và học sâu đã được áp dụng để cải thiện khả năng quyết định và tương tác của đối thủ
- Các nghiên cứu cũng đã chú trọng vào thiết kế yếu tố gameplay và hệ thống quản lý tài nguyên trong trò chơi Các phương pháp như việc tạo ra cơ chế xây dựng/phòng thủ đa dạng, cân bằng khó khăn và thúc đẩy sự sáng tạo của người chơi đã được khám phá để cung cấp trải nghiệm tốt hơn
- Một số nghiên cứu đã nghiên cứu về trải nghiệm người chơi, bao gồm thiết kế giao diện người chơi hấp dẫn, cung cấp phản hồi tương tác và tạo ra môi trường sống động Các phương pháp như thiết kế âm thanh, đồ họa, hiệu ứng hình ảnh và giao diện người dùng đáp ứng đã được sử dụng để tăng cường trải nghiệm người chơi.
Vấn đề còn tồn tại
- Mặc dù đã có nhiều nghiên cứu về trò chơi chiến thuật thủ thành, tuy nhiên, vẫn còn một số vấn đề chưa được giải quyết đầy đủ Ví dụ, khả năng thích nghi của đối thủ với hành động của người chơi có thể chưa được đảm bảo một cách tối ưu Cần có sự nghiên cứu để tạo ra hệ thống trí tuệ nhân tạo thông minh và linh hoạt, có khả năng thích nghi với chiến thuật và tương tác của người chơi
- Một vấn đề khác là việc tạo ra trải nghiệm người chơi sâu sắc và đa dạng Cần nghiên cứu và phát triển các phương pháp để tạo ra yếu tố gameplay và cơ chế
4 xây dựng/phòng thủ đa dạng, cung cấp sự sáng tạo và lựa chọn cho người chơi, từ đó tăng cường sự hấp dẫn và tái chơi của trò chơi
- Một khía cạnh khác cần được nghiên cứu là tương tác giữa người chơi và trò chơi Cần xem xét các phương pháp để tạo ra giao diện người chơi thân thiện, tương tác tự nhiên và phản hồi đáp ứng, để tăng cường sự tham gia và hứng thú của người chơi.
Vấn đề cần tập trung, nghiên cứu giải quyết
- Cải thiện trí tuệ nhân tạo của đối thủ, bằng cách phát triển các thuật toán thông minh và linh hoạt, có khả năng thích nghi với hành động của người chơi
- Xây dựng yếu tố gameplay và cơ chế xây dựng/phòng thủ đa dạng và sáng tạo, đồng thời đảm bảo sự cân bằng và khó khăn thích hợp
- Tạo ra trải nghiệm người chơi sâu sắc và đa dạng, thông qua thiết kế giao diện người chơi hấp dẫn và cung cấp phản hồi tương tác
- Nghiên cứu và phân tích hành vi người chơi và tương tác, để hiểu rõ hơn về mong đợi, sở thích và phản hồi của người chơi, từ đó tạo ra trải nghiệm tốt hơn và tùy chỉnh trò chơi cho từng người chơi
Lý do chọn đề tài:
- Trong thời đại hiện nay, những trò chơi mới xuất hiện mỗi ngày nhằm đáp ứng được các nhu cầu giải trí của con người, đặc biệt là đối với giới trẻ Trong đó, những trò chơi mang tính chiến thuật dù không mới, nhưng cũng không dễ dàng bị phai mờ trong lòng các game thủ, điển hình như Dota, Liên minh huyền thoại, Clash of Clans, …
- Nhận thấy tiềm năng đó, nhóm em đã lựa chọn đề tài : “Xây dựng game chiến thuật thủ thành” làm đề tài cho Đồ án 2, với những lý do chính sau:
+ Sự phổ biến của thể loại trò chơi chiến thuật: Trò chơi chiến thuật đã thu hút một lượng lớn người chơi và có một cộng đồng game thủ đam mê Đề tài này cho phép nhóm em tham gia vào một lĩnh vực đang phát triển và có tiềm năng kinh doanh trong tương lai
+ Thách thức và sáng tạo: Trò chơi chiến thuật thủ thành yêu cầu người chơi phải xây dựng chiến lược và quản lý tài nguyên để bảo vệ thành trì Điều này tạo ra một thách thức đối với người chơi và đòi hỏi sự sáng tạo trong việc tìm kiếm giải pháp tốt nhất
+ Khả năng phát triển kỹ năng lập trình: Xây dựng một trò chơi chiến thuật thủ thành yêu cầu các kỹ năng lập trình và xử lý logic phức tạp Đề tài này sẽ giúp nhóm em rèn kỹ năng lập trình của mình và khám phá các khía cạnh kỹ thuật khác nhau trong phát triển trò chơi
+ Tiềm năng thương mại: Trò chơi chiến thuật thủ thành có tiềm năng thương mại lớn Nếu phát triển thành công một trò chơi hấp dẫn và chất lượng, nhóm em khả năng sẽ phát hành nó trên các nền tảng khác nhau và thu hút một lượng người chơi đáng kể, từ đó tạo ra thu nhập riêng
+ Sự hài lòng của người chơi: Trò chơi chiến thuật thủ thành thường mang lại sự hài lòng và thỏa mãn cho người chơi nhờ việc chinh phục và mở khóa những màn chơi mới, từ đó tạo ra một trải nghiệm chơi game độc đáo và thú vị, và đó là một điểm mạnh trong việc thu hút và giữ chân người chơi
- Mục đích của đề tài trò chơi chiến thuật thủ thành có thể bao gồm những điểm sau:
+ Tạo ra một trò chơi hấp dẫn và thú vị: Mục đích chính là phát triển một trò chơi chiến thuật thủ thành có giao diện hấp dẫn, cung cấp trải nghiệm chơi game thú vị và đáp ứng nhu cầu giải trí của người chơi
+ Khám phá và áp dụng các kỹ thuật lập trình: Mục đích là rèn kỹ năng lập trình và khám phá các kỹ thuật phát triển trò chơi như xử lý đồ họa, trí tuệ nhân tạo, quản lý tài nguyên
+ Đưa ra một giải pháp thách thức và cân bằng: Mục đích là tạo ra một hệ thống trò chơi có trí độ khó cao, đồng thời đảm bảo sự cân bằng và thách
6 thức cho người chơi Điều này tạo ra một trải nghiệm chơi game thú vị và độc đáo
+ Khai thác tiềm năng thương mại: Mục đích là phát triển một trò chơi có tiềm năng thương mại và khả năng thu hút người chơi Điều này có thể tạo ra cơ hội kinh doanh và trở thành một nguồn thu nhập từ việc phát hành và bán trò chơi trên các nền tảng khác nhau Đối Tượng:
- Đối tượng nhắm đến của trò chơi chiến thuật thủ thành có thể là:
+ Game thủ yêu thích thể loại chiến thuật: Trò chơi này hướng đến những người chơi có niềm đam mê với trò chơi chiến thuật, yêu thích việc xây dựng đội hình và quản lý các chiến lược trong môi trường thủ thành + Người chơi muốn thử thách trí tuệ và tư duy chiến thuật: Trò chơi chiến thuật thủ thành thường đòi hỏi người chơi phải suy nghĩ logic, đưa ra quyết định chiến lược và xử lý tình huống khó khăn Những người chơi muốn thử thách trí tuệ và tư duy chiến thuật sẽ là đối tượng hướng đến
- Phạm vi nghiên cứu của đồ án trò chơi chiến thuật thủ thành có thể bao gồm những khía cạnh sau:
+ Thiết kế và phát triển trò chơi: Nghiên cứu có thể tập trung vào quá trình thiết kế và phát triển trò chơi, bao gồm việc xác định các yếu tố gameplay, hệ thống quản lý tài nguyên, cơ chế xây dựng và phòng thủ, giao diện người chơi, hệ thống trí tuệ nhân tạo cho đối thủ, và các yếu tố khác liên quan đến trò chơi
+ Đồ họa: Trò chơi sử dụng đồ họa dễ nhìn, do nhóm tự thiết kế, vẽ và phát triển
CƠ SỞ LÍ THUYẾT
Godot là gì?
- Godot là một công cụ phát triển trò chơi miễn phí và mã nguồn mở được phát triển bởi một cộng đồng lập trình viên toàn cầu Nó cung cấp một môi trường phát triển tích hợp (IDE) và một bộ công cụ phát triển game mạnh mẽ hỗ trợ cho việc tạo ra các game chạy đa nền tảng.
Tại sao nên sử dụng Godot
- Godot có nhiều điểm mạnh Đầu tiên, nó hỗ trợ phát triển trò chơi đa nền tảng Bạn có thể phát triển trò chơi cho nhiều hệ điều hành và nền tảng như Windows, macOS, Linux, iOS, Android và cả các nền tảng web thông qua HTML5 [1]
- Thứ hai, Godot cung cấp một ngôn ngữ lập trình chủ đạo là GDScript, một ngôn ngữ tương tự Python, dễ học và dễ sử dụng Ngoài ra, Godot cũng hỗ trợ
9 các ngôn ngữ khác như C#, C++ Điều này cho phép bạn lựa chọn ngôn ngữ phù hợp với kỹ năng và sở thích của mình
- Thứ ba, Godot có một bộ công cụ mạnh mẽ cho việc phát triển trò chơi Nó bao gồm một trình chỉnh sửa hình ảnh và âm thanh tích hợp, cùng với các trình chỉnh sửa văn bản và trình tạo animation Nó cũng có một bộ khung đồ họa 2D và 3D mạnh mẽ, với khả năng xử lý vật lý, xử lý hình ảnh và âm thanh
- Cuối cùng, Godot được cộng đồng hỗ trợ rất nhiệt tình Có rất nhiều tài liệu, ví dụ, mã nguồn mở và các nguồn tài nguyên khác có sẵn để bạn tham khảo và sử dụng Ngoài ra, cộng đồng Godot rất năng động và thân thiện, với diễn đàn và nhóm trò chuyện trực tuyến để trao đổi ý tưởng, hỏi đáp và chia sẻ kinh nghiệm.
Nghiên cứu và áp dụng Godot trong đồ án
- Hầu hết code được viết trong đồ án này sử dụng GDScript và một ít sử dụng Godot's shading language cho một số hiệu ứng đặc biệt trong game Code này được dùng chung với các loại node với những tính năng riêng biệt trong Godot
- Đồ án tận dụng các thành phần quan trọng trong godot như scene, node, script và các tính năng nâng cao hơn như physics engine, animation player, shaders
- SilentWolf là một chương trình dành cho Godot miễn phí dùng như một server để lưu trữ dữ liệu trên Internet SilentWolf được chia làm 3 phần dữ liệu chính: + Điểm và bảng xếp hạng (Scores and leaderboards): Nó gồm bảng xếp hạng trực tuyến nâng cao dành cho nhiều trường hợp Bạn có thể thiết lập bảng xếp hạng trò chơi của bạn trong vài phút và tùy chỉnh bảng xếp hạng theo nhu cầu của bạn: Chỉ lưu điểm số cao nhất cho mỗi người chơi, đặt lại bảng xếp hạng của bạn vào các khoảng thời gian cụ thể, thêm dữ liệu điểm số,
+ Tài khoản người chơi (Player accounts): Giúp người chơi có thể đăng ký, đăng nhập và đăng xuất khỏi trò chơi Bạn có thể tùy chọn thêm xác minh email, đặt lại mật khẩu, …
+ Dữ liệu người chơi và trạng thái trò chơi (Player data and game state): Lưu trữ mọi dữ liệu về người chơi hoặc trạng thái trò chơi của bạn
+ Sử dụng SilentWolf để liên tục lưu trữ, cập nhật và xóa bất kỳ loại dữ liệu nào (như kho đồ, số liệu thống kê, thành tích, ) về người chơi hoặc trạng thái chung của trò chơi của bạn trong vài phút Truy xuất nó trong trò chơi một cách dễ dàng [2]
- Steamworks là bộ công cụ hỗ trợ phát triển game khi phát hành game qua Steam [3] Steamworks cung cấp nhiều chức năng khác nhau như cập nhật phiên bản của game trên Steam, tra cứu tài khoản Steam, hỗ trợ kết nối người chơi kiểu P2P hoặc client-server, hệ thống phòng chờ, chat, tìm trận đấu, …
- Steamworks cần một Steam id để có thể sử dụng dịch vụ Steam id này cần phải được mua để có thể sử dụng cho game mà mình phát hành trên Steam, nhưng Steamworks có một Steam id công khai dùng cho với việc kiểm thử game chưa được phát hành Nhóm em sử dụng Steam id này để phát triển game
- GodotSteam là một module dùng để tích hợp tính năng của Steamworks vào trong Godot, việc này giúp cải thiện trải nghiệm của lập trình viên trong việc phát triển game của mình trên Godot sử dụng Steamworks [4]
- Các cú pháp để sử dụng Steamworks SDK (bằng ngôn ngữ C++) được chuyển hóa thành cú pháp quen thuộc của ngôn ngữ GDScript, vì vậy lập trình viên không cần phải chuyển đổi giữa hai ngôn ngữ để sử dụng Steamworks
- Nhóm em sử dụng GodotSteam để sử dụng các tính năng như tra cứu tài khoản Steam, phòng chờ, chat, P2P để phát triển game
- Godot Native Bullets là một plugin dùng cho việc bắn đạn một cách tối ưu ít tốn tài nguyên Đây là plugin thích hợp cho game cần bắn đạn với số lượng lớn (hàng trăm hay đến hàng nghìn viên đạn cùng xuất hiện trong cùng một lúc trên màn hình) [5]
- Chúng em sử dụng plugin này cho việc xử lý tạo và bắn và tiêu diệt đạn và ngoài ra còn sửa đổi plugin nhằm làm cho đạn hoạt động phù hợp với môi trường của game
- Game có ba loại tiền tệ chính:
- Tiền trong trận (₵): Tiền dùng trong trận đấu để triệu hồi nhân vật Tiền này không có tác dụng bên ngoài trận đấu
- Xương: Phần thưởng sau khi thắng trận, có thể dùng để nâng cấp hoặc mở khóa nhân vật, kỹ năng hay nội tại
- Thức ăn cho chó: tiền tệ đặc biệt Được dùng để mở khóa các loại nhân vật đặc biệt
Hệ thống Trận đấu đơn người chơi (Battle System):
- Đây là hệ thống trận đấu dành cho phiên bản offline của game, trong đó người chơi đánh với máy
- Hệ thống trận đấu đơn người chơi được lấy cảm hứng từ game mobile The Battle Cats, một tựa game trong đó người chơi triệu hồi mèo để đánh nhau với các sinh vật khác, nhưng được thay đổi để có tính đa dạng hơn, một trận đấu gồm có 7 yếu tố sau:
+ Thành trì (Thành Chó, Thành Mèo): Mỗi thành trì đều có một cột máu
(với số lượng máu nhất định) Nhiệm vụ của người chơi là giảm cột máu của phe địch (Thành Mèo) và bảo vệ thành của mình (Thành Chó) Trận đấu kết thúc khi cột máu của một trong hai thành trì giảm về 0
+ Đội hình: Trước khi trận đấu bắt đầu, người chơi chọn một đội hình gồm các nhân vật và kỹ năng phù hợp cho từng trận chiến Trong trận đấu, người chơi có thể triệu hồi nhân vật và kích hoạt kỹ năng để tấn công kẻ địch + Quân lính (quân lính phe ta và phe địch): Người chơi triệu hồi nhân vật đã có trong đội hình để tấn công các quân lính được triệu hồi bởi kẻ thù + Kỹ năng: Mỗi kỹ năng có một khả năng riêng biệt Người chơi có thể sử dụng kỹ năng để tạo lợi thế trong trận đấu
+ Ví tiền: Để triệu hồi quân lính, người chơi cần sử dụng tiền, tiền sẽ tăng theo thời gian trong trận đấu, sẽ có một lượng tiền tối đa mà Ví tiền có thể giữ, người chơi có thể tăng lượng tiền tối đa cũng như năng suất tạo tiền bằng cách nâng cấp Ví tiền
+ Nội tại: Nội tại là các thuộc tính liên quan đến trận đấu như số lượng tiền tối đa có thể giữ, năng suất tạo tiền, máu của Thành Chó, phần thưởng sau trận đấu, Nâng cấp nội tại sẽ tăng độ hiệu quả của các thuộc tính này + Boss: Boss là quân lính của kẻ địch nhưng có sức mạnh cao hơn rất nhiều so với các quân lính bình thường Ở một số màn đấu, khi máu của Thành Mèo giảm đến một mức nhất định, Boss phe địch sẽ được triệu hồi Boss sẽ xuất hiện duy nhất một lần trong suốt trận đấu
Battlefield (battlefield)
- Battlefield là tên của kiểu trận đấu dành cho trận đấu này, có các loại trận đấu như sau:
+ basic: Đây là kiểu trận đấu mặc định, bao gồm 1 Thành Mèo và 1 Thành Chó Người chơi sẽ thắng khi phá hủy Thành Mèo Đây là kiểu trận tương tự với game The Battle Cats mà nhóm chúng em lấy ý tưởng để làm game + shrine_maiden: Gồm 1 Thành Chó, 1 Thành Mèo và 1 Tori Người chơi phải phá hủy Tori thì mới có thể đánh Thành Mèo Thành Mèo ở kiểu trận đấu này là một ngôi đền lơ lửng trên không trung.
Power scale (power_scale)
- Power scale là một con số dùng để tăng hoặc giảm sức mạnh của toàn bộ kẻ địch, con số này sẽ được dùng để nhân cho sức tấn công và máu cơ bản của kẻ địch.
Instant spawns (instant_spawns)
- Instant spawns cho phép triệu hồi kẻ địch ngay trên trận đấu thay vì được triệu hồi từ Thành Mèo Gồm yếu tố sau:
+ id (String): Tên nhân vật kể địch (được sử dụng làm id để nhận biết các nhân vật)
+ position (float hoặc Array[float]): Vị trí của nhân vật trên trận đấu Nếu giá trị là float thì chỉ cập nhật tọa độ x của nhân vật
+ props (Dictionary): Thay đổi các giá trị mặc định của nhân vật như máu, tầm đánh, tốc độ di chuyển, … Mỗi key của Dictionary đại diện cho một thuộc tính của nhân vật, value của key bao gồm:
value (float): Giá trị thay thế, giá trị này sẽ thay thế giá trị có sẵn
scale (float): Tỉ lệ sức mạnh (tương tự như power_scale).
Spawn patterns (spawn_patterns)
- Spawn patterns gồm thông tin về những kẻ địch sẽ được triệu hồi trong trận đấu, mỗi kẻ địch đều sẽ có một dạng thông tin riêng, gồm những yếu tố sau:
+ id (String): Tên của nhân vật kẻ địch
+ duration (float): Thời gian chờ trước mỗi lần triệu hồi
+ delay (float): Thời gian chờ trước khi bắt đầu thực hiện việc triệu hồi đầu tiên
+ props (Dictionary): Thay đổi các giá trị mặc định của nhân vật.
Boss (bosses)
- Bosses là một mảng chứa các thông tin về các boss trong trận đấu, mỗi phần tử trong mảng có chứa những thông tin như sau:
+ health_at (Int): Khi máu của Thành Mèo giảm tới mức độ cho phép, trùm cuối sẽ được triệu hồi
+ name (String): Tên của nhân vật kẻ địch được sử dụng làm boss
+ buffs (Array[Dictionary]): Những thuộc tính mà boss sẽ được tăng sức mạnh như máu, tốc độ đánh, sát thương, … Mỗi phần tử gồm:
name (String): Tên thuộc tính muốn tăng sức mạnh
scale (float): Tỉ lệ sức mạnh (tương tự như power_scale)
value (float): Giá trị thay thế, giá trị này sẽ thay thế giá trị có sẵn + props (Dictionary): Thay đổi các giá trị mặc định của nhân vật Tương tự như buffs Các màn chơi mới được tạo cho phiên bản này của game sẽ sử dụng props thay cho buffs, các màn chơi cũ vẫn sử dụng buffs như bình thường.
Phương pháp truy cập dữ liệu trận đấu
- Để áp dụng các yếu tố này vào game, khi tạo một màn chơi mới, một file json sẽ được tạo đại diện cho trận đấu của màn chơi đó trong game, file json này sẽ chứa các thông tin nêu trên Trận đấu sẽ lấy thông tin trong file json đó để mà thiết lập trận đấu
Hình 2.4: Mẫu file json thiết lập trận đấu
- Bản đồ là thành phần quan trọng trong game, đây là nơi mà người chơi có thể chọn màn chơi mà họ muốn để chơi và thiết lập đội hình.
Các node màn chơi
- Bản đồ sẽ chứa các node mà người chơi có thể bấm vào, mỗi node tượng trương cho một màn chơi và sẽ chứa tên của màn chơi đó cùng với tên file json trận đấu
- Mỗi node có thể liên kết với một node khác là màn chơi trước và cũng có thể liên một node khác nữa là màn chơi tiếp theo Sự liên kết này sẽ được hiển thị bằng một được gạch nét đứt giữa hai node
Dãy các bảng tên
- Bản đồ ngoài ra còn chứa một loạt các bảng tên nằm ở góc trên của màn hình, các bảng tên này chứa tên của các màn chơi Khi người chơi chọn một màn chơi nào thì bảng tên cho màn chơi đó sẽ được di chuyển ra giữa màn hình nhằm cho người chơi biết tên màn chơi mà họ đã chọn.
Các nút định hướng
- Bản đồ chứa một số nút dẫn đến các màn hình khác trong game:
+ Nút tấn công: Nút này sẽ dẫn người chơi đến màn hình trận dấu đã chọn + Nút đội hình: Nút này sẽ dẫn người chơi đến màn hình thiết lập trận đấu + Nút quay lại: Nút này sẽ dẫn người chơi đến màn hình căn cứ chó.
Phương pháp liên kết dữ liệu giữa các thành phần
- Để có thể liên kết trận đấu với các node màn chơi, mỗi node màn chơi sẽ có chứa tên file json trận đấu Hệ thống sẽ dùng tên file json này để truy cập dữ liệu trận đấu khi bắt đầu vào trận
- Để có thể liên kết giữa các bảng tên và các node màn chơi, mỗi node màn chơi sẽ chứa tên trận đấu Hệ thống sẽ sử dụng các tên có trong các node để tạo các bảng tên tương ứng
- Nâng cấp là một trong những tính năng thiết yếu của game, nó giúp tăng tính tương tác cho người chơi và cho người chơi lựa chọn, tùy chỉnh những yếu tố trong game sao cho phù hợp với lối chơi của họ
- Có 3 loại sản phẩm có thể nâng cấp: nhân vật, kỹ năng và nội tại.
Ô nâng cấp
- Ô nâng cấp chứa thông tin của sản phẩm như tên sản phẩm, mô tả, giá tiền Cùng với đó là các giao diện hiển thị ảnh của sản phẩm cũng như giá tiền cần để nâng cấp sản phẩm, cấp (level) hiện tại của sản phẩm
Thanh thông tin
- Đây là nơi hiển thị cho người dùng biết tên sản phẩm và mô tả sản phẩm đã chọn Tùy vào ô nâng cấp mà người dùng chọn mà thanh thông tin sẽ hiện thông tin tương ứng.
Nút Mở khóa/Nâng cấp
- Nút này có tính năng mở khóa sản phẩm nếu đây là lần đầu người dùng bỏ tiền (xương) vào vật phẩm này hoặc nâng cấp cho các sản phẩm đã mở khóa
- Nếu số lượng xương không đủ để mở khóa/nâng cấp, nút này sẽ không có hiệu lực.
Phương pháp truy cập dữ liệu sản phẩm
- Đối với từng loại sản phẩm sẽ có các file json tương ứng chứa dữ liệu cho các sản phẩm đó
- Thông tin sản phẩm thuộc loại nhân vật nằm trong file character.json
- Thông tin sản phẩm thuộc loại kỹ năng nằm trong file skill.json
- Thông tin sản phẩm thuộc loại nội tại nằm trong file passives.json
- Hệ thống sẽ lấy các dữ liệu này và tạo các ô nâng cấp tương ứng cho từng sản phẩm
- Kỹ năng là một tính năng đặc biệt có thể được dùng trong trận đấu, gồm các yếu tố sau:
+ Hành động: Khi gọi kỹ năng, kỹ năng sẽ thực hiện một hành động nào đó lên trận đấu (đẩy lùi kẻ địch, tăng sức mạnh cho quân lính, …)
+ Thời gian hồi: Thời gian hồi chiêu của kỹ năng.
Mưa cầu lửa
- Kỹ năng này tạo ngẫu nhiên các quả cầu lửa bay xuống và gây xác thương cho kẻ địch Mỗi quả cầu lửa sẽ gây sát thương cho mục tiêu đầu tiên mà nó chạm phải và sau đó tự động biến mất
- Sát thương gây ra của mỗi quả cầu lửa được tính theo công thức sau:
+ damage: Sát thương gây ra bởi cầu lửa
+ base_damage: Sát thương cơ bản của cầu lửa, có giá trị là 10
+ level: Cấp hiện tại của kỹ năng.
Đường Sấm Chớp
- Kỹ năng này tạo một đường sấm chớp gây sát thương và làm chậm kẻ địch Mỗi sấm chớp có thể tác động lên đa mục tiêu
- Sát thương gây ra của sấm chớp được tính theo công thức sau:
+ damage: Sát thương gây ra bởi cầu lửa
+ base_damage: Sát thương cơ bản của cầu lửa, có giá trị là 10
+ level: Cấp hiện tại của kỹ năng
- Tỉ lệ làm chậm kẻ địch được tính theo công thức sau:
+ slow_scale: Tỉ lệ làm chậm, số càng nhỏ thì hiệu quả làm chậm càng lớn + base_slow_scale: Tỉ lệ làm chậm ban đầu, có giá trị là 0.75
+ level_slow_scale: Tỉ lệ làm chậm cho mỗi cấp, có giá trị là 0.05
+ level: Cấp hiện tại của kỹ năng.
Trống Trận Cẩu Sơn
- Kỹ năng này tạo gây ra một tiếng trống có khả năng đẩy lùi kẻ địch
- Độ hiệu quả đẩy lùi được tính theo công thức sau:
+ kb_scale: Tỉ lệ đẩy lùi, giá trị càng lớn thì hiệu quả đẩy lùi càng cao + base_kb_scale: Tỉ lệ đẩy lùi ban đầu, có giá trị là 0.6
+ level_kb_scale: Tỉ lệ đẩy lùi cho mỗi cấp, có giá trị là 0.1
+ level: Cấp hiện tại của kỹ năng.
Hồi Máu Thành
- Kỹ năng này tạo một đường năng lượng lên Thành Chó và hồi máu Thành Chó
- Lượng máu hồi cho thành được tính theo công thức sau:
+ healing_health: Máu hồi cho thành
+ base_hh: Lượng máu hồi ban đầu, có giá trị là 250
+ level: Cấp hiện tại của kỹ năng.
Tăng Sức Mạnh
- Kỹ năng này tăng sức mạnh cho các nhân vật chó hiện tại trên trận đấu
- Tỉ lệ tăng sức mạnh được tính theo công thức sau:
+ power_up_scale: Tỉ lệ tăng sức mạnh, giá trị càng lớn thì hiệu quả tăng sức mạnh càng cao
+ base_pus: Tỉ lệ tăng sức mạnh ban đầu, có giá trị là 1.1
+ level_pus: Tỉ lệ tăng sức mạnh cho mỗi cấp, có giá trị là 0.1
+ level: Cấp hiện tại của kỹ năng
- Nội tại là các thuộc tính đặc biệt liên quan đến trận đấu.
Năng suất Lao động
- Là thuộc tính ảnh hưởng đến độ hiệu quả của thu nhập thụ động trong trận đấu (số tiền được tạo ra tự động theo thời gian)
- Thu nhập thụ động được tính theo công thức sau:
+ money_rate: Thu nhập thụ động
+ base_money_rate: Thu nhập thụ động ban đầu, có giá trị là 15
+ level_money_rate: Thu nhập thụ động cho mỗi cấp, có giá trị là 0.1 + level: Cấp của nội tại.
Sức chứa Kho bạc
- Là thuộc tính ảnh hưởng đến số tiền tối đa có thể chứa được trong trận đấu
- Số tiền tối đa chứa được được tính theo công thức sau:
+ wallet_capacity: Số tiền tối đa chứa được trong trận đấu
+ base_wc: Số tiền tối đa chứa dược ban đầu, có giá trị là 100
+ level_wc: Số tiền tối đa chứa được cho mỗi cấp, có giá trị là 0.5
+ level: Cấp của nội tại.
Sức chống cự Thành Chó
- Là thuộc tính ảnh hưởng đến lượng máu tối đa của Thành Chó
- Máu tối đa của Thành Chó công thức sau:
+ max_health: Máu tối đa của Thành Chó
+ base_mh: Máu tối đa ban đầu, có giá trị là 500
+ level: Cấp của nội tại.
Nghiên cứu và phát triển
- Là thuộc tính ảnh hưởng đến số Xương nhận được sau trận đấu
- Số lượng Xương nhận được sau trận đấu được tính theo công thức sau:
+ reward_bone: Xương nhận được sau trận đấu
+ battle_rb: Xương nhận được sau trận đấu, giá trị tùy thuộc vào màn chơi
+ level_rb: Tỉ lệ xương nhận thêm cho mỗi cấp, có giá trị là 0.1
+ level: Cấp của nội tại.
Phù thủy canh thành Gandolfg
- Là thuộc tính bảo vệ thành Thuộc tính này khi được mở khóa sẽ triệu hồi một nhân vật ngồi trên Thành Chó và tấn công kẻ địch nào đến gần thành
Hình 2.5: Gandolfg và tầm đánh của Gandolfg (minh họa)
- Tầm đánh của Gandolfg là một hình tròn, bán kính của tầm đánh được tính theo công thức sau:
+ radius: Bán kính tầm đánh của Gandolfg
+ battle_radius: Bán kính tầm đánh ban đầu, có giá trị là 1500
+ level_radius: Giá trị bán kính tầm đánh cho mỗi cấp, có giá trị là 150 + level: cấp của nội tại
- Thời gian hồi đòn đánh của Gandolfg được tính theo công thức sau:
+ attack_speed: Tốc độ đánh của Gandolfg
+ base_ac: Thời gian hồi đòn đánh ban đầu, có giá trị là 13 giây
+ level: Cấp của nội tại
- Tương tự như kỹ năng, vật phẩm là một tính năng đặc biệt có thể được dùng trong trận đấu Tuy nhiên, vật phẩm là vật tiêu hao, bạn chỉ có thể kích hoạt một vật phẩm một lần trong mỗi trận đấu Vật phẩm có hai loại:
+ Vật phẩm nội tại: vật phẩm này sẽ được kích hoạt ngay từ khi bắt đầu trận đấu và sẽ được áp dụng trong suốt thời gian trận đấu
+ Vật phẩm kích hoạt: vật phẩm này cần được người chơi kích hoạt để thực hiện chức năng của nó.
Bom nguyên tử
- Là Vật phẩm kích hoạt Phóng một quả bom nguyên tử vào giữa bản đồ, tiêu diệt tất cả nhân vật trên mặt trận, bao gồm cả loài Mèo và loài Chó.
Cầu lửa ngẫu nhiên
- Là vật phẩm nội tại Tạo ngẫu nhiên các quả cầu lửa bay xuống và gây xác thương cho kẻ địch trong suốt trận đấu Mỗi quả cầu lửa sẽ gây sát thương cho mục tiêu đầu tiên mà nó chạm phải và sau đó tự động biến mất
- Sát thương gây ra của mỗi quả cầu lửa được tính theo công thức sau:
+ damage: sát thương gây ra bởi cầu lửa
+ base_damage: sát thương cơ bản của cầu lửa, có giá trị là 10
+ level: cấp hiện tại của kỹ năng mưa cầu lửa (nếu có).
Chó Titan
- Là vật phẩm nội tại Triệu hồi một con chó khi bắt đầu trận đấu với lượng máu khổng lồ Khi Chó Titan vẫn còn tồn tại, gây sát thương theo thời gian cho toàn bộ loài Mèo trên mặt trận khi Bù lại, chó titan sẽ không thể tấn công
- Sát thương gây ra mỗi giây là 50
- Máu của chó titan được tính theo công thức sau:
+ level: cấp độ của màn mà bạn đang chơi.
Ví tiền max
- Khi sử dụng vật phẩm này, ví tiền sẽ ở cấp tối đa ngay khi vừa vào trận
- Nhân vật là thành phần chủ chốt trong trận đấu, nhân vật có thể được triệu hồi để di chuyển và đánh nhau, đánh thành Việc triệu hồi nhân vật quyết định thắng thua của một trận đấu
- Nhân vật gồm các yếu tố sau:
+ character_type (Int / enum): loại nhân vật, có hai loại là Chó và Mèo + speed (Int): tốc dộ di chuyển của nhân vật
+ attack_range (Int): tầm đánh của nhân vật Khi nhân vật gặp mặt kẻ địch ở khoảng cách này, nhân vật sẽ dừng lại và bắt đầu tấn công
+ attack_area_range (Int): tầm ảnh hưởng (độ lớn) của đòn đánh Nếu giá trị là 0 thì nhân vật sẽ đánh đơn mục tiêu, ngược lại thì nhân vật sẽ đánh đa mục tiêu
+ attack_cooldown (float): tốc độ đánh
+ health (Int): máu của nhân vật
+ damage (Int): sát thương của đòn đánh
+ knockbacks (Int): số lần ngã trước khi chết
+ custom_attack_area (Area2D): tầm ảnh hưởng tự chọn
+ attack_sprite (Sprite2D): sprite dùng để kiểm tra nếu nhân vật đang trong trạng thái đánh
+ attack_frame (Int): frame của attack_sprite được xem là trạng thái đánh của nhân vật
Xây dựng AI cho nhân vật sử dụng Finite State Machine
- Nhân vật là đối tượng khá phức tạp với nhiều trạng thái tương tác khác nhau, do đó việc sử dụng Finite State Machine design pattern sẽ giúp việc viết code cho từng trạng thái trở nên dễ dàng hơn [6]
- Nhân vật có 5 trạng thái:
+ MoveState: trạng thái di chuyển
+ AttackState: trạng thái tấn công
+ IdleState: trạng thái đứng yên
- Nhân vật chỉ chỉ có thể ở một trạng thái duy nhất tại một thời điểm Một trạng thái có thể chuyển sang trạng thái khác nếu đạt được điều kiện được lập trình trong trạng thái hiện tại
Hình 2.6: Sơ đồ finite state machine của nhân vật
- Trạng thái này điều khiển nhân vật di chuyển và kiểm tra xem đối tượng khác (kẻ địch, thành trì địch) có nằm trong tầm đánh của nhân vật Không
- Nếu phát hiện kẻ địch, chuyển sang một trong hai trạng thái đó là:
+ AttackState: nếu đã xong thời gian chờ đòn đánh (thời gian hồi đòn đánh dựa trên giá trị của attack_cooldown)
+ IdleState: nếu thời gian chờ đòn đánh vẫn còn đang đếm ngược
- Trạng thái này điều khiển đòn đánh của nhân vật Nhân vật thực hiện hoạt ảnh của đòn đánh, khi hoạt ảnh của attack_sprite đạt tới frame có giá trị lớn hơn hoặc bằng attack_frame thì sẽ thực hiện logic tấn công gây sát thương cho kẻ địch nằm trong tầm ảnh hưởng đòn đánh
- Sau khi đã hoàn thành hoạt ảnh tấn công, tự động chuyển sang trạng thái IdleState
- Trạng thái này khiến cho nhân vật đứng yên Nếu kẻ địch không còn nằm trong tầm đánh thì chuyển sang trạng thái MoveState, nếu đối tượng vẫn còn trong tầm đánh thì chờ cho đến khi thời gian chờ đòn đánh chạy xong rồi chuyển sang trạng thái AttackState
- Trạng thái này kiểm soát hành động ngã của nhân vật Trạng thái này chỉ được kích hoạt khi nhân vật bị tấn công và lượng máu rơi xuống bé hơn hoặc bằng một giá trị nhất định (giá trị này được gọi là lượng máu vấp ngã) Nhân vật sẽ tính toán lại lượng máu vấp ngã để dùng làm điều kiện cho lần vấp ngã sau
- Sau khi hành động ngã được hoàn thành, nhân vật chuyển sang một trong hai trạng thái đó là:
+ MoveState: nếu lượng máu của nhân vật lớn hơn 0
+ DieState: nếu lượng máu của nhân vật nhỏ hơn hoặc bằng 0
- Trạng thái này kiểm soát hành động chết của nhân vật
- Sau khi hoạt ảnh chết được hoàn thành Nhân vật sẽ được xóa khỏi trận đấu
Phương pháp xác định tầm ảnh hưởng đòn đánh
- Tầm ảnh hưởng đòn đánh được xác định thông qua 3 yếu tố: vị trí của nhân vật ở phần nhân vật đang hướng đến, giá trị của tầm đánh (attack_range), và giá trị được cho trong tầm ảnh attack_area_range
- Tầm ảnh hưởng đòn đánh là một đường ngang nằm dưới đất có giá trị nhất định Giá trị nhất định attack_area_range càng lớn thì đường ngang này càng lớn Vị trí chính giữa của đường ngang này có giá trị theo trục x được tính theo theo công thức sau:
- x là giá trị theo trục x của điểm chính giữa của đường ngang đại diện cho tầm ảnh hưởng của đòn đánh
- hitbox_facing_side_x là giá trị theo trục x của phần cuối của hitbox nhân vật theo hướng nhân vật đang đi đến
Hình 2.7: Tầm đánh và tầm ảnh hưởng đòn đánh của Chó Thiên Thần
28 Để dễ hình dung, ở đây ta có nhân vật là Chó Thiên thần, với diểm đường nét đứt màu vàng đại diện cho tầm đánh, đường ngang màu xanh đại diện cho tầm ảnh hưởng của đòn đánh và ô màu xanh nước là hitbox của nhân vật.
Xác định tầm ảnh hưởng đòn đánh bằng custom_attack_area
- Trong một số trường ta muốn thiết kế nhân vật có tầm đánh đặc biệt mà phương pháp sử dụng attack_area_range không thể đáp ứng, ta có thể sử dụng custom_attack_area để xác định tầm ảnh hưởng đòn đánh
- custom_attack_area là một biến nhận giá trị là một Node thuộc kiểu Area2D Đây là node có tác dụng xác định vùng va chạm Ta có thể dùng node này để xác định tầm ảnh hưởng đòn đánh theo ý muốn
Hình 2.8: Tầm ảnh hưởng đòn đánh của Chó Bắn Tỉa
- Để minh họa, trong trường hợp nhân vật Chó Bắn tỉa, thay vì sử dụng giá trị trong attack_area_range để xác định tầm ảnh hưởng đòn đánh, ta sử dụng một node Area2D có hình dạng giống như trên (đường thẳng màu xanh nước) để xác định tầm đánh Điều này giúp cho nhân vật có tầm ảnh hưởng đòn đánh hợp lí hơn (là đường đi của viên đạn thay vì một ô nằm dưới mặt đất)
Nhân vật – Chó
- Nhân vật thuộc loại Chó thừa hưởng các tính năng từ Nhân vật nhưng có một số điểm được mở rộng:
- Thuộc tính name_id (String): id của nhân vật, được dùng để truy xuất các thông tin của nhân vật từ file save.json
- Nhân vật sẽ được tăng sát thương và máu dựa trên level mà nhân vật được người chơi nâng cấp.
Nhân vật – Mèo
- Nhân vật thuộc loại Mèo thừa hưởng các tính năng từ Nhân vật nhưng có một số điểm được mở rộng:
- Thuộc tính reward_money (Int): tiền nhận được sau khi hạ gục nhân vật
- Thuộc tính is_boss (bool): kiểm tra xem mèo có phải là boss hay không
- Nhân vật sẽ được tăng sát thương và máu dựa trên giá trị của power_scale trong file json trận đấu.
Nhân vật – Mèo biết bay
- Một số nhân vật Mèo có khả năng bay, chúng vẫn thừa hưởng các tính năng từ Nhân Vật nhưng có một số điểm khác biệt:
+ Mèo biết bay bắn đạn để gây sát thương lên mục tiêu thay vì đánh trực tiếp như những loài Mèo khác
+ Do các nhân vật Chó không thể với tới Mèo biết bay cho nên chúng chỉ có thể bị tiêu diệt bởi Gandolfg hoặc Chó Miko
Chi tiết các nhân vật Chó
- Nhân vật đầu tiên của game, người chơi phải sử dụng nhân vật này để thắng trận đấu, lấy Xương để có thể mở khóa nhân vật khác
- Có lượng máu thấp và tầm đánh ngắn, đánh đơn mục tiêu
- Nhân vật có thể mở khóa được ở màn hình Nâng cấp
- Có tầm đánh ngắn, đánh đơn mục tiêu và dễ bị ngã nhưng có thời gian hồi đòn đánh nhanh, có lượng máu trung bình và tốc độ di chuyển nhanh
- Nhân vật có thể mở khóa được ở màn hình Nâng cấp
- Có tầm đánh ngắn, sát thương thấp nhưng có lượng máu cao, đánh đa mục tiêu
- Nhân vật có thể mở khóa được ở màn hình Nâng cấp
- Có tầm đánh xa, đánh đa mục tiêu và sát thương cao nhưng có lượng máu thấp
- Nhân vật có thể mở khóa được ở màn hình Nâng cấp
- Có tầm đánh rất xa, đánh xuyên phá đa mục tiêu và sát thương rất cao nhưng thời gian hồi đòn đánh lâu, tốc độ di chuyển chậm
- Nhân vật có thể mở khóa nếu liên tục thua 4 lần ở phần hướng dẫn trận đấu
- Có tầm đánh xa, sát thương cao và máu nhiều Ngoài ra sau khi đánh thường, Chó Bóng Chày sẽ triệu hồi một loạt các vụ nổ đánh văng kẻ địch
- Khi được triệu hồi và khi chết, Chó Bóng Chày sẽ đẩy lùi kẻ địch
- Nhân vật có thể mở khóa sau khi thắng màn chơi đặc biệt
- Có tầm đánh xa, sát thương rất cao và tầm ảnh hưởng đòn đánh rộng nhưng lượng máu khá thấp
- Chó Miko tấn công bằng cách bay lên trời và ném các lá bùa vào kẻ địch đồng thời thả các quả cầu Yin Yang xuống kẻ địch
Chi tiết các nhân vật Mèo
- Kẻ địch đầu tiên của game Có lượng máu thấp và tầm đánh ngắn, đánh đơn mục tiêu
- Có tầm đánh xa, sát thương trung bình và đánh đa mục tiêu nhưng thời gian hồi đòn đánh khá lâu
- Có tốc độ di chuyển cao, thời gian hồi đòn đánh nhanh nhưng sát thương thấp, tầm đánh rất ngắn, đánh đơn mục tiêu và dễ bị ngã
- Có lượng máu trung bình, đánh đa mục tiêu nhưng tầm đánh ngắn, dễ bị ngã
- Có lượng máu và sát thương rất cao, đánh đa mục tiêu và tầm ảnh hưởng đòn đánh trung bình nhưng tốc độ di chuyển chậm
- Có lượng máu rất cao, sát thương rất cao (hạ gục kẻ địch trong một đòn đánh), tầm ảnh hưởng đòn đánh rất rộng nhưng tốc độ di chuyển và thời gian hồi đòn đánh rất chậm
- Thuộc loại Mèo biết bay, có lượng máu trung bình, tầm đánh xa, tốc độ di chuyển cao nhưng dễ bị ngã, thời gian hồi đòn đánh trung bình
- Khi tấn công, Mèo Tiên sẽ thả các viên đạn hình bông hoa, các viên đạn này sẽ lơ lửng trên không trung một thời gian rồi sao đó sẽ bay vào một nhân vật Chó ngẫu nhiên
2.14.8.8 Mèo Tiên Hoa Hướng Dương:
Hình 2.23: Mèo Tiên Hoa Hướng Dương
- Thuộc loại Mèo biết bay, có lượng máu cao, tầm đánh rất xa nhưng thời gian hồi đòn đánh khá lâu
- Khi tấn công, Mèo Tiên Hoa Hướng Dương sẽ thả các viên đạn tròn tạo thành mô tiếp nhìn giống như một bông hoa
Hệ thống trận đấu online:
- Trận đấu online cho phép có hai người chơi trong một trận đấu Nó hoạt động tương tự như trận dấu một người chơi, nhưng thay vì người chơi chơi với máy (máy điều khiển Thành Mèo), thì ở đây hai người chơi sẽ đánh với nhau
- Hệ thống trận đấu online được xây dựng bằng cách kết hợp cả hai kiến trúc peer-to-peer (P2P) và kiến trúc client-server, trong đó người chơi sẽ trao đổi dữ liệu với nhau giống như kiến trúc P2P, nhưng thay vì cả hai tự tính toán dữ liệu game của mình rồi trao đổi với nhau, một bên sẽ đóng vai trò là server,
40 tính toán hết các dữ liệu trong game và gửi dữ liệu qua bên còn lại là client, client có nhiệm vụ là mô phỏng game theo dữ liệu đã cho, suy đoán trạng thái game và mô phỏng game theo suy đoán đó trong lúc đợi gói dữ liệu tiếp theo, gửi dữ liệu input của người chơi cho bên server
- Việc cho game đi theo lối kiến trúc P2P giúp giảm thiểu việc phải xây dựng và quản lý một server dành riêng cho trận đấu online Việc cho các máy tham gia trò chơi hoạt động theo kiến trúc client-server giúp cho dữ liệu tính toán được có tính quyết định hơn, trong đó những gì bên server tính toán ra được sẽ được xem là sự thật, thay vì cho phép hai máy tự tính toán dữ liệu và trao đổi với nhau, dẫn đến sai lệch trong tính toán do độ trễ trong việc truyền dữ liệu của hai bên Ngoài ra việc sử client-server giảm thiểu trường hợp gian lận xuống còn 50% do game chỉ có thể bị gian lận nếu người chơi gian lận là server
- Chúng em sử dụng Steamworks thông qua GodotSteam để thực hiện những chức năng đánh online Trong đó IsteamNetworkingSockets là interface được sử dụng cho game, nó hỗ trợ các tính năng như tạo kết nối, kết nối P2P, truyền dữ liệu, … Việc sử dụng Steamworks cho phép hai máy tính khác nhau có thể chơi với nhau mà không cần phải kết nối với nhau trực tiếp bằng mạng LAN hay phải sử dụng kỹ thuật kết nối hai người chơi bằng NAT hole punching Thay vào đó, hai người chơi sẽ được kết nối với nhau thông qua mạng lưới trung gian là Valve network [7]
- Khi ở trong trận đấu, người chơi là chủ phòng sẽ đóng vai trò là server với nhiệm vụ:
+ Nhận dữ liệu input của client (nâng cấp ví tiền, triệu hồi lính, …) và tiến hành kiểm tra, thực hiện hành động mà client yêu cầu nếu hành động đó khả thi
+ Tính toán dữ liệu trận đấu (vị trí, trạng thái nhân vật, tiền của hai người chơi, thời gian hồi kỹ năng, nhân vật, …)
+ Gửi dữ liệu trận đấu tại thời điểm hiện tại cho client mỗi 1/25 giây, hay có thể nói game có tick rate là 25, một số game FPS sẽ có tick rate cao hơn nhằm đảm bảo độ phản hồi của game cao (Overwatch 2 sử dụng tick rate
64, Fortnite sử dụng tick rate 30 [8]), nhưng do tính chất của game chúng em yêu cầu tính toán lượng dữ liệu lớn (dữ liệu vị trí và trạng thái của từng nhân vật, kỹ năng) cho nên để đảm bảo server không bị quá tải, tick rate này vẫn đảm bảo độ phản hồi cao và khiến server không bị quá tải khi truyền dữ liệu
- Người chơi còn lại sẽ đóng vai trò là client, với nhiệm vụ:
+ Nhận dữ liệu trận đấu từ server và mô phỏng lại game theo đúng như dữ liệu được cho
+ Suy đoán trạng thái tiếp theo của trận đấu và tiếp tục mô phỏng game theo suy đoán đó trong lúc đợi gói dữ liệu trận đấu tiếp theo từ server
+ Nhận input của người chơi client và gửi dữ liệu input đó cho server xử lý
- Hạn chế của phương pháp này là người đóng vai trò server mặc dù có trải nghiệm game mượt, không có độ trễ xử lý input, người chơi đóng vai trò là client sẽ phải chịu độ trễ trong việc xử lý input do phải gửi dữ liệu đó lên server xử lý cũng như độ trễ về trạng thái game do phải đợi dữ liệu trận đấu trả về tử server Trải nghiệm game của người chơi đóng vai trò là client sẽ phụ thuộc rất nhiều vào tốc độ truyền tải dữ liệu của cả máy client và server
Hệ thống bắn đạn danmaku:
- Một số nhân vật trong game và thành trì sẽ có khả năng bắn đạn, trong một số trường hợp để giúp game có tính đẹp mắt, đạn được bắn sẽ di chuyển theo một đường đi nhất định và kết hợp nhau để tạo thành một pattern (mô hình) đẹp mắt trước khi tấn kẻ địch, kiểu bắn đạn này được gọi là danmaku [9] Việc này đòi hỏi viên đạn cần phải có nhiều thuộc tính phức tạp nhằm giúp lập trình viên có thể điều khiển chúng theo ý muốn
Hình 2.24: Minh họa bắn đạn danmaku 1
Hình 2.25: Minh họa bắn đạn danmaku 2
- Vấn đề nảy sinh trong việc bắn đạn danmaku là việc kiểm soát độ mượt của game, do để có thể tạo dựng được những pattern đẹp mắt thì số lượng đạn bắn cần phải nhiều (hàng trăm, thậm chí hàng nghìn viên đạn) và di chuyển theo đường đi phức tạp Để giải quyết điều này chúng em đã sử dụng và sửa đổi plugin của Godot Native Bullets của amdze cho phù hợp với game Plugin này sử dụng C++ để lập trình hoạt động của đạn, đồng thời sử dụng design pattern object pool và một số điểm tối ưu hóa khác giúp cho việc tạo viên đạn và điều khiển đạn được nhanh chóng và không tốn nhiều tài nguyên
- Những viên đạn mặc định sẽ có những thuộc tính chính sau:
+ material (Material): dùng để cho biết đạn nên được render như thế nào, có thể thêm hiệu ứng lên viên đạn hoặc dùng để chạy hoạt ảnh lên viên đạn + collision_enabled (bool): kiểm tra xem đạn này có khả năng va chạm hay không
+ collision_layer (int): layer mà các đối tượng khác cần kiểm tra để có thể va phát hiện va chạm được với đạn
+ collision_shape (Shape): hình dạng khu vực va chạm của đạn
+ auto_rotate (bool): hình ảnh viên đạn sẽ tự động quay theo hướng di chuyển
+ data (Dictionary): dữ liệu tùy ý mà lập trình viên có thể thêm vào viên đạn + velocity (Vector2): vận tốc của viên đạn
+ transform (Transform2D): chứa vị trí, độ quay (của hình ảnh) và scale của viên đạn (không dùng đến)
PHÂN TÍCH THIẾT KẾ HỆ THỐNG GAME
Hình 3.1: Sơ đồ Use case tổng quát
STT Tên Actor Mô tả ngắn/ ghi chú
1 Người chơi Người chơi trò chơi
2 System Hệ thống của trò chơi
Bảng 3.2: Danh sách Use case
STT Tên Use case Actor Mô tả ngắn/ ghi chú
1 Xem đội hình/ kỹ năng/ vật phẩm
Người chơi Xem đội hình, kỹ năng hoặc vật phẩm của người chơi
2 Sắp xếp đội hình/ kỹ năng/ vật phẩm
Người chơi Sắp xếp đội hình, kỹ năng hoặc vật phẩm của người chơi
3 Xem bản đồ Người chơi Xem bản đồ các level
4 Chọn chương Người chơi Chọn các chương (màn chơi)
5 Chọn level Người chơi Chọn level
6 Triệu hồi lính Người chơi Triệu hồi lính trong trận đấu
7 Kích hoạt kỹ năng Người chơi Kích hoạt kỹ năng trong trận đấu
8 Kích hoạt vật phẩm Người chơi Kích hoạt vật phẩm trong trận đấu
9 Điều khiển lính Người chơi Điều khiển lính của người chơi
10 Dừng trận đấu Người chơi Dừng trận đấu
11 Chỉnh sửa âm thanh trong trận đấu
Người chơi Chỉnh sửa âm thanh trong trận đấu
12 Xem nhân vật/ kỹ năng/ nội tại
Người chơi Xem danh sách nhân vật/ kỹ năng/ nội tại
13 Nâng cấp nhân vật Người chơi Nâng cấp nhân vật
14 Mua nhân vật Người chơi Mua nhân vật
15 Nâng cấp kỹ năng Người chơi Nâng cấp kỹ năng
16 Mua kỹ năng Người chơi Mua kỹ năng
17 Nâng cấp nội tại Người chơi Nâng cấp nội tại
18 Mua nội tại Người chơi Mua nội tại
19 Xem vật phẩm Người chơi Xem danh sách vật phẩm trong cửa hàng
20 Mua vật phẩm Người chơi Mua vật phẩm trong cửa hàng
21 Cài đặt Người chơi Cài đặt
22 Điều khiển Người chơi Thay đổi nút bấm trong trận đấu
23 Tạo phòng chờ Người chơi Tạo phòng chơi cho trận đấu online
24 Tìm phòng Người chơi Tìm phòng chờ cho trận đấu online
25 Thiết lập trận đấu online
Người chơi Thiết lập thông tin cho trận đấu online
26 Nhắn tin Người chơi Nhắn tin với người chơi khác trong trận đấu online
27 Đấu online Người chơi Bắt đầu trận đấu online
28 Đầu hàng Người chơi Đầu hàng trong trận đấu online
29 Hướng dẫn Người chơi Hướng dẫn người mới bắt đầu
Danh sách đặc tả Use case
Xem đội hình/ kỹ năng/ vật phẩm
Hình 3.2: Sơ đồ hoạt động xem đội hình/ kỹ năng/ vật phẩm
Bảng 3.3: Use case xem đội hình/ kỹ năng/ vật phẩm
Tên Use case Xem đội hình/ kỹ năng/ vật phẩm
Mô tả Chức năng này cho phép người chơi có thể xem danh sách nhân vật và kỹ năng mà người chơi đã sở hữu và đội hình nhân vật/ kỹ năng/ vật phẩm mà người chơi đang sử dụng để xuất kích
Người thực hiện Người chơi Điều kiện trước xử lí None
Sau xử lí (sau Use- case)
Dòng sự kiện chính - Người chơi ở trong màn hình “Map” -> Nhấn “Đội hình”
- Người chơi có thể xem xem danh sách nhân vật và kỹ năng mà người chơi đã sở hữu và đội hình nhân vật/ kỹ năng/ vật phẩm mà người chơi đang sử dụng để xuất kích Người chơi nhấn vào các tab “Nhân vật”, “Kỹ năng” hoặc “Vật phẩm” để xem danh sách đội hình tương ứng
Dòng sự kiện khác None
48 Sắp xếp đội hình/ kỹ năng/ vật phẩm
Hình 3.3: Sơ đồ hoạt động sắp xếp đội hình/ kỹ năng/ vật phẩm
Bảng 3.4: Use case sắp xếp đội hình/ kỹ năng/ vật phẩm
Tên Use case Sắp xếp đội hình/ kỹ năng/ vật phẩm
Mô tả Chức năng này cho phép người chơi có thể xem danh sách nhân vật và kỹ năng mà người chơi đã sở hữu và thiết lập đội hình nhân vật/ kỹ năng/ vật phẩm mà người chơi đang sử dụng để xuất kích
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Map” -> Nhấn “Đội hình”
- Người chơi có thể xem xem danh sách nhân vật và kỹ năng mà người chơi đã sở hữu và đội hình nhân vật/ kỹ năng/ vật phẩm mà người chơi đang sử dụng để xuất kích Người chơi nhấn vào các tab “Nhân vật”, “Kỹ năng” hoặc “Vật phẩm” để chọn danh sách đội hình tương ứng
- Người chơi tiến hành thiết lập đội hình mong muốn -> Nhấn Lưu
- Nếu người chơi nhấn nút “Quay lại” màn hình hiển thị màn hình “Map” Đội hình đã sắp xếp vẫn sẽ được lưu
Hình 3.4: Sơ đồ hoạt động xem bản đồ
Bảng 3.5: Use case xem bản đồ
Tên Use case Xem bản đồ
Mô tả Chức năng này cho phép người chơi có thể xem bản đồ các level mà người chơi đã hoặc chưa qua màn
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Viễn chinh”
- Người chơi có thể xem danh sách các level mà người chơi có thể chơi và chọn
Hình 3.5: Sơ đồ hoạt động chọn chương Bảng 3.6: Use case chọn chương
Tên Use case Chọn chương
Mô tả Chức năng này cho phép người chơi có thể chọn chương khác để chơi
Người thực hiện Người chơi Điều kiện trước xử lí None
Sau xử lí (sau Use- case)
Dòng sự kiện chính - Người chơi ở trong màn hình “Dog base” -> Nhấn biểu tượng bên trái nút “Viễn chinh”
- Người chơi chọn chương muốn chơi và nhấn click đúp vào chương đó
Dòng sự kiện khác None
Hình 3.6: Sơ đồ hoạt động chọn level Bảng 3.7: Use case chọn level
Tên Use case Chọn level
Mô tả Chức năng này cho phép người chơi có thể chọn các level mà người chơi đã hoàn thành hoặc level mà người chơi cần hoàn thành để tiếp tục level cao hơn
Người thực hiện Người chơi Điều kiện trước xử lí None
Sau xử lí (sau Use- case)
Dòng sự kiện chính - Người chơi ở trong màn hình “Dog base” -> Nhấn
- Người chơi chọn level muốn chơi và nhấn “Bắt đầu”
Dòng sự kiện khác - Nếu người chơi chọn level cao hơn level mà người chơi có thể chơi, người chơi sẽ không thể chọn được level đó
- Nếu người chơi nhấn nút “Quay lại” màn hình hiển thị màn hình “Dog base”
Hình 3.7: Sơ đồ hoạt động triệu hồi lính Bảng 3.8: Use case triệu hồi lính
Tên Use case Triệu hồi lính
Mô tả Chức năng này cho phép người chơi có thể triệu gọi nhân vật (lính) trong đội hình vào trận đấu để tấn công đối thủ
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Trận đấu” -> Nhấn chọn nhân vật mà người chơi muốn triệu hồi ở góc trên màn hình
- Thay vì nhấn chọn vào nhân vật, người chơi có thể bấm các phím 1,2,3,4,5 để triệu hồi nhân vật tương ứng theo thứ tự
- Người chơi có thể sử dụng phím “Tab” để chuyển sang dàn nhân vật thứ 2
Hình 3.8: Sơ đồ hoạt động kích hoạt vật phẩm
Bảng 3.9: Use case kích hoạt vật phẩm
Tên Use case Kích hoạt vật phẩm
Mô tả Chức năng này cho phép người chơi có thể kích hoạt vật phẩm trong trận đấu nhằm tạo lợi thế trong trận đấu, mỗi vật phẩm có một khả năng riêng
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Trận đấu” -> Nhấn chọn biểu tượng vật phẩm muốn kích hoạt ở trong trận đấu
- Một số vật phẩm có thể tự động kích hoạt ngay khi trận đấu bắt đầu mà không cần nhấn để kích hoạt
Hình 3.9: Sơ đồ hoạt động điều khiển lính Bảng 3.10: Use case điều khiển lính
Tên Use case Điều khiển lính
Mô tả Chức năng này cho phép người chơi thể chọn lính mà mình muốn trong trận đấu để điều khiển, các hành động điều khiển bao gồm di chuyển trái, phải và đánh
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Trận đấu” -> Nhấn chọn nhân vật lính mà người chơi muốn điều khiển
- Nếu người chơi đã chọn nhân vật lính này, nhấn chọn lần nữa sẽ hủy điều khiển nhân vật
- Nếu người chơi đang điều khiển nhân vật lính khác, nhấn chọn nhân vật lính sẽ hủy điều khiển nhân vật đang điều khiển và chuyển quyền điều khiển sang nhân vật vừa nhấn chọn
Hình 3.10: Sơ đồ hoạt động kích hoạt kỹ năng Bảng 3.11: Use case kích hoạt kỹ năng
Tên Use case Kích hoạt kỹ năng
Mô tả Chức năng này cho phép người chơi có kích hoạt kỹ năng trong trận đấu nhằm tạo lợi thế trong trận đấu, mỗi kỹ năng có một khả năng riêng
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Trận đấu” -> Nhấn chọn biểu tượng kỹ năng muốn kích hoạt ở bên trái màn hình
- Thay vì nhấn chọn vào kỹ năng, người chơi có thể bấm các phím a,s,d để kích hoạt kỹ năng tương ứng theo thứ tự
Hình 3.11: Sơ đồ hoạt động dừng trận đấu Bảng 3.12: Use case dừng trận đấu
Tên Use case Dừng trận đấu
Mô tả Chức năng này cho phép người chơi dừng lại khi đang trong trận đấu
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Trận đấu” -> Nhấn chọn biểu tượng “dừng” ở góc trên bên phải để dừng trận đấu
- Thay vì nhấn chọn biểu tượng “dừng”, người chơi có thể nhấn phím “P” để dừng trận đấu
Chỉnh sửa âm thanh trong trận đấu
Hình 3.12: Sơ đồ hoạt động chỉnh sửa âm thanh
Bảng 3.13: Use case chỉnh sửa âm thanh
Tên Use case Chỉnh sửa âm thanh
Mô tả Chức năng này cho phép người chơi chỉnh sửa âm thanh, gồm âm nhạc trận đấu và âm thanh nhấn nút
Người thực hiện Người chơi Điều kiện trước xử lí None
Sau xử lí (sau Use- case)
Dòng sự kiện chính - Người chơi ở trong màn hình “Trận đấu” -> Nhấn chọn biểu tượng “dừng” ở góc trên bên phải để hiển thị thanh dừng trận đấu
- Người chơi chỉnh sửa âm thanh theo sở thích
Dòng sự kiện khác None
Xem nhân vật/ kỹ năng/ nội tại
Hình 3.13: Sơ đồ hoạt động xem nhân vật/ kỹ năng/ nội tại
Bảng 3.14: Use case xem nhân vật / kỹ năng/ nội tại
Tên Use case Xem nhân vật / kỹ năng/ nội tại
Mô tả Chức năng này cho phép người chơi có thể xem danh sách nhân vật, kỹ năng, hoặc nội tại mà người chơi đã sở hữu và có thể sở hữu
Người thực hiện Người chơi Điều kiện trước xử lí None
Sau xử lí (sau Use- case)
Dòng sự kiện chính - Người chơi ở trong màn hình “Dog base” -> Nhấn
- Người chơi có thể xem danh sách tất cả các nhân vật, kỹ năng và nội tại mà người chơi đang và có thể sở hữu Người chơi nhấn vào các tab “Nhân vật”, “Kỹ năng”,
”Nội tại” để xem danh sách tương ứng
Dòng sự kiện khác None
Hình 3.14: Sơ đồ hoạt động nâng cấp nhân vật Bảng 3.15: Use case nâng cấp nhân vật
Tên Use case Nâng cấp nhân vật
Mô tả Chức năng này cho phép người chơi nâng cấp nhân vật nhằm giúp nhân vật mạnh hơn
Người thực hiện Người chơi Điều kiện trước xử lí
Nhân vật đã được mở khóa
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Chọn nhân vật muốn nâng cấp
- Số Xương đủ để nâng cấp
- Nhân vật được nâng cấp
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Chọn nhân vật muốn nâng cấp
- Số Xương không đủ để nâng cấp
- Tắt tính năng nâng cấp của nút “Nâng cấp”
Hình 3.15: Sơ đồ hoạt động mua nhân vật Bảng 3.16: Use case mua nhân vật
Tên Use case Mua nhân vật
Mô tả Chức năng này cho phép người chơi mua nhân vật nhằm giúp mở khóa nhân vật để có thể bắt đầu nâng cấp
Người thực hiện Người chơi Điều kiện trước xử lí
Nhân vật chưa được mở khóa
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Chọn nhân vật muốn mua
- Số Xương đủ để mở mua
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Chọn nhân vật muốn mua
- Số Xương không đủ để mua
- Tắt tính năng mua của nút “Mua”
Hình 3.16: Sơ đồ hoạt động nâng cấp kỹ năng Bảng 3.17: Use case nâng cấp kỹ năng
Tên Use case Nâng cấp kỹ năng
Mô tả Chức năng này cho phép người chơi nâng cấp kỹ năng nhằm giúp kỹ năng mạnh hơn
Người thực hiện Người chơi Điều kiện trước xử lí
Kỹ năng đã được mở khóa
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Bấm vào thanh kỹ năng
- Chọn kỹ năng muốn nâng cấp
- Số Xương đủ để nâng cấp
- Kỹ năng được nâng cấp
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Bấm vào thanh kỹ năng
- Chọn kỹ năng muốn nâng cấp
- Số Xương không đủ để nâng cấp
- Tắt tính năng nâng cấp của nút “Nâng cấp”
Hình 3.17: Sơ đồ hoạt động mua kỹ năng Bảng 3.18: Use case mua kỹ năng
Tên Use case Mua kỹ năng
Mô tả Chức năng này cho phép người chơi mua kỹ năng nhằm giúp mở khóa kỹ năng để có thể bắt đầu nâng cấp
Người thực hiện Người chơi Điều kiện trước xử lí
Kỹ năng chưa được mở khóa
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Bấm vào thanh kỹ năng
- Chọn kỹ năng muốn mua
- Số Xương đủ để mở mua
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Chọn kỹ năng muốn mua
- Số Xương không đủ để mua
- Tắt tính năng mua của nút “Mua”
Hình 3.18: Sơ đồ hoạt động nâng cấp nội tại Bảng 3.19: Use case nâng cấp nội tại
Tên Use case Nâng cấp nội tại
Mô tả Chức năng này cho phép người chơi nâng cấp nội tại nhằm giúp nội tại mạnh hơn
Người thực hiện Người chơi Điều kiện trước xử lí
Nội tại đã được mở khóa
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Bấm vào thanh nội tại
- Chọn nội tại muốn nâng cấp
- Số Xương đủ để nâng cấp
- Nội tại được nâng cấp
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Bấm vào thanh nội tại
- Chọn nội tại muốn nâng cấp
- Số Xương không đủ để nâng cấp
- Tắt tính năng nâng cấp của nút “Nâng cấp”
Hình 3.19: Sơ đồ hoạt động mua nội tại Bảng 3.20: Use case mua nội tại
Tên Use case Mua nội tại
Mô tả Chức năng này cho phép người chơi mua nội tại nhằm giúp mở khóa nội tại để có thể bắt đầu nâng cấp
Người thực hiện Người chơi Điều kiện trước xử lí
Nội tại chưa được mở khóa
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Bấm vào thanh nội tại
- Chọn nội tại muốn mua
- Số Xương đủ để mở mua
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Chọn nội tại muốn mua
- Số Xương không đủ để mua
- Tắt tính năng mua của nút “Mua”
Hình 3.20: Sơ đồ hoạt động xem vật phẩm Bảng 3.21: Use case xem vật phẩm
Tên Use case Xem vật phẩm
Mô tả Chức năng này cho phép người chơi có thể xem danh sách vật phẩm
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Nâng cấp”
- Danh sách vật phẩm được hiển thị
Hình 3.21: Sơ đồ hoạt động mua vật phẩm Bảng 3.22: Use case mua vật phẩm
Tên Use case Mua vật phẩm
Mô tả Chức năng này cho phép người chơi mua vật phẩm
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Cửa hàng”
- Chọn vật phẩm muốn mua
- Số Xương đủ để mua
- Người chơi ở trong màn hình “Dog base” -> Nhấn “Cửa hàng”
- Chọn vật phẩm muốn mua
- Số Xương không đủ để mua
- Tắt tính năng mua của nút “Mua”
Hình 3.22: Sơ đồ hoạt động Cài đặt Bảng 3.23: Use case Cài đặt
Tên Use case Cài đặt
Mô tả Chức năng này cho phép người chơi cài đặt thông số trò chơi trước khi bắt đầu trò chơi
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình chính -> Nhấn “Cài đặt”
- Chỉnh sửa âm thanh hoặc ngôn ngữ theo ý thích của người chơi
Hình 3.23: Sơ đồ hoạt động Điều khiển Bảng 3.24: Use case Điều khiển
Tên Use case Điều khiển
Mô tả Chức năng này cho phép người chơi thay đổi nút bấm trong trận đấu của trò chơi
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình “Cài đặt”-> Nhấn “Điều khiển
- Nhấn nút bên phải của điều chỉnh muốn thay đổi -> Nhấn nút bàn phím muốn chuyển đổi thành
Hình 3.24: Sơ đồ hoạt động Tạo phòng chờ Bảng 3.25: Use case Tạo phòng chờ
Tên Use case Tạo phòng chờ
Mô tả Chức năng này cho phép người chơi tạo phòng chờ để đánh online
Người thực hiện Người chơi Điều kiện trước xử lí
Hiển thị màn hình “Phòng chờ”
- Người chơi ở trong màn hình bắt đầu -> Nhấn “Đánh online”
- Nhập tên phòng muốn tạo vào khung bên dưới dòng chữ
Hình 3.253.26: Sơ đồ hoạt động Tìm phòng
Bảng 3.26: Use case Tìm phòng
Tên Use case Tìm phòng
Mô tả Chức năng này cho phép người chơi tìm phòng đấu online
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong màn hình bắt đầu -> Nhấn “Đánh online”
- Nhập tên phòng muốn tham gia vào khung bên dưới dòng chữ "Code phòng" -> Nhấn “Vào”
Trong màn hình “Sảnh”, người chơi có thể nhấn nút “Tự động tìm phòng” để tự động tham gia vào phòng có thể tham gia bất kỳ
Thiết lập trận đấu online
Hình 3.27: Sơ đồ hoạt động Thiết lập trận đấu online
Bảng 3.27: Use case Thiết lập trận đấu online
Tên Use case Thiết lập trận đấu online
Mô tả Chức năng này cho phép người cài đặt thông tin trận đấu online trước khi bắt đầu trò chơi
Người thực hiện Người chơi Điều kiện trước xử lí
Người thiết lập thông tin trận đấu là người tạo phòng
- Người chơi trong màn hình “Sảnh”, tạo phòng chờ
- Thiết lập thông tin cho trận đấu online
Hình 3.28: Sơ đồ hoạt động Nhắn tin
Bảng 3.28: Use case Nhắn tin
Tên Use case Nhắn tin
Mô tả Chức năng này cho phép người chơi nhắn tin với đối thủ trước trận đấu
Người thực hiện Người chơi Điều kiện trước xử lí
Người chơi tham gia phòng chờ
- Người chơi ở trong màn hình “Phòng chờ”
- Nhập tin nhắn muốn gửi cho đối thủ vào khung tin nhắn ở góc trái bên dưới -> Nhấn “Gửi”
- Khung tin nhắn cập nhật tin nhắn đã gửi
Hình 3.29: Sơ đồ hoạt động Đấu online
Bảng 3.29: Use case Đấu online
Tên Use case Đấu online
Mô tả Chức năng này cho phép người nhắn tin với đối thủ trước trận đấu
Người thực hiện Người tạo phòng Điều kiện trước xử lí
Người chơi tham gia phòng chờ đã nhấn nút “Sẵn sàng”
- Người chơi ở trong màn hình “Phòng chờ” -> Nhấn “Vào game”
- Nếu người tham gia không nhấn vào nút “Sẵn sàng”, nút
“Vào game” của người tạo phòng sẽ bị khóa
Hình 3.30: Sơ đồ hoạt động Đầu hàng Bảng 3.30: Use case Đầu hàng
Tên Use case Đầu hàng
Mô tả Chức năng này cho phép chơi đầu hàng khi đang trong trận đấu online
Người thực hiện Người chơi Điều kiện trước xử lí
- Người chơi ở trong trận đấu online -> Nhấn biểu tượng cờ trắng ở góc trên bên phải màn hình
- Nhấn nút "Quay lại phòng"
Hình 3.31: Sơ đồ hoạt động Hướng dẫn Bảng 3.31: Use case Hướng dẫn
Tên Use case Hướng dẫn
Mô tả Chức năng hướng dẫn người chơi mới
Người thực hiện Người chơi Điều kiện trước xử lí Người chơi lần đầu tiếp cận các màn hình trong trò chơi
Sau xử lí (sau Use- case)
Dòng sự kiện chính - Mở màn hình bất kỳ trong game, ngoại trừ màn hình bắt đầu Nếu đây là lần đầu tiên người chơi tiếp cận màn hình này -> Hiển thị hướng dẫn của các use case có trong màn hình đã chọn
Dòng sự kiện khác None
Phân tích và thiết kế cơ sở dữ liệu
- GameSave(user_name, bone, date, dogs, skills, passives, stores, selected_stage_id, selected_chapter_id, selected_story_id, selected_team, settings, teams, victory_count, fastest_time, online_score, chapters, selected_chapter_dir_path, story_selected_chapters, tutorial)
- settings(full_screen, language, music, sound_fx)
- teams(dog_ids, skill_ids, store_ids)
- chapterdata(shrine_maiden_of_paradise, the_battle_dogs_rising)
- statuschap(completed, passed_stage, sound_fx)
- tutorial(battlefield_basics, battlefield_rush, boss, dogbase, dogbase_after_battlefield, final_boss, map, store, upgrade, team_setup)
- StorySelect(eastern_boundaries, main_story)
- Dog(id, price, spawn_time, spawn_price)
- Skill(id, price, spawn_time)
- StageData(id, theme, music, stage_width, cat_tower_health, reward_bone, power_scale, spawn_patterns, bosses)
- bossspawn(health_at, name, buff)
Mô tả dữ liệu GameSave
STT Cột Kiểu dữ liệu Mặc định
18 selected_chapter_dir_path String
Mô tả dữ liệu upgradedata
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu upgradeitemdata
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu settings
STT Cột Kiểu dữ liệu Mặc định
2 language Enum(vi, en) vi
Mô tả dữ liệu sound
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu teams
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu chapterdata
STT Cột Kiểu dữ liệu Mặc định
1 shrine_maiden_of_paradise status_chap[]
2 the_battle_dogs_rising status_chap[]
Mô tả dữ liệu statuschap
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu tutorial
STT Cột Kiểu dữ liệu Mặc định
5 dogbase_after_battlefield Bool False
Mô tả dữ liệu StorySelect
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu Dog
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu Skill
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu Passive
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu Store
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu StageData
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu spawnpattern
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu bossspawn
STT Cột Kiểu dữ liệu Mặc định
Mô tả dữ liệu buff
STT Cột Kiểu dữ liệu Mặc định
XÂY DỰNG GAME
Đồ họa nhân vật trong game
- Nhân vật trong game được vẽ với style thân thiện, dễ thương, các nhân vật trong game đều có hoạt ảnh riêng cho từng hành động như đánh, di chuyển, ngã, đứng im, chết, …
- Đầu tiền nhân vật sẽ được thiết kế, sau đó bắt đầu tiến hành xây dựng các hoạt ảnh
Hình 4.1: Xây dựng hoạt ảnh tấn công cho Chó
- Sau khi xây dựng xong các hoạt ảnh, xuất các frame của từng hoạt ảnh đó ra thành các file ảnh riêng và gộp lại thành một sprite sheet sử dụng TexturePacker
Hình 4.2: Sprite sheet cho nhân vật Chó
- Sau khi tạo ra được spritesheet cho nhân vật, ta có thể dùng nó để tạo nhân vật chơi được trong game sử dụng Godot
- Một số nhân vật phức tạp hơn sẽ được cấu thành từ nhiều spritesheet khác nhau, chẳng hạn như nhân vật Chó Bắn Tỉa hay boss cuối game Mèo Ramiel
Hình 4.3: Hoạt ảnh cho Mèo Ramiel sử dụng 3 sprite sheet khác nhau là ramiel_cat.png, attack_effect.png và explosion.png
- Phương pháp xây dựng hoạt ảnh cho các đối tượng khác ngoài nhân vật cũng được thực hiện tương tự như trên.
Đồ họa hình ảnh game
- Đối với các đồ họa tĩnh trong game như GUI, bản đồ, v.v… Thì Clip Studio Paint và công cụ phù hợp để vẽ/thiết kế các đồ họa thuộc dạng này
- Đối với các đồ họa mà độ lớn ảnh khi sử dụng trong game không biết trước được như background của game, thảm cỏ, … Các đồ họa thuộc dạng này cần có tính seamless (liền mạch, lặp lại) để đảm bảo tính trung thực hình ảnh trong game Krita là phần mềm được phù hợp cho các đồ họa này do có một số tính năng tiện dụng cho việc vẽ các hình ảnh có tính seamless
- Hình ảnh được xây dựng xong sẽ được đưa vào dùng ngay trong Godot mà không cần thông qua phần mềm tổng hộp ảnh nào
Hình 4.4: Xây dựng đồ họa cho bản đồ của game
Xây dựng giao diện game:
Giao diện start game
Bảng 4.1: Bảng mô tả giao diện start game
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công
Khi mở ứng dụng Hiển thị đoạn hình ảnh giới thiệu về cốt truyện của trò chơi
“Bỏ qua” => Hiển thị trang
Nhấn nút “Bỏ qua” hoặc chờ cho đến khi giới thiệu game kết thúc
Giao diện hướng dẫn
Bảng 4.2: Bảng mô tả giao diện hướng dẫn
STT Chức năng Điều kiện kích hoạt
Kích hoạt thành công Ngoại lệ
Khi người chơi bước vào màn hình game chưa được hướng dẫn
Hiển thị Chó Hướng Dẫn
Chú chó này sẽ hướng dẫn người chơi tùy vào thứ đang cần được hướng dẫn
Giao diện Căn cứ Chó
Bảng 4.3: Bảng mô tả giao diện Dog base
STT Chức năng Điều kiện kích hoạt
1 Hiển thị các yêu cầu chính của trò chơi, gồm:
Viễn chinh, Nâng cấp và
2 Quay lại Nếu nhấn nút
Quay trở lại giao diện “Start game”
Giao diện nâng cấp
Bảng 4.4: Bảng mô tả giao diện nâng cấp
STT Chức năng Điều kiện kích hoạt
1 Hiển thị danh sách nhân vật, kỹ năng và nội tại trong game
Hiển thị giao diện “Nâng cấp”
“Nhân vật”/ “Kỹ năng”/ “Nội tại” để chuyển sang các danh sách tương ứng
2 Mua/ nâng cấp nhân vật trong game
Chọn nhân vật muốn mua/nâng cấp => Nhấn nút
Mua/nâng cấp nhân vật
3 Mua/ nâng cấp kỹ năng trong game
Chọn kỹ năng muốn mua/nâng cấp => Nhấn nút
Mua/nâng cấp kỹ năng
4 Mua/ nâng cấp nội tại trong game
Chọn nội tại muốn mua/nâng cấp => Nhấn nút
Mua/nâng cấp nội tại
5 Quay lại căn cứ chó
Quay trở lại giao diện “Dog base”
Hình 4.10: Nâng cấp nhân vật
Hình 4.11: Nâng cấp kỹ năng
Hình 4.12: Nâng cấp nội tại
Giao diện cửa hàng
Bảng 4.5: Bảng mô tả giao diện cửa hàng
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công
1 Hiển thị danh sách vật phẩm
Nhấn vào nút “Cửa hàng”
2 Mua vật phẩm Chọn vật phẩm muốn mua và Nhấn nút
3 Quay lại căn cứ chó
Nếu nhấn nút “Quay lại”
Quay trở lại giao diện “Dog base”
Giao diện bản đồ
Bảng 4.6: Bảng mô tả giao diện bản đồ
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công Ngoại lệ
Nhấn vào nút “Tấn công”
Hiển thị giao diện “Trận đấu”
Hiển thị giao diện “Đội hình”
3 Chọn level Nhấn vào các nút tròn trên bản đồ hoặc bấm phím trái, phải để chọn
Dog di chuyển đến các nút level
4 Quay lại căn cứ chó
Nếu nhấn nút “Quay lại”
Quay trở lại giao diện
Giao diện đội hình
Bảng 4.7: Bảng mô tả giao diện đội hình
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công
- Nhấn vào các nhân vật/ kỹ năng trong danh sách để đưa vào đội hình
- Nhấn vào các nhân vật/ kỹ năng trong đội hình để loại bỏ nhân vật khỏi đội hình Đội hình nhân vật/ kỹ năng được sắp xếp
“Skill” để chuyển sang đội hình nhân vật hoặc kỹ năng
Nhấn nút “Lưu” Di chuyển đến giao diện “Bản đồ”
Nếu nhấn nút “Quay lại”
Quay trở lại giao diện Bản đồ”
Giao diện trận đấu
Bảng 4.8: Bảng mô tả giao diện trận đấu
STT Chức năng Điều kiện kích hoạt
Nhấn vào các nhân vật
Các nhân vật tương ứng được triệu hồi
- Có thể bấm các phím 1,2,3,4,5 thay vì click vào các nút
- Nếu lượng tiền không đủ hoặc nhân vật đang trong thời gian chờ, sẽ không thể triệu hồi nhân vật
2 Chuyển danh sách nhân vật triệu hồi
“thay đổi” bên phải danh sách nhân vật triệu hồi
Chuyển sang danh sách triệu hồi khác
- Có thể bấm phím Tab thay vì click vào biểu tượng
Nhấn vào các kỹ năng
Các kỹ năng tương ứng được kích hoạt
- Có thể bấm các phím A,S,D thay vì click vào các nút
- Nếu kỹ năng đang trong thời gian chờ, kỹ năng sẽ không được kích hoạt
Nhấn vào biểu tượng ở góc trên bên trái
Lượng tiền có thể chứa trong ví tăng
- Nếu lượng tiền không đủ, ví sẽ không được nâng cấp
5 Tạm dừng Nhấn vào biểu tượng
“dừng” ở góc trên bên phải
Dừng vaHiển thị màn hình “Dừng trận đấu”
- Có thể bấm phím P thay vì click vào biểu tượng
Giao diện dừng trận đấu
Bảng 4.9: Bảng mô tả giao diện dừng trận đấu
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công Ngoại lệ
Nhấn vào nút có biểu tượng “âm nhạc” Âm thanh nhấn nút được bật/tắt
2 Tắt/bật âm nhạc nền
Nhấn vào nút có biểu tượng “loa” Âm nhạc nền được bật/tắt
Nhấn vào nút “Thoát trận đấu”
Quay trở lại giao diện
Nhấn vào nút “Màn hình chính”
Quay trở lại giao diện
Nhấn vào nút “X” Xóa màn hình “Dừng trận đấu” => Quay trở lại giao diện trận đấu => Tiếp tục trận đấu
- Có thể bấm phím P thay vì click vào nút
Giao diện sảnh chờ
Bảng 4.10: Bảng mô tả giao diện sảnh chờ
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công
1 Làm mới danh sách phòng
Nhấn vào nút “Làm mới”
Danh sách phòng được làm mới
2 Tạo phòng Nhập tên phòng vào khung bên trên nút
Tới giao diện phòng chờ
Nhấn nút “Tự động tìm phòng”
Tới giao diện phòng chờ
Hiển thị thông báo “Không tìm thấy phòng”
Nhập mã phòng vào khung bên trên nút
Tới giao diện phòng chờ
Hiển thị thông báo “Không tìm thấy phòng”
5 Quay lại căn cứ chó
Nếu nhấn nút “Quay lại”
Quay trở lại giao diện
Giao diện phòng chờ
Bảng 4.11: Bảng mô tả giao diện phòng chờ
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công Ngoại lệ
Hiển thị giao diện “Đội hình”
2 Điều chỉnh chiều dài mặt trận
Kéo thả thanh bên cạnh dòng chữ
Chiều dài mặt trận được điều chỉnh
Kéo thả thanh bên cạnh dòng chữ “Máu thành”
Máu thành được điều chỉnh
4 Điều chỉnh năng suất tạo tiền
Kéo thả thanh bên cạnh dòng chữ
Năng suất tạo tiền được điều chỉnh
5 Điều chỉnh cấp sức mạnh
Kéo thả thanh bên cạnh dòng chữ “Cấp sức mạnh”
Cấp sức mạnh được điều chỉnh
Nhấn nút bên phải dòng chữ “Nhạc” ->
Chọn nhạc nền Âm thanh nhạc nền được điều chỉnh
7 Thay đổi nền Nhấn nút bên phải dòng chữ “Nền” ->
Nền được điều chỉnh Không
8 Nhắn tin Nhập dòng chữ vào khung thoại bên trái nút “Gửi” -> Nhấn nút “Gửi”
Tin nhắn được hiển thị lên khung tin nhắn
9 Quay lại căn cứ chó
Nếu nhấn nút “Quay lại”
Quay trở lại giao diện
Giao diện cài đặt
Bảng 4.12: Bảng mô tả giao diện cài đặt
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công Ngoại lệ
Nhấn vào nút có biểu tượng “âm nhạc” Âm thanh nhấn nút được bật/tắt
2 Tắt/bật âm nhạc nền
Nhấn vào nút có biểu tượng “loa” Âm thanh nhạc nền được điều chỉnh
Kéo thả thanh bên cạnh biểu tượng “âm nhạc” Âm lượng nhấn nút được điều chỉnh
4 Điều chỉnh âm lượng nhạc nền
Kéo thả thanh bên cạnh biểu tượng
“loa” Âm lượng nhạc nền được điều chỉnh
5 Tới màn hình điều khiển
Tới giao diện “Điều khiển”
Nhấn nút bên phải dòng chữ “Ngôn ngữ” -> Chọn ngôn ngữ
Ngôn ngữ trò chơi thay đổi
7 Mở/tắt chế độ toàn màn hình
Nhấn nút switch on/off
Chế độ toàn màn hình được điều chỉnh
8 Quay lại căn cứ chó
Nếu nhấn nút “Quay lại”
Quay trở lại giao diện
Giao diện điều khiển
Bảng 4.13: Bảng mô tả giao diện điều khiển
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công Ngoại lệ
Nhấn vào nút muốn thay đổi -> Nhấn nút muốn chuyển đổi thành trên bàn phím
Thay đổi nút bấm theo yêu cầu
“Khôi phục về mặc định”
Toàn bộ thay đổi nút khôi phục về mặc định
3 Quay lại căn cứ chó
Nếu nhấn nút “Quay lại”
Quay trở lại giao diện
Giao diện credits
Bảng 4.14: Bảng mô tả giao diện credits
STT Chức năng Điều kiện kích hoạt Kích hoạt thành công Ngoại lệ
1 Quay lại căn cứ chó
Nếu nhấn nút “Quay lại”
Quay trở lại giao diện