Mục đích nghiên cứu
Củng cố kiến thức đã học và mở rộng hiểu biết bằng cách nghiên cứu lập trình với thư viện đồ họa OpenGL, cũng như tìm hiểu quy trình và công nghệ phát triển game 3D.
Nắm rõ quy trình phát triển game cũng như các công cụ được sử dụng để sản xuất một sản phẩm game
Áp dụng lập trình hướng đối tượng và ngôn ngữ C++ để phát triển game với phần mềm visual studio C++ 2008
Xây dựng game 3D Warship với nhiều chức năng lựa chọn, đồ họa thẩm mỹ nhằm cuốn hút sự quan tâm của người chơi.
Nội dung khóa luận
Nội dung khóa luận được chia làm 3 phần cụ thể như sau:
Tổng quan về đề tài
Bài viết này trình bày nội dung nghiên cứu và giải pháp thực hiện khóa luận, bao gồm bốn chương chính Chương 1 giới thiệu về công cụ sử dụng, bao gồm ngôn ngữ lập trình, trình biên dịch, cùng với những ưu và nhược điểm trong lập trình game, cũng như các công cụ hỗ trợ trong quá trình thực hiện Chương 2 cung cấp cơ sở lý thuyết về lập trình 3D, nhấn mạnh việc sử dụng thư viện đồ họa OpenGL và các kỹ thuật cơ bản trong lập trình game Chương 3 phân tích và thiết kế hệ thống, mô tả kịch bản game, từ đó xây dựng các chức năng và thiết kế module cho chương trình, đồng thời trình bày mô hình hoạt động Cuối cùng, Chương 4 trình bày quá trình cài đặt chương trình, các thuật toán được áp dụng và kết quả demo của chương trình.
Kết luận và hướng phát triển
Phương pháp nghiên cứu
Nghiên cứu lý thuyết xây dựng game 3D nhằm đưa ra một số định hướng phát triển đề tài
Trong quá trình nghiên cứu về lý thuyết thì luôn xây dựng chương trình thực hành để tìm hiểu rõ về bản chất của lý thuyết.
Công cụ sử dụng
Phần mềm Microsoft visual studio 2008 (dùng để compile code C++ của chương trình)
Phần mềm Autodesk 3ds Max (dùng để chỉnh sửa model 3D)
Thư viện đồ họa mã nguồn mở OpenGL
Ngôn ngữ cài đặt: Cài đặt chương trình bằng ngôn ngữ C++ trên window 7
Phân tích và thiết kế hướng đối tượng sử dụng UML
NỘI DUNG NGHIÊN CỨU VÀ GIẢI PHÁP THỰC HIỆN
GIỚI THIỆU VỀ CÔNG CỤ SỬ DỤNG
Ngôn ngữ lập trình
Game có thể được lập trình bằng nhiều ngôn ngữ khác nhau, tùy thuộc vào nhu cầu và sở trường của người phát triển Hiện nay, có một số xu hướng nổi bật trong việc lựa chọn ngôn ngữ lập trình để phát triển game.
Java: Thường dùng viết game cho mobile - các dòng phone hỗ trợ J2ME, hoặc viết game cho Android Ít khi dùng để viết game cho PC
C#: Khi nhắc tới C#, ta có thể nghĩ ngay đến XNA, và gắn liền với thương hiệu Microsoft Dùng viết game cho windows mobiles hoặc PC
Javascript: Dùng cho môi trường web
Objective C: Dùng cho iOS như máy MAC, iPhone, iPad
C/C++ là ngôn ngữ lập trình cơ bản và phổ biến, được giảng dạy rộng rãi trong các chương trình đại học Với tốc độ thực thi nhanh và khả năng hỗ trợ trên nhiều nền tảng như Windows, Linux, MacOS, Android, và iPhone/iPad, C/C++ trở thành lựa chọn ưa chuộng trong lập trình game Nhờ vào những ưu điểm vượt trội của C++, tôi đã quyết định sử dụng ngôn ngữ này để phát triển chương trình của mình.
Visual C++
Visual C++ là một công cụ lập trình mạnh mẽ trong Microsoft Visual Studio, cung cấp môi trường phát triển cho ngôn ngữ C/C++ trên hệ điều hành Windows Nó cho phép lập trình viên thực hiện nhiều nhiệm vụ như coding, thiết kế giao diện và thực thi lệnh Với Visual C++, người dùng có thể phát triển các ứng dụng cho Windows, ActiveX và thư viện liên kết động DLL Công cụ này đi kèm với nhiều tính năng hỗ trợ thiết kế giao diện, kiểm lỗi và sửa lỗi, giúp tăng tốc độ phát triển dự án nhanh chóng So với Java, thời gian phát triển một dự án trên Visual C++ có thể nhanh hơn gấp rưỡi đến gấp đôi Hơn nữa, Visual C++ sở hữu thư viện hàm và đối tượng phong phú, cùng với hệ thống thư viện online MDSN, tạo điều kiện thuận lợi cho việc học hỏi của lập trình viên.
1.3 Thư viện đồ họa OpenGL (Open Graphics Library)
OpenGL là thư viện đồ họa mã nguồn mở, tiêu chuẩn kỹ thuật định nghĩa giao diện lập trình ứng dụng đồ họa 3 chiều, nhưng cũng hỗ trợ cả đồ họa 2 chiều Với khoảng 250 hàm, OpenGL cho phép vẽ các cảnh phức tạp từ những hàm đơn giản, và được sử dụng phổ biến trong lập trình game cũng như các ứng dụng mô phỏng khoa học và phát triển trò chơi.
1.4 Ngôn ngữ mô hình hóa thống nhất UML (Unified Modeling Language) 1.4.1 Giới thiệu
UML (Unified Modeling Language) là ngôn ngữ mô hình hóa tổng quát được thiết kế để đặc tả và phát triển tài liệu cho phần mềm hướng đối tượng Nó giúp các nhà phát triển hiểu rõ hơn về yêu cầu phần mềm và đưa ra quyết định chính xác trong quá trình xây dựng UML bao gồm một bộ khái niệm, ký hiệu, biểu đồ và hướng dẫn, hỗ trợ việc xây dựng hệ thống hướng đối tượng thông qua việc nắm bắt cấu trúc tĩnh và hành vi động của hệ thống.
Các cấu trúc tĩnh định nghĩa các kiểu đối tượng quan trọng của hệ thống, nhằm cài đặt và chỉ ra mối quan hệ giữa các đối tượng đó
Các hành vi động định nghĩa các hoạt động của các đối tượng theo thời gian và tương tác giữa các đối tượng hướng tới đích
Dựa trên tính chất của các biểu đồ, UML chia các biểu đồ thành hai lớp mô hình:
Biểu đồ mô hình cấu trúc (Structural Modeling Diagrams): Biểu diễn cấu trúc tĩnh của hệ thống phần mềm được mô hình hóa
Biểu đồ mô hình hành vi (Behavioral Modeling Diagrams) giúp nắm bắt các hoạt động và hành vi của hệ thống, đồng thời thể hiện sự tương tác giữa các phần tử bên trong và bên ngoài hệ thống.
Biểu đồ đối tượng (Objects diagram)
Biểu đồ triển khai (Devloyment)
Biểu đồ lớp (Class diagram)
Biểu đồ thành phần (Component)
Biểu đồ mô hình cấu trúc
Hình 1 1 Biểu đồ mô hình cấu trúc
Mục đích của ngôn ngữ mô hình hóa thống nhất UML:
Mô hình hóa các hệ thống sử dụng các khái niệm hướng đối tượng
Thiết lập sự liên hệ từ nhận thức của con người đến các sự kiện cần mô hình hóa
Giải quyết các vấn đề ở mức độ thừa kế trong các hệ thống phức tạp với nhiều ràng buộc khác nhau
UML là một ngôn ngữ mô hình hóa mạnh mẽ, được thiết kế để phục vụ cho cả con người và máy móc Nó cung cấp một tập hợp các ký hiệu và quy tắc nhằm mô hình hóa các giai đoạn trong quy trình phát triển phần mềm hướng đối tượng thông qua các biểu đồ rõ ràng và dễ hiểu.
Công cụ để vẽ và thiết kế các sơ đồ UML trong đề tài này em sử dụng là phần mềm Software Ideas Modeler
Biểu đồ hợp tác () (Collaboration)
Biểu đồ hoạt động (Activity)
Biểu đồ trạng thái (Statechart)
Biểu đồ mô hình hành vi (Behavioral Modeling Diagrams)
Biểu đồ use case (Use case)
Hình 1 2 Biểu đồ mô hình hành vi
Các bước phân tích và thiết kế hướng đối tượng sử dụng biểu đồ ký hiệu UML, một ngôn ngữ mô hình hóa thống nhất UML được phát triển để mô hình hóa quá trình phát triển hệ thống phần mềm hướng đối tượng.
Xây dựng biểu đồ use case là quá trình xác định các tác nhân, use case và mối quan hệ giữa chúng dựa trên yêu cầu ban đầu, nhằm mô tả chức năng của hệ thống Một yếu tố quan trọng trong biểu đồ use case là các kịch bản, thể hiện hoạt động của hệ thống trong từng use case cụ thể.
Xây dựng biểu đồ lớp: Xác định tên các lớp, các thuộc tính của lớp, một số phương thức và mối quan hệ cơ bản trong sơ đồ lớp
Xây dựng biểu đồ trạng thái: Mô tả các trạng thái và chuyển tiếp trạng thái trong hoạt động của một đối tượng thuộc một lớp nào đó
Hình 1 3 Các bước phát triển hệ thống hướng đối tượng
Xây dựng biểu đồ tương tác, bao gồm biểu đồ hợp tác và biểu đồ tuần tự, là bước quan trọng trong việc mô tả chi tiết hoạt động của các use case Quá trình này dựa trên các kịch bản đã được xác định và các lớp trong pha phân tích, giúp làm rõ mối quan hệ và tương tác giữa các thành phần trong hệ thống.
Xây dựng biểu đồ lớp chi tiết là quá trình hoàn thiện biểu đồ lớp bằng cách bổ sung các lớp còn thiếu Việc này dựa trên biểu đồ trạng thái để thêm các thuộc tính cần thiết và dựa vào biểu đồ tương tác để xác định các phương thức cũng như mối quan hệ giữa các lớp.
Biểu đồ hoạt động là công cụ quan trọng để mô tả các hoạt động phức tạp trong từng lớp hoặc các hoạt động liên quan giữa nhiều lớp trong hệ thống Nó cung cấp nền tảng cần thiết cho việc cài đặt các phương thức trong các lớp, giúp đảm bảo tính nhất quán và hiệu quả trong quá trình phát triển phần mềm.
Xây dựng biểu đồ thành phần: Xác định các gói, các thành phần và tổ chức phần mềm theo các thành phần đó
Xây dựng biểu đồ triển khai hệ thống bao gồm việc xác định các thành phần và thiết bị cần thiết, cũng như các giao thức và dịch vụ hỗ trợ cho quá trình triển khai.
Ngôn ngữ mô hình hóa thống nhất UML (Unified Modeling Language)
UML (Unified Modeling Language) là ngôn ngữ mô hình hóa tổng quát, được thiết kế để đặc tả, phát triển và viết tài liệu cho các khía cạnh trong phát triển phần mềm hướng đối tượng Nó giúp các nhà phát triển hiểu rõ hơn và đưa ra quyết định liên quan đến phần mềm cần xây dựng UML bao gồm các khái niệm, ký hiệu, biểu đồ và hướng dẫn, hỗ trợ việc xây dựng hệ thống hướng đối tượng bằng cách nắm bắt cấu trúc tĩnh và hành vi động của hệ thống.
Các cấu trúc tĩnh định nghĩa các kiểu đối tượng quan trọng của hệ thống, nhằm cài đặt và chỉ ra mối quan hệ giữa các đối tượng đó
Các hành vi động định nghĩa các hoạt động của các đối tượng theo thời gian và tương tác giữa các đối tượng hướng tới đích
Dựa trên tính chất của các biểu đồ, UML chia các biểu đồ thành hai lớp mô hình:
Biểu đồ mô hình cấu trúc (Structural Modeling Diagrams): Biểu diễn cấu trúc tĩnh của hệ thống phần mềm được mô hình hóa
Biểu đồ mô hình hành vi (Behavioral Modeling Diagrams) giúp nắm bắt các hoạt động và hành vi của hệ thống, đồng thời thể hiện sự tương tác giữa các phần tử bên trong và bên ngoài hệ thống.
Biểu đồ đối tượng (Objects diagram)
Biểu đồ triển khai (Devloyment)
Biểu đồ lớp (Class diagram)
Biểu đồ thành phần (Component)
Biểu đồ mô hình cấu trúc
Hình 1 1 Biểu đồ mô hình cấu trúc
Mục đích của ngôn ngữ mô hình hóa thống nhất UML:
Mô hình hóa các hệ thống sử dụng các khái niệm hướng đối tượng
Thiết lập sự liên hệ từ nhận thức của con người đến các sự kiện cần mô hình hóa
Giải quyết các vấn đề ở mức độ thừa kế trong các hệ thống phức tạp với nhiều ràng buộc khác nhau
UML là một ngôn ngữ mô hình hóa mạnh mẽ, cung cấp các ký hiệu và quy tắc cần thiết để mô hình hóa các giai đoạn trong quá trình phát triển phần mềm hướng đối tượng thông qua các biểu đồ.
Công cụ để vẽ và thiết kế các sơ đồ UML trong đề tài này em sử dụng là phần mềm Software Ideas Modeler
Biểu đồ hợp tác () (Collaboration)
Biểu đồ hoạt động (Activity)
Biểu đồ trạng thái (Statechart)
Biểu đồ mô hình hành vi (Behavioral Modeling Diagrams)
Biểu đồ use case (Use case)
Hình 1 2 Biểu đồ mô hình hành vi
Các bước phân tích và thiết kế hướng đối tượng dựa trên biểu đồ ký hiệu UML, một ngôn ngữ mô hình hóa thống nhất UML được phát triển nhằm mô hình hóa quá trình phát triển hệ thống phần mềm theo hướng đối tượng.
Xây dựng biểu đồ use case là quá trình xác định các tác nhân, use case và mối quan hệ giữa chúng dựa trên yêu cầu ban đầu, nhằm mô tả chức năng của hệ thống Một yếu tố quan trọng trong biểu đồ use case là các kịch bản, giúp minh họa hoạt động của hệ thống trong từng use case cụ thể.
Xây dựng biểu đồ lớp: Xác định tên các lớp, các thuộc tính của lớp, một số phương thức và mối quan hệ cơ bản trong sơ đồ lớp
Xây dựng biểu đồ trạng thái: Mô tả các trạng thái và chuyển tiếp trạng thái trong hoạt động của một đối tượng thuộc một lớp nào đó
Hình 1 3 Các bước phát triển hệ thống hướng đối tượng
Xây dựng biểu đồ tương tác, bao gồm biểu đồ hợp tác và biểu đồ tuần tự, là bước quan trọng trong việc mô tả chi tiết hoạt động của các use case Các biểu đồ này dựa trên những kịch bản đã được xác định và các lớp đã được phân tích trong giai đoạn trước đó.
Xây dựng biểu đồ lớp chi tiết là quá trình hoàn thiện biểu đồ lớp bằng cách bổ sung các lớp còn thiếu Việc này dựa trên biểu đồ trạng thái để thêm các thuộc tính cần thiết, đồng thời sử dụng biểu đồ tương tác để xác định các phương thức và mối quan hệ giữa các lớp.
Biểu đồ hoạt động được xây dựng để mô tả các hoạt động phức tạp trong từng lớp hoặc sự tương tác giữa nhiều lớp trong hệ thống Nó đóng vai trò quan trọng trong việc cài đặt các phương thức trong các lớp, giúp đảm bảo tính nhất quán và hiệu quả trong quá trình phát triển phần mềm.
Xây dựng biểu đồ thành phần: Xác định các gói, các thành phần và tổ chức phần mềm theo các thành phần đó
Để xây dựng biểu đồ triển khai hệ thống, cần xác định rõ các thành phần và thiết bị cần thiết, cũng như các giao thức và dịch vụ hỗ trợ cho quá trình triển khai.
CƠ SỞ LÝ THUYẾT
Kiến thức cơ bản về lập trình Game
2.3.1 Vòng lặp game (Game Loop)
Hầu hết các chương trình truyền thống chỉ phản hồi theo thông điệp từ người dùng, như Word định dạng văn bản dựa trên những gì người dùng nhập vào Ngược lại, trong các chương trình game, dù người dùng có nhập thông điệp hay không, chương trình vẫn hoạt động theo một cấu trúc đã được lập trình sẵn.
Tất cả các trò chơi đều có một vòng lặp game, trong đó thực hiện các công việc lặp đi lặp lại như nhận input từ người dùng, cập nhật trạng thái game, xử lý trí tuệ nhân tạo, phát âm thanh và hiển thị đồ họa trên màn hình.
Game loop là yếu tố thiết yếu trong mọi trò chơi, không thể thiếu để đảm bảo hoạt động của game Nó giúp duy trì sự ổn định cho trò chơi, không bị ảnh hưởng bởi các tương tác của người dùng.
Hình 2 28 Một vòng lặp game đơn giản
Các vòng lặp game có thể thay đổi nhờ sự phát triễn của game nhưng hầu hết chúng đều dựa trên ý tưởng cơ bản này
Vòng lặp của game thay đổi theo nền tảng phát triển, với hai hàm chính là Update và Render Trong quá trình này, biến bool game_is_running được sử dụng để kiểm soát việc thực thi vòng lặp, đảm bảo game tiếp tục chạy cho đến khi điều kiện dừng được thỏa mãn.
Trong lĩnh vực đồ họa 2D, khái niệm sprite được sử dụng, trong đó mỗi sprite bao gồm nhiều hình ảnh khác nhau, gọi là frame Ngược lại, trong đồ họa 3D, khái niệm model xuất hiện, với mỗi model bao gồm nhiều frame, nhưng mỗi frame lại là một tập hợp các điểm tọa độ để vẽ Frame có thể được hiểu như một hình ảnh toàn màn hình, bao gồm tất cả các frame của model, sprite và cả văn bản, tức là tất cả những gì được hiển thị trên màn hình.
FPS, hay số lần vẽ khung hình trên giây, đóng vai trò quan trọng trong trải nghiệm người dùng FPS thấp có thể làm giảm cảm giác chân thực, ảnh hưởng tiêu cực đến sự tương tác của người chơi với trò chơi.
Các yếu tố làm cho FPS chậm
Hình vẽ có kích thước lớn
Tính toán trong game nhiều
Tối ưu hóa tính toán và các điều kiện thực hiện trong game:
+ Sử dụng ít vòng lặp
+ Dùng phép toán dịch chuyển bit thay cho phép nhân và phép chia
+ Khai báo các biến và phương thức ở dạng static
Caching module của các file ảnh, tối ưu hóa các module dùng để vẽ sao cho số lượng module vẽ ra là ít
Không vẽ từng sprite ra màn hình mà ta vẽ các sprite lên một ảnh và vẽ ảnh đó ra màn hình
Bỏ các hiệu ứng không cần thiết
Giới hạn số lần vẽ trên một giây trong trò chơi là cần thiết để đảm bảo ứng dụng hoạt động ổn định, đặc biệt trong các tình huống có FPS cao Việc này giúp cải thiện quá trình xử lý, ngăn chặn tình trạng người chơi không theo kịp và giảm thiểu việc tiêu tốn pin của thiết bị.
Là kích thước bộ nhớ có thể dùng để chạy chương trình game
Các yếu tố ảnh hưởng đến bộ nhớ trong game
File ảnh dùng trong game
Âm thanh dùng trong game
Các file text, mảng chứa text trong game
Tối ưu hóa bộ nhớ
Đơn giản hóa các frame và hình ảnh động
Chia ảnh ra thành các module nhỏ
Xóa các modelu dữ liệu sau khi caching
Đóng gói sound có dung lượng nhỏ, load sound khi chạy sound và giải phóng khi dừng sound
Dùng mảng 1 chiều thay vì dùng mảng 2 chiều
Chỉ giữ những đối tượng cần thiết trong bộ nhớ để tránh vẫn đề phân mảnh bộ nhớ (là các đối tượng thường dùng (fonts, main character, …))
Load khi muốn vẽ và giải phóng khi đi ra khỏi màn hình
Tránh phân mảnh bộ nhớ: load các đối tượng có kích thước lớn trước, giữ cho bộ nhớ ổn định Không load và giải phóng quá nhiều lần
Một yếu tố quan trọng trong game là phát triển trí thông minh cho nhân vật, giúp chúng có khả năng di chuyển, đưa ra quyết định về điểm đến và thực hiện chiến thuật Việc tạo ra trí thông minh đa dạng cho từng nhân vật là cần thiết để nâng cao trải nghiệm chơi game.
2.3.6 Tương tác vật lý (game physics)
Khi nhắc đến khía cạnh vật lý trong trò chơi, các định luật vật lý ảnh hưởng đến chuyển động của vật thể dưới trọng lực và các lực khác, như ma sát Người chơi thường chú ý đến các hiện tượng như lửa, khói, đường đạn, vụ nổ và sự phá hủy vật liệu Việc áp dụng vật lý trong game không chỉ tăng tính sinh động mà còn tạo ra sự hợp lý trong chuyển động của các đối tượng, mang đến cho người chơi cảm giác chân thực.
Hình 2 29 Biểu diễn một số tương tác vật lý trong game
2.3.7 Âm thanh (sound) Âm thanh đóng vai trò rất lớn và nó quan trọng không kém gì hình ảnh ở trong game Âm thanh trong game tạo ra sự hứng thú cũng như tính hấp dẫn của trò chơi, nếu không có những tín hiệu âm thanh game sẽ rất nhàm chán
Thông thường trong một video game thì âm thanh được chia làm 2 loại chính:
Nhạc nền (background music, hay gọi tắt là music): Nó là một đoạn nhạc dài được phát đi phát lại liên tục trong một hoặc nhiều state
Âm thanh hiệu ứng (hay sfx) là đoạn âm thanh ngắn gắn liền với sự kiện hoặc hành động tức thời, như tiếng đạn bắn hay tiếng sấm chớp.
Trong game, "state" được hiểu là một giai đoạn hay một màn hình cụ thể, bao gồm các phần như logo nhà sản xuất, màn hình giới thiệu, menu chính, các menu phụ và màn chơi Các state này có mối liên hệ chặt chẽ với nhau, tạo thành cấu trúc tổng thể của trò chơi Mỗi giai đoạn như vậy được gọi là một state hoặc scene.
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
Phân tích hệ thống
Game Warship là một trò chơi phòng thủ hấp dẫn, trong đó người chơi điều khiển một tàu chiến để chiến đấu chống lại nhiều tàu chiến địch Bản đồ trò chơi được phân chia rõ ràng giữa lãnh thổ của người chơi và quân địch, bao gồm lãnh hải, đảo và các khu vực khác Nhiệm vụ của người chơi là tìm kiếm và tiêu diệt các tàu chiến của địch, ngăn chặn âm mưu xâm chiếm vùng đất và lãnh hải của mình.
Tàu chiến của địch xuất phát từ ngoài lãnh hải và tiến vào khu vực của người chơi Khi phát hiện tàu của người chơi trong phạm vi nhất định, tàu địch sẽ rượt theo và tấn công cho đến khi một trong hai bên bị bắn chìm Khi khoảng cách giữa hai tàu nằm trong tầm ngắm, tàu địch sẽ xoay trái hoặc phải để tấn công Khi bị trúng đạn, tàu sẽ giảm máu (HP) và có thể bốc khói, cháy, rồi chìm Khi tàu địch bị đánh chìm, nó sẽ để lại chiến lợi phẩm là những hộp máu hoặc đạn trôi nổi trên biển.
Tàu chiến của người chơi sẽ khởi hành từ lãnh hải của mình và chỉ được hoạt động trong khu vực này Khi gặp tàu chiến địch, người chơi sẽ điều khiển tàu của mình để tấn công, tương tự như cách tàu địch bắn Mỗi lần bắn trúng tàu địch, người chơi sẽ nhận được điểm, và số điểm này sẽ được lưu lại sau khi màn chơi kết thúc Để chiến thắng, người chơi cần tiêu diệt toàn bộ tàu địch trong thời gian quy định; nếu không, game sẽ kết thúc Game Over xảy ra khi tàu chiến của người chơi bị đánh chìm hoặc khi tàu địch xâm nhập vào lãnh thổ bằng cách chạm vào cột cờ trong khu vực của người chơi.
3.2.1 Yêu cầu đặt ra đối với chương trình
Từ kịch bản game như trên chúng ta có thể đưa ra những yêu cầu chính đối với chương trình như:
Di chuyển và xoay tàu bằng các phím A, W, D, E
Người chơi có thể thay đổi các thông số mặc định về âm thanh, đồ họa, các phím điều khiển để chương trình thân thiện với người chơi hơn
Xây dựng một rada để người chơi có thể nhận biết được vị trí tàu chiến của đối phương trong một phạm vi cho phép
Chương trình có thể lưu lại kết quả của những người chơi cao để so sánh với các kết quả sau
Để tăng tính cảm giác thật phải tạo ra các hiệu ứng lúc tàu di chuyển (nghiêng khi xoay và hiệu ứng sóng nước) và bắn xuất hiện khói…
Dựa vào các yêu cầu này ta có thể thiết kế được một sơ đồ use case mô tả các chức năng chính của chương trình như sau
Hình 3 1 Sơ đồ use case của hệ thống
3.2.2 Mô tả chi tiết các chức năng a Use case Bắt đầu chơi
Tóm tắt: Use case này mô tả chức năng khi người chơi đã sẵn sàng vào màn hình chính của game để bắt đầu chơi
Dòng sự kiện: o Dòng sự kiện chính: Use case này bắt đầu khi người chơi vào màn hình chính của game (main game)
Hiển thị màn hình chính của game
Người chơi nhấn vào nút “Play”
Hiển thị giao diện trong game lúc xuất phát đã có nhân vật (tàu chiến)
Người chơi bắt đầu điều khiển tàu chiến o Dòng sự kiện khác: Không có
Các yêu cầu đặc biệt: Không có
Điều kiện tiên quyết, tình trạng hệ thống trước khi thực hiện: Người chơi phải khởi động game và đợi game load các đối tượng
Tình trạng hệ thống sau khi thực hiện: Màn hình chính chơi game xuất hiện
Điểm mở rộng: Không có b Use case Tùy chọn
Tóm tắt: Bài viết này trình bày việc điều chỉnh các thông số tùy chọn mặc định trong game nhằm đáp ứng nhu cầu và mục tiêu của người chơi.
Người chơi có thể lựa chọn giữa hai vấn đề chính là âm thanh và đồ họa, từ đó hiển thị các thông số kỹ thuật liên quan trên menu.
Hiển thị giao diện menu chính
Người chơi nhấn vào nút “Options”
Hiển thị giao diện của hộp thoại thay đổi các tùy chọn
Người chơi thay đổi các tùy chọn bằng cách kéo con lăn trên thanh tùy chọn của từng đối tượng
Người chơi cần nhấn nút “Ok” để lưu các tùy chọn đã thay đổi Nếu người chơi nhấn nút “Options” để điều chỉnh các tùy chọn nhưng sau đó chọn “Cancel” thay vì “Ok”, chương trình sẽ không lưu lại các thay đổi và sẽ quay về giá trị tùy chọn gần nhất trước đó.
Các yêu cầu đặc biệt: Không có
Trước khi thực hiện, cần lưu ý rằng các tùy chọn trong game sẽ ở trạng thái mặc định ngay sau khi khởi động, nếu chưa có bất kỳ thay đổi nào được thực hiện.
Tình trạng hệ thống sau khi thực hiện: Chương trình sẽ lưu và thực hiện theo các tùy chọn mới nếu sau khi thay đổi nhấn nút “Ok”
Điểm mở rộng: Không có c Use case Điểm cao
Tóm tắt: Use case này cho người chơi biết hiện tại ai đã chơi và chơi game này với 5 số điểm cao nhất trong các lần chơi trước
Tác nhân: Người chơi và máy tính
Dòng sự kiện: o Dòng sự kiện chính: Use case này bắt đầu khi người chơi nhấn vào nút
“High scores” tại màn hình menu của game
Hiển thị giao diện menu chính
Người chơi nhấn vào nút “High scores”
Hiển thị giao diện high score của game cho biết tên năm người chơi với số điểm cao nhất trong các lần chơi gần nhất
Người chơi có thể nhấn nút “Ok” để thoát khỏi màn hình điểm cao và trở về menu chính của game Nếu muốn thiết lập lại tất cả điểm số sau khi xem điểm cao của các người chơi trước, người chơi chỉ cần nhấn nút tương ứng.
Các yêu cầu đặc biệt: Không có
Điều kiện tiên quyết, tình trạng hệ thống trước khi thực hiện: Điểm cao của các người chơi trước được lưu lại và hiển thị trong hệ thống
Tình trạng hệ thống sau khi thực hiện: Màn hình high score cho người chơi biết số điểm mình có vượt các người chơi trước hay không
Điểm mở rộng: Không có d Use case Trợ giúp
Tóm tắt: Use case này sẽ hiển thị hướng dẫn cho người chơi biết cách sử dụng bàn phím, chuột…để chơi game
Tác nhân: Người chơi và máy tính
Dòng sự kiện: o Dòng sự kiện chính: Use case này bắt đầu khi người chơi nhấn vào nút
“Help” tại màn hình menu chính của chương trình
Hiển thị menu chính của game
Người chơi nhấn vào nút “Help”
Hiện thị giao diện trợ giúp hướng dẫn cho người chơi cách chơi game
Người chơi nhấn nút “Ok” để thoát khỏi màn hình trợ giúp và quay trở lại màn hình menu chính của game
Các yêu cầu đặc biệt: Không có
Điều kiện tiên quyết, tình trạng hệ thống trước khi thực hiện: Người chơi sử dụng phần mềm game lần đầu tiên cần phải biết cách chơi, điều khiển
Tình trạng hệ thống sau khi thực hiện: Màn hình trợ giúp hướng dẫn người chơi cách chơi
Điểm mở rộng: Không có e Use case Thoát game
Tóm tắt: Use này hoạt động thì chương trình sẽ thoát game
Tác nhân: Người chơi và máy tính
Dòng sự kiện: o Dòng sự kiện chính: Use case bắt đầu khi người chơi nhấn nút “Exit” trên màn hình menu chính của chương trình
Hiển thị màn hình menu chính của game
Người chơi nhấn vào nút “Exit”
Giao diện xác nhận việc thoát xuất hiện
Khi người chơi nhấn nút "Ok", chương trình sẽ tự động thoát Nếu giao diện xác nhận xuất hiện và người chơi không muốn thoát, họ có thể nhấn nút "No" để quay lại giao diện menu chính.
Các yêu cầu đặc biệt: Không có
Điều kiện tiên quyết, tình trạng hệ thống trước khi thực hiện: Người chơi đang trong màn hình menu chính của chương trình game
Tình trạng hệ thống sau khi thực hiện: Chương trình sẽ thoát, nếu người chơi muốn chơi tiếp phải khởi động lại game
Điểm mở rộng: Không có f Use case Nhập tên
Người dùng có thể nhập tên người chơi sau khi kết thúc game (Win hoặc Over game) để lưu lại số điểm, nhưng chỉ khi số điểm hiện tại cao hơn số điểm cao nhất trong 5 lần chơi trước đó.
Tác nhân: Người chơi và máy tính
Dòng sự kiện: o Dòng sự kiện chính: Use case này được thực hiện khi người chơi kết thúc quá trình chơi
Hiển thị hộp thoại nhập tên
Người chơi nhập tên của mình vào ô trống
Người chơi nhấn nút “Ok”
Xuất hiện thông báo “Save complete”
Người chơi nhấn nút “Ok”
Chương trình sẽ trở về màn hình menu chính của game Nếu người chơi không nhấn “Ok” trong hộp thoại nhập tên mà chọn “Cancel”, điểm số của họ sẽ không được lưu và màn hình sẽ trở lại menu chính.
Các yêu cầu đặc biệt: Bắt buộc người chơi phải nhập tên vào texbox
Trước khi thực hiện, người chơi cần hoàn thành quá trình chơi game với trạng thái thắng hoặc thua Để đủ điều kiện, số điểm hiện tại phải cao hơn 5 số điểm cao nhất trước đó.
Tình trạng hệ thống sau khi thực hiện: Chương trình sẽ lưu lại tên người chơi và số điểm, giá trị này được hiển thị trong mục high score
Điểm mở rộng: Không có
Các use case hoạt động
Các use case trong game mô tả các hoạt động của nhân vật tàu chiến của người chơi và đối thủ Những use case này bao gồm các hoạt động mở rộng như di chuyển, bắn đạn, nhặt item và chết Trong đó, use case di chuyển đóng vai trò quan trọng trong việc điều khiển nhân vật.
Tóm tắt: Use case này mô tả cách di chuyển tàu chiến theo các hướng trong bản đồ
Tác nhân: Người chơi và máy tính
Người chơi có thể điều khiển tàu chiến trong game bằng các phím W (tiến), A (trái), D (phải) và S (lùi lại) để di chuyển đến vị trí mong muốn.
Hiển thị giao diện chơi chính
Nhấn một hoặc tổ hợp phím A, W, D, S để di chuyển tàu chiến theo hướng người chơi mong muốn
Tàu chiến sẽ di chuyển liên tục khi người chơi giữ phím, và sẽ dừng lại từ từ theo hướng trước đó khi người chơi thả tay khỏi tất cả các phím.
Khi tàu chiến di chuyển qua trái, phải thì tàu sẽ nghiêng về một phía để tạo cảm giác thật trong 3D
Thiết kế hệ thống
4.1.1 Load model *.obj a Model 3D là gì?
Khi nghiên cứu công nghệ 3D, khái niệm model 3D là rất quan trọng, vì nó không chỉ đại diện cho đối tượng mà còn là hình ảnh thực của vật thể Model 3D cho phép gán vật liệu, ánh sáng và tô bóng, tạo ra hình ảnh chân thực, điều này cần thiết trong giai đoạn thiết kế Để đánh giá mức độ chi tiết của các model, người ta thường tính số đa giác (polygon) trong mỗi model Ví dụ, các game cũ như Half-Life hay Warcraft 3 thường có số polygon cho mỗi nhân vật không vượt quá 1000, trong khi các game hiện đại có thể từ 1000 đến 2500 polygon Mặc dù việc sử dụng nhiều polygon giúp tạo ra hình ảnh mịn màng hơn, nhưng nó cũng tiêu tốn nhiều bộ nhớ DRAM của card màn hình và làm giảm tốc độ xử lý.
Trong thiết kế game, các nhân vật chính và trùm thường được tạo dựng với nhiều polygon hơn để tăng tính thẩm mỹ, trong khi quái vật và nhân vật phụ thường có ít polygon hơn Việc tạo model cho game thường sử dụng các phần mềm như 3DS Max, Maya và một số phần mềm 3D khác Các định dạng model phổ biến bao gồm mdl, mdl2, x, 3ds và obj, trong đó định dạng obj nổi bật với cấu trúc rõ ràng, cho phép mở và chỉnh sửa dễ dàng bằng Notepad.
File obj là định dạng lưu trữ khung của mô hình 3D, bao gồm các điểm và mặt tạo nên mô hình Cấu trúc của file obj rất đơn giản, giúp dễ dàng trong việc quản lý và sử dụng mô hình.
CÀI ĐẶT VÀ KẾT QUẢ CHƯƠNG TRÌNH
Cài đặt chương trình
4.1.1 Load model *.obj a Model 3D là gì?
Khi nghiên cứu công nghệ 3D, khái niệm model 3D là rất quan trọng, vì nó không chỉ đại diện cho đối tượng mà còn là hình ảnh thực của vật thể Trên model 3D, người dùng có thể gán vật liệu, ánh sáng và tô bóng để tạo ra hình ảnh chân thực, điều này rất cần thiết trong giai đoạn thiết kế Để đánh giá mức độ chi tiết của các model, người ta thường tính số đa giác (polygon) sử dụng để dựng lên model Ví dụ, các game cũ như Half-Life hay Warcraft 3 thường có số polygon cho mỗi nhân vật không vượt quá 1000, trong khi các game hiện nay có thể từ 1000 đến 2500 polygon Mặc dù số polygon cao hơn giúp nhân vật mịn màng hơn, nhưng cũng đồng nghĩa với việc tiêu tốn nhiều tài nguyên đồ họa và có thể làm giảm hiệu suất xử lý.
Trong thiết kế game, các nhân vật chính và trùm thường được tạo hình với nhiều polygon hơn để tăng tính thẩm mỹ, trong khi các quái vật và nhân vật phụ không quan trọng lại có ít polygon hơn Quá trình dựng model thường sử dụng các phần mềm như 3DS Max, Maya hoặc các phần mềm 3D khác Định dạng model phổ biến bao gồm mdl, mdl2, x, 3ds và obj, trong đó định dạng obj nổi bật nhờ cấu trúc rõ ràng, cho phép người dùng mở và chỉnh sửa bằng notepad.
File obj là định dạng chứa cấu trúc của mô hình 3D, bao gồm các điểm và mặt tạo nên mô hình Cấu trúc của một file obj rất đơn giản và dễ hiểu.
Hình 4 1 Cấu trúc model obj
Văn bản sau dấu # là ghi chú về file obj
v là vertex – danh sách các điểm của model, x, y, z là các tọa độ của vertex đó
vt là texture coordinate – tọa độ texture ứng với đỉnh đó, x, y lần lượt là tọa độ các texture
vn là vertex normal – vector pháp tuyến tại đỉnh
f là face – có công thức tổng quát
f v1/[vt1]/[vn1] v2/[vt2]/[vn2]… vx/[vtx]/[vnx]
Trong định nghĩa về mặt phẳng, các điểm cấu thành được ký hiệu là v1, v2, …, vx, với vt1 là tọa độ texture liên quan đến điểm v1, và vn1 chỉ ra hướng của điểm v1, quyết định quá trình backface culling Bài viết này sẽ hướng dẫn cách đọc và vẽ mô hình obj bằng cách sử dụng thư viện đồ họa OpenGL.
Trong OpenGL, việc tải mô hình 3D bao gồm việc đọc tất cả các thành phần như (v, vt, vn, f) vào mảng Sau đó, chúng ta sẽ vẽ các đỉnh và mặt, sử dụng vt để áp dụng texture cho mô hình, trong khi vn được dùng cho mục đích chiếu sáng.
4.1.2 Thuật toán đồng bộ hóa frame Đồng bộ hóa frame là một kỹ thuật làm cho hành ảnh chuyển động trong game được mịn Trong game có nhiều đối tượng với nhiều hình ảnh đồ họa được vẽ liên tục Nếu cứ mỗi lần có 1 đối tượng thay đổi ta lại cập nhật lên màn hình thì sẽ không tạo được cảm giác các đối tượng chuyển động đồng thời Để giải quyết vấn đề này chúng ta chờ tất cả các đối tượng thay đổi rồi mới cập nhật lên màn hình
Khi game chạy, có lúc các xử lý diễn ra nhanh chóng, có lúc lại chậm, dẫn đến việc các đối tượng di chuyển không đồng đều, gây cảm giác game bị giật Để khắc phục tình trạng này, chúng ta quy định thời gian cập nhật màn hình là cố định Sau khi hoàn thành tất cả các xử lý trong một frame, chúng ta sẽ kiểm tra xem thời gian thực hiện có đủ cho một frame hay không Nếu thời gian thực hiện nhỏ hơn quy định, chúng ta sẽ đợi đến khi đủ thời gian trước khi cập nhật lên màn hình.
Hình 4 2 Sơ đồ thuật toán đồng bộ frame
4.1.3 Thuật toán di chuyển ngẫu nhiên cho tàu chiến, kiểm tra va chạm ranh giới
Tàu chiến di chuyển ngẫu nhiên trên mặt biển với posX, posZ, rotY thay đổi
posX, posY, posZ là vị trí hiện tại của tàu chiến
rotY là góc dùng xác định phương, hướng của tàu chiến khi khởi tạo
v là vận tốc tàu chiến
rotRadY là gốc quay của tàu chiến tính bằng radian
Hình 4 3 Sơ đồ thuật toán di chuyển tàu ngẫu nhiên
Kết quả chương trình
Sau khi cài đặt bài toán trong một khoảng thời gian nhất định, chương trình đã xây dựng được một khung game cơ bản Từ đó, có thể dễ dàng phát triển một trò chơi 3D hoàn chỉnh, kết hợp giữa giải trí và giáo dục trong thế giới game.
4.2.1 Màn hình menu chính của game
Hình 4 4 Màn hình chính của game
4.2.2 Màn hình chính trong game
Hình 4 5 Màn hình khi đang chơi game
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Kết quả đạt được
Cũng cố lại các kiến thức về ngôn ngữ lập trình C++ và lập trình hướng đối tượng
Nắm được các kiến thức cơ bản về quá trình làm game 3D, các kỹ thuật được sử dụng để phát triển một game 3D
Biết cách sử dụng thư viện đồ họa mã nguồn mở OpenGL trong lập trình đồ họa, đặc biệt là trong lập trình game 3D
Load được model *obj lên màn hình sử dụng các kỹ thuật của thư viện đồ họa OpenGL như light,…
Xây dựng được cấu trúc của game Warship 3D hoàn thành 70% so với phân tích và thiết kế ban đầu
2 Hướng phát triển của đề tài
Nghiên cứu các kỹ thuật phát triển game 3D để hoàn thiện các phần còn lại của game Warship 3D với mục đích có thể chơi được trên mọi máy tính
Nghiên cứu cách lập trình game 3D trên các thiết bị di động như điện thoại nhằm đưa game lên trên các thiết bị đó.