Trên hệ máy PDP-1 14Hình 3.2 Code di chuyển cho background 16Hình 3.3 Lớp cơ sở GameMonoBehaviour 17 Hình 3.5 Cấu trúc của ShipController 19Hình 3.6 Cấu trúc chung của GameObject Ship 19
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
ĐỒ ÁN 1 XÂY DỰNG GAME 2D BẮN PHI THUYỀN VŨ TRỤ
VỚI UNITY
GV HƯỚNG DẪN: ĐINH NGUYỄN ANH DŨNG
SV THỰC HIỆN:
Dín Hiền Dũng - 20521205 Nguyễn Hoàng Phúc - 20521768
TP HỒ CHÍ MINH, 2023
Trang 2LỜI CẢM ƠN
Lời đầu tiên em xin chân thành cảm ơn sự hướng dẫn tận tình của thầy ĐinhNguyễn Anh Dũng - giảng viên hướng dẫn Đồ án 1 đã hỗ trợ những thông tin cầnthiết và giải đáp những thắc mắc cho nhóm trong suốt quá trình thực hiện đề tài
Đồng thời nhóm em cũng muốn gửi lời cảm ơn đến các anh chị khóa trên,đặc biệt là những anh chị trong khoa đã chia sẻ những kinh nghiệm quý báu về mônhọc cũng như những kiến thức liên quan
Vì kiến thức của chúng em vẫn còn hạn hẹp nên không thể tránh khỏi nhữngthiếu sót trong quá trình thực hiện đồ án Vì vậy nhóm chúng em luôn mong đợinhận được những ý kiến đóng góp quý báu từ phía giảng viên để qua đó có thể rútkinh nghiệm, tự sửa chữa, hoàn thiện bản thân mình trên tinh thần nghiêm túc, tựgiác học hỏi Một lần nữa nhóm chúng em xin chân thành cảm ơn thầy
Thành phố Hồ Chí Minh, 05 tháng 07 năm 2023
Sinh viên
DÍN HIỀN DŨNGNGUYỄN HOÀNG PHÚC
Trang 3MỤC LỤC
Chương 1 MỞ ĐẦU
1.1 Tổng quan đề tài
1.2 Lý do chọn đề tài
1.3 Mục tiêu
1.4 Phạm vi nghiên cứu
Chương 2 CƠ SỞ LÝ THUYẾT
2.1 Unity
2.2 Aseprite
2.3 C#
2.4 Microsoft Visual Studio
Chương 3 THIẾT KẾ VÀ PHÁT TRIỂN
3.1 Tổng quan
3.1.1 Tên game
3.1.2 Thể loại
3.2 Gameplay
3.2.1 Mục tiêu
3.2.2 Tiến trình
3.3 Thiết kế
3.3.1 Game manager
3.3.2 Background
3.3.3 Base Class
3.3.4 Ship
3.3.5 Ability
3.3.6 Spawner
Trang 43.3.7 Despawn
3.3.8 Bullet
3.3.9 Laser
3.3.10 Enemy
3.3.11 Item
3.3.12 WaveManager
3.3.13 LevelManager
3.3.14 User interface
Chương 4 THIẾT KẾ CLASS
4.1 Class Diagram
4.1.1 Ship Class Diagram
4.1.2 Enemy Class Diagram
4.1.3 Bullet Class Diagram
4.1.4 Level and Wave Class Diagram
4.1.5 Item Class Diagram
4.1.6 Ability Class Diagram
4.2 Danh sách class
4.2.1 Danh sách class thuộc ShipPlayer
4.2.2 Danh sách class thuộc Enemy
4.2.3 Danh sách class thuộc Bullet
4.2.4 Danh sách class thuộc Level and Wave
4.2.5 Danh sách class thuộc Item
4.2.6 Danh sách class thuộc Ability
Chương 5 USE CASE
5.1 Sơ đồ USE CASE
5.1.1 Player
Trang 55.1.2 Enemy
5.2 Danh sách tác nhân
5.3 Danh sách USE CASE
5.4 Mô tả chi tiết USE CASE
5.4.1 Trở về màn hình chính
5.4.2 Chọn phi thuyền
5.4.3 Chọn màn chơi
5.4.4 Xem thông tin nhà phát triển
5.4.5 Di chuyển của người chơi
5.4.6 Sử dụng kỹ năng
5.4.7 Gây sát thương
5.4.8 Nhận sát thương
5.4.9 Nhặt vật phẩm
5.4.10 Rơi vật phẩm
5.4.11 Di chuyển của Enemy
Chương 6 TỔNG KẾT
6.1 Kết quả đạt được
6.2 Hạn chế
6.3 Hướng phát triển
DANH MỤC HÌNH
Hình 1.1 Một số game shoot ’em up phổ biến 3
Trang 6Hình 2.1 Unity game engine 5Hình 2.2 Giao diện unity 6Hình 2.3 Sự khác biệt giữa phép chiếu perspective và phép chiếu orthographic 8
Hình 2.5 Hình 2.5 C# Logo 11Hình 2.6 Microsoft Visual Studio Logo 12Hình 3.1 Spacewar! Trên hệ máy PDP-1 14Hình 3.2 Code di chuyển cho background 16Hình 3.3 Lớp cơ sở GameMonoBehaviour 17
Hình 3.5 Cấu trúc của ShipController 19Hình 3.6 Cấu trúc chung của GameObject Ship 19Hình 3.7 Cấu trúc của Ability 20Hình 3.8 Cấu trúc Component Script của một Spawner 21Hình 3.9 Lớp Abstract Despawn 23Hình 3.10 Hàm CanDespawn được triển khai trong lớp DespawnByDistance 24Hình 3.11 Hàm CanDespawn được triển khai trong lớp DespawnByTime 24Hình 3.12 Bullet Shuriken 25Hình 3.13 Cấu trúc của lớp BullerController 26Hình 3.14 Cấu trúc của GameObject Bullet 26
Trang 7Hình 3.24 Cấu trúc của LevelManager 34Hình 3.25 Màn hình chính 36Hình 3.26 Màn hình chọn phi thuyền 36Hình 3.27 Màn hình thông tin nhà phát 37Hình 3.28 Màn hình chọn màn chơi 37Hình 3.29 Màn hình GamePlay 38Hình 3.30 Màn hình tạm dừng 38Hình 3.31 Màn hình thua cuộc 39Hình 3.32 Màn hình thắng màn chơi 39Hình 4.1 Ship Class Diagram 40Hình 4.2 Enemy Class Diagram 41Hình 4.3 Bullet Class Diagram 42Hình 4.4 Level and Wave Class Diagram 43Hình 4.5 Item Class Diagram 44Hình 4.6 Ability Class Diagram 45Hình 5.1 Player Use Case Diagram 51Hình 5.2 Enemy Use Case Diagram 52
DANH MỤC BẢNG
Trang 8Bảng 4.1 Bảng danh sách class thuộc ShipPlayer 46Bảng 4.2 Bảng danh sách class thuộc Enemy 47Bảng 4.3 Bảng danh sách class thuộc Bullet 48Bảng 4.4 Bảng danh sách class thuộc Level and Wave 49Bảng 4.5 Bảng danh sách class thuộc Item 49Bảng 4.6 Bảng danh sách class thuộc Ability 50Bảng 5.1 Bảng danh sách tác nhân 53Bảng 5.2 Bảng danh sách USE CASE 54Bảng 5.3 Bảng mô tả chi tiết use case trở về màn hình chính 54Bảng 5.4 Bảng mô tả chi tiết use case chọn phi thuyền 55Bảng 5.5 Bảng mô tả chi tiết use case chọn màn chơi 56Bảng 5.6 Bảng mô tả chi tiết use case xem thông tin nhà phát triển 56Bảng 5.7 Bảng mô tả chi tiết use case di chuyển của người chơi 57Bảng 5.8 Bảng mô tả chi tiết use case sử dụng kỹ năng 57Bảng 5.9 Bảng mô tả chi tiết use case gây sát thương 58Bảng 5.10 Bảng mô tả chi tiết use case nhận sát thương 59Bảng 5.11 Bảng mô tả chi tiết use case nhặt vật phẩm 60Bảng 5.12 Bảng mô tả chi tiết use case rơi vật phẩm 60Bảng 5.13 Bảng mô tả chi tiết use case di chuyển của Enemy 61
TÓM TẮT ĐỒ ÁN
Trang 9Ngày nay, ngành công nghiệp trò chơi điện tử là một trong những ngành lớnnhất và phát triển nhanh nhất xung quanh, cung cấp việc làm cho nhiều người và cómột thị trường rất lớn Từ những năm 1950 cho đến nay, nhiều thể loại trò chơi điện
tử khác nhau đã được tạo ra phù hợp với thị hiếu của nhiều người khác nhau Trong
số đó, trò chơi Shoot 'em up chủ yếu bao gồm một người chơi cố gắng hoàn thànhtrò chơi trong khi tránh các chướng ngại vật khác nhau có thể bao gồm kẻ thù, vậtthể môi trường hoặc các loại đạn khác nhau Chúng em luôn quan tâm đến việc tựmình phát triển một thứ, điều đó đã dẫn chúng em cân nhắc thực hiện dự án này:một trò chơi điện tử 2D thuộc thể loại bắn súng, mà chúng em đã đặt tên là SpaceInvader UT2D
Đồ án này tập trung vào việc phát triển một trò chơi 2D bắn phi thuyền vũtrụ với giao diện người dùng hấp dẫn, hệ thống gameplay phong phú và đồ họa đẹpmắt Trò chơi này được phát triển trên nền tảng Unity, một công cụ phổ biến tronglĩnh vực phát triển trò chơi
Bằng cách tạo ra Space Invader UT2D, chúng em đã học được cách thiết kếtrò chơi điện tử và được phát triển Quá trình này bao gồm việc sử dụng các cáccông cụ thiết kế đồ họa Aseprite, cũng như công cụ Unity và ngôn ngữ lập trình C#
để kết hợp chúng thành một trò chơi hoạt động trơn tru Sử dụng các asset 2D miễnphí trên mạng cũng như một số được chúng em tự thiết kế bằng Aseprite, chúng đãthiết kế nhiều đối tượng đồ họa cho trò chơi này trong đó bao gồm các phi thuyềnkhông gian khác nhau, phi thuyền Boss phức tạp và đa dạng các vật thể như là cácvật phẩm và các loại đạn trong màn chơi
Phần cuối cùng của khóa luận là trình bày kết quả đã thực hiện lên cuốn báocáo, đưa ra kết luận và hướng phát triển cho hệ thống trong tương lai
Nội dung khóa luận được trình bày trong 6 chương:
- Chương 01: MỞ ĐẦU
Trình bày sơ bộ về thực trạng, nhu cầu thực tế Xác định mục tiêu và phạm vi đề tài
- Chương 02: CƠ SỞ LÝ THUYẾT
Trang 10Giới thiệu, trình bày các kiến thức kỹ thuật, công nghệ mà nhóm sử dụng.
- Chương 03: THIẾT KẾ VÀ PHÁT TRIỂN
Trình bày, phân tích và thiết kế các thành phần cốt lõi của trò chơi
- Chương 04: THIẾT KẾ CLASS
Trình bày chi tiết mô hình các đối tượng được sử dụng trong trò chơi thông qua cácCLASS DIAGRAM
- Chương 5: USE CASE
Trình bày chi tiết nội dung thiết kế USE CASE trong trò môi
Trang 11trung vào thể loại bắn súng góc nhìn từ trên xuống còn được gọi là shoot 'em up,
đây là một trong những thể loại trò chơi rất phổ biến hiện nay với lối chơi đơn giảnnhưng hứng thú, dựa theo nhu cầu giải trí của người chơi, nhóm chúng em quyếtđịnh chọn đề tài này
Hình 1.1 Một số game shoot ’em up phổ biến
Trang 121.3 Mục tiêu
Từ lúc nhỏ, chúng em đã dành vô số thời gian để chơi trò chơi điện tử.Theo thời gian, chúng em bắt đầu phân tích các trò chơi và đặt ra những câuhỏi: họ đã làm điều đó như thế nào?, em có thể tự làm được không? Dầndần, em từng bước phát triển được những trò chơi đơn giản và phát hiện rarằng lập trình game rất thú vị Và chúng em đã ấp ủ tạo ra được một trò chơihoàn chỉnh và phát hành trên cửa hàng ứng dụng
Do đó, mục tiêu chính của dự án này là thiết kế và phát triển hoàntoàn một trò chơi điện tử 2D thuộc thể loại bắn súng, mang tên SpaceShooter U2TD, đồng thời dành thời gian để học các nguyên tắc và công cụkhác nhau cần thiết để phát triển trò chơi Để có thể đạt được mục tiêu chínhnày, chúng em đã chia dự án thành một tập hợp của các mục tiêu khác nhau
mà từ đó các nhiệm vụ cụ thể được tạo ra sau đó Những chỉ tiêu này baogồm:
● Tìm hiểu tổng quan về kiến trúc của Unity và phương pháp xây dựngcác ứng dụng trong Unity
● Luyện tập khả năng phân tích, thiết kế cấu trúc của một ứng dụng tròchơi điện tử
● Ứng dụng toán học và vật lý để xây dựng logic cho trò chơi
● Đóng góp cho cộng động một trò chơi để giải trí sau những giờ họctập, lao động căng thẳng
1.4 Phạm vi nghiên cứu
1.4.1 Phạm vi môi trường:
Ứng dụng trò chơi điện tử chạy trên Android
1.4.2 Phạm vi chức năng:
● Cung cấp cho người chơi một trò chơi giải trí ngoại tuyến
● Hệ thống giao diện thân thiện, dễ sử dụng
● Hệ thống môi trường và đa dạng cấu trúc màn chơi
Trang 13● H th ng tệ thống tương tác giúp người chơi di chuyển và điều khiển ống tương tác giúp người chơi di chuyển và điều khiển ương tác giúp người chơi di chuyển và điều khiển.ng tác giúp người chơi di chuyển và điều khiển.i ch i di chuy n và đi u khi n.ơng tác giúp người chơi di chuyển và điều khiển ển và điều khiển ều khiển ển và điều khiển.
● H th ng k đ ch và tệ thống tương tác giúp người chơi di chuyển và điều khiển ống tương tác giúp người chơi di chuyển và điều khiển ẻ địch và tương tác gây sát thương của kẻ địch ịch và tương tác gây sát thương của kẻ địch ương tác giúp người chơi di chuyển và điều khiển.ng tác gây sát thương tác giúp người chơi di chuyển và điều khiển.ng c a k đ ch.ủa kẻ địch ẻ địch và tương tác gây sát thương của kẻ địch ịch và tương tác gây sát thương của kẻ địch
● H th ng đ h a pixel b t m t, h p d n.ệ thống tương tác giúp người chơi di chuyển và điều khiển ống tương tác giúp người chơi di chuyển và điều khiển ồ họa pixel bắt mắt, hấp dẫn ọa pixel bắt mắt, hấp dẫn ắt mắt, hấp dẫn ắt mắt, hấp dẫn ấp dẫn ẫn
Trang 14Chương 2 CƠ SỞ LÝ THUYẾT
2.1 Unity
Unity là game engine hoàn toàn miễn phí mạnh mẽ với lượng công cụ đadạng, đáp ứng gần như đầy đủ nhu cầu phát triển hoàn chỉnh một tựa game của cácstudio indie Unity hiện nay còn hỗ trợ triển khai lên đến 27 nền tảng khác nhau,trong đó có cả nền tảng mục tiêu của nhóm là Android và iOS Đặc biệt, nhữngcông cụ xây dựng game 2D của Unity rất nổi trội khi so sánh với những engine khácnhư Unreal Ngoài ra, nguồn tài nguyên asset và plugin phong phú, bao gồm cảmiễn phí lẫn có phí, giúp nới rộng giới hạn sáng tạo
Hình 2.1 Unity game engine
Trang 15Hình 2.2 Giao diện unityUnity [21] là một công cụ trò chơi (khung) được sử dụng để phát triển tròchơi đa nền tảng, được tạo bởi Unity Technologies Nó cung cấp một bộ công cụtiên tiến và API để giúp phát triển trò chơi dễ dàng hơn cho các nhà phát triển Cácngôn ngữ chính được sử dụng trong đó là C# và JavaScript Các thành phần Unityđược sử dụng trong dự án này được trình bày chi tiết như sau:
GameObject: Nó là một lớp cơ sở cho tất cả các đối tượng Unity có trong tròchơi
Component: Component là những thành phần có chức năng riêng biệt, đượcgán vào một hoặc nhiều Game Object Component bổ sung, cấu thành chức năngcho Game Object Từ đó, giúp chúng ta xây dựng lên những Game Object theo từngyêu cầu của game Mỗi script kế thừa từ lớp MonoBehaviour đều được coi là mộtcomponent
Resources: lớp này cho phép bạn tìm và truy cập Đối tượng bao gồm cảassets Trong trình chỉnh sửa, có thể sử dụng Resources.FindObjectsOfTypeAll đểđịnh vị nội dung và đối tượng Cảnh Có thể truy cập tất cả nội dung trong thư mục
có tên "Resources" ở bất kỳ đâu trong thư mục Assets thông qua các hàm
Trang 16Resources.Load Nhiều thư mục "Resources" có thể tồn tại và khi tải các đối tượng,mỗi đối tượng sẽ được kiểm tra.
Prefab: Nó cho phép người dùng lưu trữ GameObject với tất cả các thànhphần kèm theo và thuộc tính của nó, đồng thời nó hoạt động giống như một khuônmẫu mà từ đó các đối tượng mới có thể được tạo ra với các thuộc tính có sẵn vàđược đặt vào cảnh trò chơi
Scene: Nó chứa các đối tượng của trò chơi, ví dụ mỗi cấp độ trong trò chơi làmột Scene
Camera: Nó được sử dụng để hiển thị nội dung của cảnh và có hai loại cácphép chiếu (xem Hình 2.3): orthographic and perspective Trong phép chiếuorthographic, các đối tượng không cần phải có chiều sâu và chúng có vẻ bằngphẳng phép chiếu này là được sử dụng nhiều nhất trong các trò chơi 2D Về phépchiếu perspective, nó cho thấy thế giới theo giống cách mà chúng ta nhìn thấy.Trong trường hợp này, các đối tượng có độ sâu cho chúng ta khả năng phân biệtchúng một cách dễ dàng và chính xác đánh giá khoảng cách từ người quan sát đếnđối tượng Loại hình chiếu này là phổ biến nhất thường được sử dụng trong các tròchơi 3D Ví dụ, cho hai đối tượng giống nhau kích thước nhưng ở các khoảng cáchkhác nhau từ người quan sát, trong phép chiếu perspective đối tượng gần nhất có vẻlớn hơn đối tượng khác, trong khi ở dạng orthographic hình chiếu chúng dường như
có cùng kích thước bất kể khoảng cách
Trang 17Hình 2.3 Sự khác biệt giữa phép chiếu perspective và phép chiếu orthographic
Transform: Nó xác định vị trí, góc quay và tỷ lệ của từng đối tượng trongScene Lưu ý rằng mọi GameObject đều có thành phần Transform
RigidBody và RigidBody2D: Nó được gắn vào GameObject và đặt nó dưới
sự kiểm soát của công cụ vật lý Unity, làm cho đối tượng có thể bị ảnh hưởng bởitrọng lực và được điều khiển bằng các lực khác nhau như trọng lực chẳng hạn Nócũng được sử dụng bởi các lớp Collider và Collider2D để phát hiện va chạm giữacác đối tượng khác nhau
Collider và Collider2D: Chúng được sử dụng để phát hiện va chạm giữa cácGameObject, có thành phần RigidBody hoặc Rigidbody2D được đính kèm đối với
nó Lưu ý rằng một GameObject có thể có nhiều máy va chạm được gắn vào nó chocác chức năng nâng cao
Script: Nó là một thành phần được sử dụng để kiểm soát logic trò chơi bằng
mã Script trong Unity có thể được viết bằng ngôn ngữ lập trình C# hoặc JavaScript
Texture: Đó là một hình ảnh bitmap, có thể ở các định dạng khác nhau,chẳng hạn như PNG, BMP hoặc JPG
Trang 18Sprite: Là đối tượng đồ họa 2D tương đương với mô hình 3D trong môitrường 3D, nhưng đơn giản hơn vì Sprite chỉ là một Texture Một Sprite duy nhấtcũng có thể chứa các phần khác nhau của cùng một đối tượng có thể được lắp ráptrong Scene Unity và được sử dụng để làm các hoạt ảnh động cho nó.
SpriteRenderer: Mỗi Sprite cần một đối tượng SpriteRenderer để có thể kếtxuất nó trong một Scene SpriteRenderer cũng cung cấp một API đặc biệt để kiểmsoát Sprite, cho phép thay đổi màu sắc của nó và chia nó thành nhiều phần
Canvas: Nó là một đối tượng đại diện cho khu vực trong đó tất cả các phần
tử giao diện người dùng được đặt trong nó, chẳng hạn như menu trò chơi hoặcthông tin liên quan cho người chơi
LineRenderer: Nó được sử dụng để tạo và vẽ một đường nối giữa hai hoặcnhiều điểm trong không gian 2D hoặc 3D
Tag and Name: Để xác định GameObject trong tập lệnh, mỗi đối tượng cómột Tag and Name
PlayerPrefs: Đây là một lớp tĩnh vừa lưu trữ vừa truy cập các tùy chọn củangười chơi và dữ liệu giữa các phiên trò chơi Giá trị của chúng có thể được lưu vàomột trong ba loại: int, float và string Trong mã, chúng được truy xuất bằng cách sửdụng dictionaries
Trang 192.2 Aseprite
Hình 2.4 Logo AsepriteAseprite là một phần mềm đồ họa chuyên nghiệp được sử dụng để tạo vàchỉnh sửa đồ họa Pixel Art Được phát triển bởi David Capello, Aseprite cung cấpmột loạt các công cụ và tính năng được thiết kế đặc biệt để làm việc với hình ảnhpixel
Với Aseprite, bạn có thể tạo ra các hình ảnh pixel độc đáo và tạo ra hiệu ứngchuyển động cho game, hoạt hình và nhiều dự án sáng tạo khác Giao diện sử dụngđơn giản và trực quan của phần mềm này giúp bạn dễ dàng điều khiển các công cụ
và tạo ra nội dung pixel tuyệt đẹp
Một số tính năng chính của Aseprite bao gồm:
● Công cụ vẽ: Bạn có thể vẽ, tô màu và chỉnh sửa các hình ảnh pixeltheo ý muốn
● Công cụ animation: Aseprite hỗ trợ tạo và chỉnh sửa các khung hình
để tạo hiệu ứng chuyển động mượt mà
● Lớp và mask: Bạn có thể sử dụng các lớp và mask để tạo ra các hiệuứng phức tạp và dễ dàng chỉnh sửa các thành phần riêng lẻ của hìnhảnh
Trang 20● Palette và dithering: Aseprite cung cấp các công cụ để làm việc vớibảng màu và áp dụng kỹ thuật dithering để tạo ra hiệu ứng gradient vàsắc nét.
● Export và import: Bạn có thể xuất và nhập các hình ảnh và animationvào nhiều định dạng file khác nhau, bao gồm GIF, PNG, và các địnhdạng hỗ trợ cho game và ứng dụng di động
● Aseprite đã trở thành công cụ phổ biến trong cộng đồng Pixel Art vàgame phát triển viên Nó cung cấp một nền tảng mạnh mẽ và linh hoạt
để tạo ra nội dung pixel đẹp mắt và chuyển động sống động
2.3 C#
Hình 2.5 Hình 2.5 C# LogoC# (hay C sharp) là một ngôn ngữ lập trình đơn giản, được phát triển bởi độingũ kỹ sư của Microsoft vào năm 2000 C# là ngôn ngữ lập trình hiện đại, hướngđối tượng và được xây dựng trên nền tảng của hai ngôn ngữ mạnh nhất là C++ vàJava
Trong các ứng dụng Windows truyền thống, mã nguồn chương trình đượcbiên dịch trực tiếp thành mã thực thi của hệ điều hành
Trong các ứng dụng sử dụng NET Framework, mã nguồn chương trình (C#,VB.NET) được biên dịch thành mã ngôn ngữ trung gian MSIL (Microsoft
Trang 21intermediate language) Sau đó mã này được biên dịch bởi Common LanguageRuntime (CLR) để trở thành mã thực thi của hệ điều hành
C# với sự hỗ trợ mạnh mẽ của NET Framework giúp cho việc tạo một ứngdụng Windows Forms hay WPF (Windows Presentation Foundation), phát triểngame, ứng dụng Web, ứng dụng Mobile trở nên rất dễ dàng
2.4 Microsoft Visual Studio
Hình 2.6 Microsoft Visual Studio LogoMicrosoft Visual Studio là một môi trường phát triển tích hợp (IDE) từMicrosoft Microsoft Visual Studio còn được gọi là "Trình soạn thảo mã nhiềungười sử dụng nhất thế giới ", được dùng để lập trình C++ và C# là chính Nó được
sử dụng để phát triển chương trình máy tính cho Microsoft Windows, cũng như cáctrang web, các ứng dụng web và các dịch vụ web Visual Studio sử dụng nền tảngphát triển phần mềm của Microsoft như Windows API, Windows Forms, WindowsPresentation Foundation, Windows Store và Microsoft Silverlight Nó có thể sảnxuất cả hai ngôn ngữ máy và mã số quản lý
Visual Studio hỗ trợ nhiều ngôn ngữ lập trình khác nhau và cho phép trìnhbiên tập mã và gỡ lỗi để hỗ trợ (mức độ khác nhau) hầu như mọi ngôn ngữ lập trình.Các ngôn ngữ tích hợp gồm có C,[4] C++ và C++/CLI (thông qua Visual C++),
Trang 22VB.NET (thông qua Visual Basic.NET), C# (thông qua Visual C#) và F# (như củaVisual Studio 2010[5]) Hỗ trợ cho các ngôn ngữ khác như J++/J#, Python và Rubythông qua dịch vụ cài đặt riêng rẽ Nó cũng hỗ trợ XML/XSLT, HTML/XHTML,JavaScript và CSS.
Microsoft cung cấp phiên bản "Express" (đối với phiên bản Visual Studio
2013 trở về trước) và "Community" (đối với bản Visual Studio 2015 trở về sau) làphiên bản miễn phí của Visual Studio
Trang 23Chương 3 THIẾT KẾ VÀ PHÁT TRIỂN
3.1 Tổng quan
3.1.1 Tên game
Space Invader UT2
3.1.2 Thể loại
Shoot 'Em Up, còn được gọi là shmup, là một thể loại trò chơi điện tử trong
đó nhân vật do người chơi điều khiển tham gia vào trận chiến chống lại kẻ địch,đồng thời phải tránh tất cả các cuộc tấn công sẽ sắp diễn ra có thể bao gồm các loạiđường đạn của kẻ địch, chướng ngại vật trên bản đồ và bản thân kẻ địch
Hình 3.1 Spacewar! Trên hệ máy PDP-1Nguồn gốc của thể loại bắn súng có thể bắt nguồn từ một trong những tròchơi máy tính sớm nhất từng được tạo ra, Spacewar! (xem Hình 3.1) Được pháttriển trên máy tính phòng thí nghiệm tại Khuôn viên của Viện Công nghệMassachusetts (MIT) vào năm 1961, trò chơi đang chạy trên máy tính PDP-1 của
Trang 24DEC Nó bao gồm hai người chơi điều khiển phi thuyền vũ trụ và cố gắng tiêu diệtmột chiếc khác bằng cách bắn đạn và để tránh bị hút bởi trường hấp dẫn của mặttrời.
3.2 Gameplay
3.2.1 Mục tiêu
Tiêu diệt toàn bộ kẻ địch xuất hiện trên màn hình bằng cách điều khiển phithuyền (trượt màn hình), có thể kích hoạt các kỹ năng có sẵn (không trong thời gianhồi chiêu)
● LoadStartUp: khởi động màn dạo đầu khi vào Level
● CheckOnLoseLevel: kiểm tra trạng thái khi người chơi thua
● CheckOnWinLevel: kiểm tra trạng thái khi người chơi thắng
● LevelWin: thực hiện luồng khi người chơi thắng
● LevelLose: thực hiện luồng khi người chơi thua
Hầu hết các tập lệnh đều cần GameController cho các chức năng khác nhau
Vì vì lý do đó, GameController phải là một đối tượng Singleton và được khởi tạovào thời điểm bắt đầu Level và tồn tại xuyên xuống quá trình người chơi hànhđộng
Trang 253.3.2 Background
Background là một đối tượng đóng vai trò là nơi chứa phần nền, nó đượcthiết kế để luôn hiển thị hoạt ảnh di chuyển xuống với tốc độ xác định và lặp lại liêntục từ nó giúp tạo hiệu trông như ShipPlayer đang di chuyển
Trò chơi được thực hiện theo cách mà Camera luôn đứng yên và mọi thứđang thực sự chuyển động là hậu cảnh
Hình 3.2 Code di chuyển cho background
3.3.3 Base Class
Tất cả các lớp trong Script đều được kế thừa từ một lớp chung có tên làGameMonoBehaviour nhằm hạn chế lặp lại code, lớp này có tác dụng tạo một đốitượng kế thừa hàm LoadComponent, hàm này được gọi trong Awake và Reset để tảicác Component tương ứng của GameObject vào các có trong lớp được kế thừa
Trang 27Hình 3.3 Lớp cơ sở GameMonoBehaviour
3.3.4 Ship
Hình 3.4 Ảnh Ship_1Đối tượng Ship (xem Hình 3.4), là đối tượng được điều khiển bởi ngườichơi Có thể thực hiện các hành động như là bắn đạn và laser, di chuyển vào trongkhông gian camera, nhặt các vật phẩm, sử dụng kỹ năng, chịu sát thương Nó là mộtGameObject được xây dựng từ nhiều GameObject khác nhau, mỗi GameObject sẽ
có một hoặc nhiều Component Script để xử lý tương ứng
● Model: dùng để hiển thị hình ảnh của Ship và các hiệu ứng di chuyểncũng như hiệu ứng bắn đạn
● Movement: Quản lý điều khiển di chuyển của đối tượng Ship
● Shooting: Quản lý việc tấn của Ship Mỗi Ship sẽ có loại đạn tươngứng
● Level: Quản lý cấp độ của Ship, đây là cấp độ của Ship trong mànchơi, cấp càng cao thì hỏa lực của Ship càng mạnh, nhiều đường đạnhơn
● Looter: Quản lý việc nhặt vật phẩm khi Ship chạm vào vật phẩm trênmàn hình
Trang 28● DamageReceiver: Quản lý việc nhận sát thương Tính toán để trừ máucủa phi thuyền khi trúng đạn hoặc chạm phải kẻ địch.
● Ability: Quản lý kỹ năng của Ship Ship sẽ có hai kỹ năng là Shield vàPowerUp
Tất cả các Component Script của các GameObject trên được quản lý bởiShipController, đây là lớp phụ trách chứa các liên kết để làm trung gian cho cácComponent Script của Ship, khi một Component Script tương tác với ComponentScript khác thì phải thông qua ShipController
Hình 3.5 Cấu trúc của ShipController
Trang 29Hình 3.6 Cấu trúc chung của GameObject Ship
3.3.5 Ability
Lớp Ability là lớp cơ sở đại diện cho kỹ kỹ năng mà đối tượng nào mang nó
có thể thực hiện, đại diện ở đây là ShipPlayer, quản lý việc kích hoạt khả năng củaShipPlayer bao gồm AbilityController, mỗi Ability sẽ có hiệu ứng và trạng tháikhác nhau, thông tin của Ability đều được lưu trữ trong thư mục Resource
Hình 3.7 Cấu trúc của AbilityCác ShipPlayer được xây dựng bao gồm:
● HealAbility: Kích hoạt qua việc nhặt vật phẩm, hiệu ứng sẽ hồi máungười chơi
Trang 30● ShieldAbility: Kích hoạt qua kỹ năng và nhặt vật phẩm, hiệu ứng tạokhiên triệt tiêu đạn của Enemy
● PowerUpAbility: Kích hoạt qua kỹ năng, hiệu ứng tăng một lượng lớntốc độ bắn của ShipPlayer
● Missile: Kích hoạt qua việc nhặt vật phẩm, hiệu ứng bắn một loạt lênlửa theo dõi Enemy
3.3.6 Spawner
Đối tượng Spawner chứa Component Script Spawner là một Base Class dùng
để quản lý việc khởi tạo các đối tượng nhiều và liên tục trên Scene
Spawner là một lớp áp dụng mẫu thiết kế theo kiểu Holder và Object Pool.Object Pool được sử dụng để quản lý bộ nhớ đệm lưu trữ các đối tượng Object poolthông thường hoạt động theo kiểu : tự tạo đối tượng mới nếu mình chưa có sẵn hoặc
sử dụng đối tượng có sẵn trong pool
Dùng 3 attribute là Prefabs, Pool Object và Holder
● Prefabs: chứa các đối tượng mà sẽ được khởi tạo trong tương lai
● Pool Objects: chứa các đối tượng bị hủy
● Holder: Quản lý các đối tượng được khởi tạo và chưa bị hủy
Hình 3.8 Cấu trúc Component Script của một Spawner
Trang 31Các lớp kế từ lớp Spawner này bao gồm:
● BulletSpawner: Quản lý việc khởi tạo Bullet
● ItemDropSpawner: Quản lý việc khởi tạo Item
● EnemySpawner: Quản lý việc khởi tạo Enemy
● FXSpawner: Quản lý việc khởi tạo FX (hiệu ứng va chạm, hiệu ứngnổ, )
● EnemyFormationSpawner: Quản lý việc khởi tạo EnemyFormation,đội hình Enemy
Trang 32Hình 3.9 Lớp Abstract DespawnCác lớp kế thừa của lớp này bao gồm lớp DespawnByDistance vàDespawnByTime:
● DespawnByDistance: Quản lý việc hủy đối tượng theo khoảng cách từđối tượng này tới đối tượng mục tiêu được chọn
Trang 33Hình 3.10 Hàm CanDespawn được triển khai trong lớp DespawnByDistance
● DespawnByTime: Quản lý việc hủy đối tượng theo thời gian
Hình 3.11 Hàm CanDespawn được triển khai trong lớp DespawnByTime
Trang 343.3.8 Bullet
Hình 3.12 Bullet ShurikenĐối tượng Bullet (xem Hình 3.12), là đối tượng được tạo ra bởi đối tượngBulletSpawner Là nguồn gây sát thương chính của ShipPlayer cũng như Enemy
Nó là một GameObject được xây dựng từ nhiều GameObject khác nhau, mỗiGameObject sẽ có một hoặc nhiều Component Script để xử lý tương ứng
● Model: dùng để hiển thị hình ảnh của Bullet và các hiệu ứng dichuyển
● BulletFly: Quản lý điều khiển hướng di chuyển của Bullet
● Despawn: Quản lý việc hủy của Bullet
● DamageSender: Quản lý việc gây sát thương của Bullet
● BulletImpact: Quản lý việc xác định va chạm và truyền sát thương củaBullet sang cho đối tượng có chứa Component DamageReceiver.Tất cả các Component Script của các GameObject trên được quản lý bởiBulletController, đây là lớp phụ trách chứa các liên kết để làm trung gian cho cácComponent Script của Bullet, khi một Component Script tương tác với ComponentScript khác thì phải thông qua BulletController
Trang 35Hình 3.13 Cấu trúc của lớp BullerController
Hình 3.14 Cấu trúc của GameObject BulletMột số các loại đạn đặt biệt sẽ có được thêm các GameObject với cácComponent Script tương ứng, bao gồm:
● BulletBouncy: Kế thừa từ class Bounceable Loại đạn này sẽ bị phản
xạ theo một góc bằng với góc tới khi va chạm vào hai bên màn hình
● BulletMissile: Loại đạn này sẽ tự động xác định Enemy và truy đuổi
● BulletDisperse: Loại đạn này sẽ tự động đột ngột chuyển hướng khi
di chuyển một khoảng thời gian
● BulletSeparate: Loại đạn này sẽ tự động tách ra theo số lượng tùychọn khi di chuyển một khoảng thời gian