Chương 3: mô tả nội dung của dòng game sẽ được xây dựng trong đề tài, với thể loại game được lựa chọn là game chiến lược bao gồm các thành phần trong game, logic thể hiện trong game giữ
Trang 1tiếp sức cho sự ra đời của các game có đồ họa đẹp mắt và âm thanh sống động Ngành công nghiệp game mang lại những lợi nhuần khổng lồ cho các hãng sản xuất
Nội dung của đề tài thực hiện bao gồm việc tìm hiểu công nghệ làm game trên XNA
framework, đưa ra các mô tả về dòng game của dòng game chiến lược thời gian thực Đồng
thời, đề tài cũng nêu và đưa ra các giải pháp cho các vấn đề phát sinh trong quá trình thực
hiện một ứng dụng game trên dòng game chiến lược này Đe tài không dừng lại ở mức xây dựng một ứng dụng game cụ thể, mà xây dựng một dòng game, trong đó bao gồm cả việc
xây dựng các công cụ hỗ trợ cho việc phát triển dòng game này, bao gồm công cụ xây dựng bản đổ vùng chiến sự, công cụ giúp chuẩn hóa tài nguyên
Nội dung đề tài bao gồm 6 chương:
Chương 1: Mở đầu
Chương 2: XNA framework và XNA Game Studio
Chương 3: Một số vấn đề và giải pháp về đồ họa 2D trong game với XNA
Chương 4: Một số vấn đề và giải pháp về việc xử lý trong game Chương 5: Kiến
trúc game Chương 6: Kết luận
Trang 21.1 Tồng quan 1
1.2 Giới thiêu XNA 2
1.3 Mục tiêu đề tài 2
1.4 Nôi dung đề tài 3
Chương 2 XNA framework và XNA Game Studio 4
2.1 Giới thiêu 4
2.2 Kiến trúc XNA và các trạng thái xử lý trong trò chơi 4
2.2.1 Kiến trúc XNA 4
2.2.2
Quản lý các xử lý trong trò chơi 5
2.2.3
Quản lý tài nguyên trong XNA 6
2.2.4 Các thiết bi tương tác 7
Chương 3 Một số vấn đề và giải pháp về đồ họa 2D trong game với XNA 8
3.1 Load hình ảnh từ các tải nguyên đồ hoa và nap vào ứng dung game 8
3.2 Vẽ hình ảnh và các thống tin dang chuỗi ra màn hình 9
3.3 Xây dưng các màn hình nhâp liêu, nút bấm và menu 10
Chương 4 Môt số vấn đề và giải pháp về viẽc xử lý trong game .1
2 4.1 Xây dụng bản đồ 12
4.2 Xác đinh các ô thuộc vùng Viewport 13
4.3 Thể hiên bản đồ qua Viewport 15
4.4 Thể hiên các đối tuơng thuôc vùng Viewport 16
4.5 Cuôn và di chuyển Viewport 18
Trang 3Xử lý tấn công của quân lính 23
4.9 Vấn đề khai thác tài nguyên 25
4.10 Hiệu ứng âm thanh 26
4.11 Minimap 27
4.12 Hiển thi thông tin Công trình Quân lính Đôi chơi trên menu game■■■■ 28 4.13 Xử lý xây dựng Công trình 29
4.14 Xử lý mua quân lính 30
4.15 Bổ sung đối tương động 31
4.16 Thưc hiên hiêu ứng đồ hoa particle cho đòn tấn công từ cácquân lính 32 4.17 Mở rông cho người chơi thông minh 33
Chương 5 Kiến trúc game 36
5.1 Tổng quan 36
5.2 Sơ đồ lớp môt số thành phần chính trong game 37
5.2.1 Sơ đồ lớp giao diên 37
5.2.2 Sơ đồ lớp xử lý 39
Chương 6 Kết luân 43
6.1 Các két quả đạt được 43
6.1.1 ứng dụng game được xây dựng 43
6.1.2 Công cu xây dưng bản đồ vùng chiến sư - Map editor 45
6.1.3 Công cu chuẩn hổa tài nguyên hình ảnh - ResGenerator 47
Trang 4A.1 Trân chiến 49
A.2 Nguời chơi 49
A3 Mỏ tài nguyên 51
A4 Công trình 51
A5 Quân lính 54
A6 Công nghệ 57
A7 Xây dụng công trình 57
A8 Mua quân lính từ các công trình 58
A9 Tấn công đối phuơng 58
A 10 Khai thác tài nguyên 59
Phu lue B Các tiên ích hỗ trơ tùy biến game 60
B l ứng dụng chuẩn hóa tài nguyên 60
B.l.l Giới thiêu 60
B.1.2 Mô tả ứng dung 60
B.1.3 Cấu trúc các tâp tin, thu mue input 63
B.1.4 Cấu trúc các tâp tin, thu mue output 64
B.2 ứng dụng hỗ trợ tao bản đồ 66
B.2.1 Mô tả ứng dụng 66
B.2.2 Kỹ thuât dung bản đồ 67
Trang 5Hình 2.3 Sơ đồ luồng xử lý của ứng dụng vái XNA framework 6
Hình 2.4 Qui trình serialize hổa tài nguyên 7
Hình 3.1 Môt panel trong ứng dung game 11
Hình 4.1 Mô tả cách lát bản đồ 13
Hình 4.2 Trường hạp lát map không hợp lệ 13
Hình 4.3 Trường hạp lát map hạp lệ 13
Hình 4.4 Cách vẽ Viewport 14
Hình 4.5 Cách lát các ô hình ảnh rời rac lẽn bản đồ 15
Hình 4.6 Cách xác đinh các đối tương đươc vẽ ra màn hình 18
Hình 4.7 Tọa đô của góc trái trên vùng Viewport thay đổi khi cổ tín hiệu input 19
Hình 4.8 Tâp các hình ảnh mô tả hành đông của quân lính 21
Hình 4.9 Di chuyển quân lính theo từng ô 22
Hình 4.10 Minimap 28
Hình 4.11 Sơ đồ luồng xử lý phát sinh đối tương đông 32
Hình 5.1 Kiến trúc game 36
Hình 5.2 Các đối tượng hỗ trạ vẽ bản đồ 37
Hình 5.3 Các đối tương trên bản đồ 38
Hình 5.4 Môt số đối tương trung chuyển dữ liêu chính 39
Hình 5.5 Môt số đối tương đoc ghi dữ liêu chính 40
Trang 6Hình 6.1 Màn hình game chính 44
Hình 6.2 Các quân lính và hiệu ứng trên màn hình game chính 45
Hình 6.3 Bản đồ của game chính 46
Hình 6.4 Màn hình của công cu hỗ trơ dưng giao diên 46
Hình 6.5 Màn hình chính ứng dung Resource Generator 47
Hình 6.6 Màn hình chính ứng dụng chinh sửa tài nguyên ảnh 47
Hình A.7 Công trình trong game 52
Hình A.8 Quá trình xây dựng công trình 53
Hình A.9 Sơ đồ logic xây dưng công trình 53
Hình A.10 Các công trình trong game 54
Hình A.ll.Môtsố quân lính trong game 54
Hình A.12 Các quân lính đánh nhau 56
Hình A.13 Các loai quân lính trong game 57
Hình A.14 Môt số loai công nghê trong game 57
Hình B.15 Giao diên chính ứng dung 61
Hình B.16 Màn hình chính dang thu nhỏ 62
Hình B.18 Màn hình của ứng dụng hỗ trợ dựng bản đồ 66
Hình B.19 Các ô bản đồ được chia thành nhỏm theo địa hình 67
Hình B.20 Ố đươc chon ngẫu nhiên đầu tiên 68
Hình B.21 ■ Ố bản đồ phù hơp với ô số 1 ở hưởng 4 69
Hình B.22 Ố bản đồ phù hơp với ô số 1 ở hưởng 3 69
Trang 8Bảng 5.2 Các đối tương trên bản đồ 39
Bảng 5.3 Một số đối tưạnsosotrung chuyển dữ liệu chính 39
Bảng 5.4 Một số đối tượng đọc ghi dữ liệu chính 40
Bảng 5.5 Đối tương xử lý tính toán chính cho bản đồ 41
Bảng 5.6 Các đối tương xử lý cho thành phần Factory 41
Trang 9MỞ đầu
JễfNội dung chương này giới thiệu tong quan về nhu cầu và xu hưởng phát triển
game và dòng game dựa trên các game framework và game engine; đồng
thời giới thiệu về công nghệ XNA của Microsoft Phần cuối chương này trình
bày mục tiêu và nội dung của đề tài
1.1 Tổngquan
Sức mạnh cốt lõi của công nghệ giải trí game chính là do cỗ máy “game engine” và Game Framework cung cấp
Game Framework là một tập hợp thư viện chứa các hàm và đối tượng hỗ trợ, cho phép
vẽ, xử lý hoạt cảnh, xây hiệu ứng âm thanh từ các tài nguyên có sẵn, được xây dựng với mục đích có tính tái sử dụng cao nhất có thế, từ đó các game engine được xây dựng
Game engine có thể được hiểu như một middleware (phần mềm lớp giữa) Nói theo cách khác, Game Engine là phần mềm kiểm soát mọi hoạt động, tương tác của một trò chơi,
từ kỹ thuật đến cách chơi, logic game
Dựa trên các tiền đề này, các nhà sản xuất đã xây dựng ra các dòng game nổi trội trong làn giải trí game, với nội dung phong phú như dòng game nhập vai Diablo, Prince Of Persia , dòng game chiến lược Age Of Wonder, Age Of Empire với máy PC và dòng game nhập vai Final Fantasy, Kingdom Heart với hệ máy Nintendo, Play Station Các phiên bản sản phẩm trong dòng game này được các nhà sản xuất xây dựng từng bước, từ giao diện 2D thô sơ ban đầu được nâng cấp lên giao diện đồ họa 3D Nhưng có một điều mà các dòng game này không thay đổi hoặc thay đổi rất ít qua mỗi phiên bản của chúng là nội dung chính của trò chơi, cốt lõi của các dòng game Không nằm ngoài con đường đó, đề tài này xây dựng những bước ban đầu cho một dòng game của thể loại game chiến lược dựa trên nền Microsoft XNA Framework
Trang 101.2 Giới thiệu XNA
Hiện nay XNA framework đã được nâng cấp đến phiên bản 3.0 So với phiên bản 2.0, XNA framework 3.0 là sự mở rộng lớn cung cấp những tính năng dễ sử dụng, tiến đến gần mục tiêu sản xuất ra các dạng game chạy trên nhiều nền tản, cố khả năng chia sẽ với thế giới game trong Xbox360, Window và bây giờ là trên Zune
1.3 Mục tiêu đề tài
Mục tiêu của đề tài bao gồm:
• Nghiên cứu công nghệ MicrosoftXNA Framework 3.0
• Mô tả nội dung của dòng game chiến lược
• Xác định, phân tích các vấn đề và đề ra các giải pháp để phát triển game thuộc dòng game được chọn với công nghệ Microsoft XNA framework
Trang 11Trên các cơ sở tìm hiểu và phân tích, nhóm xây dựng thử nghiệm dòng game chiến lược
thời gian thực trên nền tảng XNA Framework 3.0 với thể hiện đồ họa 2D
1.4 Nội dung đề tài
Đe tài bao gồm 8 chương, chia thành 3 phần nội dung chính:
Chương 1: giới thiệu tổng quan về nhu cầu và xu hướng phát triển game và dòng game dựa
trên các game framework và game engine Giới thiệu về công nghệ XNA của Microsoft, đồng thời nêu lên mục tiêu và nội dung của đề tài
Chương 2: giới thiệu và XNA framework và XNA game studio,cách thức thực thi game và
thể hiện nội dung game bằng hình ảnh, input và âm thanh
Chương 3: mô tả nội dung của dòng game sẽ được xây dựng trong đề tài, với thể loại game
được lựa chọn là game chiến lược bao gồm các thành phần trong game, logic thể hiện trong game giữa các thành phần
Chương 4: trình bày một số vấn đề và giải pháp về đồ họa 2D trong game với XNA
Chương 5: trình bày một số vấn đề và giải pháp về việc xử lý trong game Chương 6: trình
bày kiến trúc của game được xây dựng Chương 7: trình bày các công cụ tiện ích được xây
dựng hỗ trợ cho game
Chương 8: trình bày kết quả đạt được của đề tài và hướng phát triển
Trang 12Chương 2
XNA framework và XNA Game Studio
framework vồ XNA game studỉo,cách thức thực thi game và thể hiện nội dung game bằng hình ảnh, input và âm thanh trong công nghệXNA
và bây giờ có cả Zuñe
2.2 Kiến trúc XNA và các trạng thái xử lý trong trò chơi
2.2.1 Kén trúc XNA
Kiến ưúc XNA bao gầm các thành phần xử lý đồ họa, âm thanh, toán học, quá trình nhập xuất, mạng
Trang 13XNÂ ViiunlSt^diD Coiirtent Device
Hình 2.2 Kiến tróc phân tầng của XNA framework
(Nguồn: [9])
2.2.2 Quản tý các xử tý ừong ừồ choi
Bước đầu tiên trong việc xây dựng một game là tạo ta một lớp kế thừa từ
Microsoft.Xna.Framework.Game , lớp này phải khai báo override các phương thức Update, Draw, LoadContent và Initialize Phương thức Update có trách nhiệm xử lý logic của game
và phương thức Draw cố trách nhiệm vẽ các thành phần củã game ra màn hình Phương thức
Initialize cùng với hàm contructor có trách nhiệm khởi tạo các giá trị ban đầu cho các thành
phần đằ họa, âm thanh và input trong game Phương thức LoadContent load tài nguyên đồ họa bào gồm các hình ảnh sẽ vẽ trong game và UnloadContent có trách nhiệm giải phóng
tài nguyên đồ họa
Mô hình luồng xử lý của ứng dụng trò chơi với framework XNA có thể được
mô tả như sau:
Trang 14Hình 2.3 Sơ đồ luồng XV lý của úng dụng vói XNÁ framework
Quá trình thực thỉ các trạng thái xử lỷ của một game đơn giản cố thể được trình bày như sau :
• Initialize § - Khởi tạo các đối tượng
• LoadContentQ - Nạp các tài nguyên như: hình ảnh, âm thanh, v.v
• RunQ - chạy vòng lặp của ứng dụng
o Update{) — Thực hiện các tính toán, xử lý cập nhật thông tin cho các đối tượng dữ liệu tại đây o DrawQ - Thực hiện các thao tác vẽ
ra màn hình nội dung của game thông qua các tài nguyên đã nạp và được thực thỉ xử lý
• UnỉoadContentQ - Giải phống các tài nguyên
2.2.3 Quản Ịý tài nguyên trong XNA
❖ Đối tượng serialize hóa tài nguyên Content Pileline
XNA Game Studio Content Pipeline là một tính năng quan trọng do XNA cung cấp bởi vì nó đơn giản hóa việc người phát triển game load các tài nguyên hình ảnh, âm thanh từ các định dạng khác nhau một cách dễ dàng Do đó, người lập
Trang 15nào để đọc nội dung của chứng Tử các định dạng khác nhau, thông qua quá trình xử lý với XNA Game Studio Content Pipeline sẽ được chuyển thành định dạng dạng chung cho tất cả
là.xnb, nội dung tập tin này sẽ được nạp và đọc vào bộ
nhớ trong ứng dụng game XNA nhờ Content manager
Hình 2.4 Quì trình serialize hóa tài nguyên
❖ XNA Audio System
Trong XNA framework 3.0 đã cung cấp lớp SoundEffect hoặc (SoundEffectlnstance) Việc sử dụng hai lớp này đơn giãn hơn dùng XACT, và XACT không hoạt động trên Zune, nên giải pháp của phiên bản 3.0 sẽ là một tùy chọn tốt cho các game ưên Zune
2.2.4 Các thỉét bị tương tác
Input là thuật ngữ chung để nói đến quá trình nhận các thao tác từ người dùng Trong
XNA, namespace Mỉcrosoft.Xna.Framework.ĩnput đã cho phép hỗ trợ các thiết bị input khác
nhau bao gôm gaxnepa d(Xbox360), gamestỉck, chuột máy tính và bàn phím
Trang 16Chương 3
trong game với XNA
Nội dung chương này đề cập đến các vẩn đề về đồ họa 2D trong XNA
framework, các giải pháp load và thể hiện hình ảnh, chuỗi kí tự trong ứng
p Giải pháp
Đưa hình ảnh có sẵn vào thư mục Content được tạo cùng với ứng dụng game khi vừa
tạo mới Hình ảnh được đưa vào thư mục Content có định dạng *.jpg, *.bmp, *.png, Khi ứng dụng game được biên dịch, các hình ảnh được chuyển đổi thành định dạng xnb, đây là các định dạng sẽ được ứng dụng game sử dụng để nạp và vẽ khi ứng dụng game thực thi
Để nạp hình ảnh vào ứng dụng game, dùng thuộc tính Content của lớp Game do XNA
cung cấp để load hình ảnh từ đường dẫn đến tên tập tin xnb đã được biên dịch bằng phương
thức Load< T >(string path) của thuộc tính Content
Ví dụ:
Texture2D textture = this.Game.Content.Load<Texture2D>
I "Sprites\\Unit\\ Archon_Archer\\000_Archon_Archer_IDLE.1.01") ) ;
Trang 17♦> Kết luận
Việc load hình ảnh 2D trong ứng dụng game XNA được thực hiện thông qua phương
thức Load<Texture2D> của thuộc tính Content trong lớp Game Hình ảnh được load là hình
ảnh có sẵn trong thư mục Content của chương trình đã được biên dịch sang định dạng *.xnb
mà game XNA có thể thể hiện được
3.2 Vẽ hình ảnh và các thông tin dạng chuỗi ra màn hình
Đe sử dụng được các phương thức Draw và Drawstring cần phải gọi phương
thức Begin() và End() của SpriteBatch trước và sau khi thực hiện hàm Draw,
DrawString
s p r i t e B a t c h B e g in ) ) ;
s p r i t e B a t c h D r a w( t e xt t u r e , n ew R e c t an g l e( 0 , 0 , 1 0 0 , 1 0 0 ) ,
C o l o r B l ue ) ;
Trang 18V Giải pháp
XNA framework không hỗ trợ sự kiện người dừng như môi trường Winform, mà chỉ
hỗ trợ quản lý trạng thái của các thiết bị Dựa vào đặc điểm này ta có thể giả lập lại các sự kiện để xây dựng lại các màn hình, cũng như các controls, nhằm xây dựng các công cụ nhập liệu, các màn hình, hay menu chọn lựa
Với các control sử dụng chuột, dùng các khả năng quản lý trạng thái chuột của XNA
để giả lập sự kiện Các trạng thái chuột được quản lý thông qua đối tượng của lớp Mouse State của XNA framework Các nút bấm được hiển thị bởi các hình ảnh, hình ảnh được vẽ
trên màn hình với vị trí và kích thước tùy biến với các tham số của phương thức Draw() Trạng thái chuột bao gồm 2 trạng thái cho mỗi phím trên chuột là : nhấn phim, không nhấn phím Bằng cách kiểm tra liên trạng thái chuột nhấn và vị trí trỏ chuột trên màn hình bằng phương thức UpdateO của lớp Game sẽ xác định nút bấm có bị nhấn hay không, từ đó, đưa
ra các xử lý tương ứng
Trang 19Hình 3.1 Một panel trong ứng dụng game
Với control sử dụng bàn phím, dùng các khả năng quản lý chuột của XNA để giả lập
sự kiện Trang thái phím được quản lý thông qua đối tượng của lớp KeyboardState Bằng
cách dùng trạng thái phỉm, trong để xác định phím nhấn và phím nhả là phím nào, cố thể lấy
ra kí tự tương ứng và vẽ kí tự vào màn hình bằng phương thức vẽ chuỗi kí tự, hoặc đưa ra các xử lý khác, tương ứng với phím đã dùng
Trang 20Chương 4
Jễ$ Nội dung của chương này đề cập và phân tích các vẩn đề khi xây dựng dòng
game thể loại chiến lược Với mới vẩn đề, các giải pháp sẽ được đưa ra để
linh động cao trong việc thay đổi kích thước Vậy, vấn đề ở đây là xây dựng một bản
đầ chiến sự lớn, có khả năng tùy biến về kích thước.Có hai giải pháp được nêu ra
trong việc xây dựng bản đồ vùng chiến sự
Giải pháp:
Giải pháp
• Thử xem bản đồ vùng chiến sự là một tập hợp nhiều ảnh nền nhỏ ghép lại(được
gọi là các Cell), kích thước bản đồ tùy thuộc vào số lượng các mảnh ghép vì thế,
khi tăng số lượng các mảnh ghép, ta được một bản đồ có kích thước to hơn Việc
vẽ bản đồ được thực hiện bằng phép vẽ nối tiếp các mãnh ghép trên Viewport
Trang 21Hình 4.1 Mô tả cách lát bản đầ
• Các bước thực hiện cho giải pháp
o Xác định tính đứng đắn của các mãnh ghép(sự chuyển tiếp giữa các vùng đất trên bản đồ)
Hình 4.2 Trường hợp lát map không hợp lệ
vấn đề
Trang 22Vấn đề ở đây là làm sao giới hạn lại những Cell nằm trong Viewport để vẽ ra hay nói cách khác là tìm ra index của các Cell trong ma trận sao cho chúng đảm bảo Cell nằm trong Viewport, như thế, khi Map tham gia vào vòng lặp xử lý game, các Cell trong ma trận sẽ được vẽ và xử lý nhanh hơn
• i,j là index của ma trận các Cell
• Xác định lần lượt các đỉnh A,B,C,D nằm ở Cell nào trong ma trận A(iljl) B(i2jl)
C(il J2) D(i2 j2) như vậy các Cell cần vẽ cóil<=i<=i2, jl<=j<=j2 (việc xác
định D là không cần thiết, với A,B,C đã đủ xác định được Ĩl,i2,jl,j2)
Với bản đồ có các Cell dạng hình thoi
Trang 23• Bản đồ là một tập các Cell dạng hình thoi ghép lại
• Thực hiện tương tự như dạng bản đồ hình vuông nhưng cách xác định i và j khác
do cách biểu diễn hệ trục là khác
• Tóm lại giải pháp chủ yếu dựa trên việc xác định index giới hạn trong ma trận Cell để chọn ra các Cell nằm trong Viewport và vẽ
♦> Kết luận
Bằng cách chỉ vẽ các cell của trong ma trận cell nằm trong vùng viewport, trong
phương thức Draw của lớp Map quá trình vẽ bản đồ bằng các Cell bị giới hạn ra màn hình
được thực hiện nhanh hơn so với việc vẽ toàn bộ các cell ra màn hình viewport
4.3 Thể hiện bản đồ qua Viewport
vấn đề
Đe giới hạn các ô bản đồ cần vẽ trong ma trận ô đã được trình bày trong vấn đề trước,
khi phương thức Draw được gọi, giải pháp đưa ra chỉ thực hiện thao tác vẽ với các ô bản đồ
đã được xử lý giới hạn trong vùng Viewport thay vì vẽ toàn bộ các ô bản đồ trong ma trận ô
của lớp Map
Giải pháp
Trang 24• Lớp Map được cài đặt là một lớp kế thừa từ lớp DrawableGameComponents của XNA framework,
DrawableGameComponents là lớp tương tự lớp GameComponents nhưng sẽ thực hiện chức năng vẽ vào màn hình bằng cách override Draw() Lớp này chứa
Từ index đã xác định các cell trong ma trận cell, cài đặt hàm Draw() trong lớp Map
để vẽ những cell nằm trong giới hạn index đã xác định
4.4 Thể hiện các đối tượng thuộc vùng Viewport
vấn đề
Các thành phần trong Game bao gồm Unit(quân lính), Structure (công trình), Terrain(địa vật), Resource Center(mỏ tài nguyên) Sau khi đã vẽ từ ma trận Cell ra màn hình một khung cảnh nền cho bản đồ chiến sự, các thành này sẽ được vẽ lên màn hình để thể hiện trực quan cho người chơi cục diện chiến sự Cũng như việc thể hiện các Cell của Map, các đối tượng cần thể hiện trong game chỉ cần thiết được vẽ khi chúng có vị trí nằm trong vùng màn hình Viewport, trong trường hợp vị trí của các đối tượng không nằm trong vùng Viewport, đối tượng sẽ không được vẽ Các đối tượng được thể hiện trong game thuộc các lớp Unit, Structure, ResoưrceCenter, Terrain, tất cả các lớp này đều được kế thừa từ lớp Sprite và vẽ ra màn hình liên tục
T Giải pháp
Trang 25nhưng sẽ thực hiện chức năng vẽ vào màn hình bằng cách override Draw() Các thành phần của Game đều kế thừa từ lớp Sprite và tùy vào từng thành phần cụ thể, sẽ được cài đặt thành các lớp Unit, Structure nhưng chung quy lại, hàm Draw() của các thành phần này đều override trên hàm Draw() của sprite Để thực hiện vẽ, các thành phần được add vào thuộc tính Components của đối tượng Game dưới dạng Sprite và vẽ ra theo thứ tự trước sau như khi add vào
• Sprite(kế thừa DrawableGameComponents): cài đặt lại về Draw()
• Unit,Structure : kế thừa từ Sprite
• Gọi phương thức Components Add của lớp Game để đưa các
Unit,Structure vào danh sách quản lý các Components dưới dạng sprite
• Để thực hiện điều này, thực hiện như sau, xem toàn bộ bản đồ là một hình chữ nhật lớn dù là loại hình thoi hoặc hình vuông Gốc tọa độ nằm ở gốc trái trên của bản đồ, trục tọa độ là cạnh trên (Ox) và cạnh trái (Oy), ta được một hệ trục tọa độ toàn cục Vị trí của góc trái trên Viewport chỉ là một điểm nằm trên hệ trục đó, nhưng Game component trong XNA frame work lại xem hệ trục tọa độ khi vẽ luôn có gốc là góc trái trên Viewport, trục tọa độ là hai cạnh trên và trái, như vậy Viewport là một hệ trục tọa độ nhỏ trong hệ trục tọa độ toàn cục Lớp Sprite được cài đặt thuộc tính Position, thể hiện vị trí của đối tượng Sprite trong hệ trục tọa độ toàn cục, để kiểm tra có vẽ đối tượng sprite nào đó ra màn hình Viewport
không, ta chỉ cần xét trong hệ tọa độ Viewport, thuộc tính Position của Sprite có
nằm trong vùng Viewport hay không
Trang 26Hình 4.6 Cách xác định các đối tượng được vẽ ra màn hình
• Hiển nhiên thuộc tính Position phải đảm bảo cho sprite không được nằm ngoài vùng lát nền của bản đồ dạng hình thoi
❖ Kết luận
Số lượng các Sprite cụ thể trong game lớn và nằm rãi rác khắp bản đồ vùng chiến sự, nhưng Sprite chỉ được thể hiện trên màn hình để người chơi quan sát nếu chúng nằm trong màn hình viewport, nói cách khác, chỉ có các thành phần có vị trí xuất hiện trên bản đồ chiến
sự nằm trong vùng viewport mới được vẽ ra màn hình, do đó, thông qua vị trí của các thành phần game so với bản đồ vùng chiến sự và vị trí góc trái trên của màn hình viewport so với bản đồ vùng chiến sự để xác định các thành phần sẽ được vẽ ra màn hình người chơi, các thành phần không nằm trong viewport sẽ không được vẽ
4.5 Cuộn và di chuyển Viewport
A I ! vấn đề
Viewport là màn hình của Game, chỉ thể hiện một phần nhỏ cũng một bản đồ rộng lớn Người chơi muốn thao tác trên bản đồ cần phải chuyển vùng màn hình
Trang 27p Giải pháp
• Dựa trên các giải pháp đã dùng trong việc hiển thị bản đồ và hiển thị các thành phần Game trong Viewport Bằng cách dựa vào tọa độ của góc trái trên Viewport trong hệ tọa độ toàn cục bản đồ vùng chiến sự, các cell của bản đồ được giới hạn index lại và vẽ ra Viewport, đồng thời, với cách sử dụng tọa độ này, các thành phần Game nằm trong vùng Viewport cũng được vẽ ra màn hình Viewport Như vậy chỉ cần thay đổi tọa độ của góc trái trên của Viewport trong
hệ tọa độ toàn cục của toàn bản đồ bằng các thiết bị Input là có thể thực hiện scroll Viewport trên khắp bản đồ
Hình 4.7 Tọa độ của góc trái trên vùng Viewport thay đổi khi có tín hiệu input
• Tọa độ của góc trái trên vùng Viewport được thay đổi khi có tín hiệu input
o Với keyboard, sử dụng các button để thay đổi tọa độ bằng cách cộng trừ tọa độ theo pixel
o Với mouse, xác định vị trí trỏ chuột dựa vào vùng Viewport để cộng trừ tọa độ góc trái trên Viewport Cụ thể, XNA framework cung cấp khả năng xác định trạng thái của mouse, dựa vào trạng thái này, xác định vị
Trang 28trí của con trỏ mouse so với Viewport, nếu mouse nằm ngoài Viewport thì cộng trừ tọa độ góc trái trên Viewport để có hướng Scroll Viewport thích hơn trên toàn bộ vùng bản đồ
o Các tính toán về tọa độ của góc trái trên trong hệ tọa độ toàn cục được thực hiện trong phương thức Update của lớp Map
♦> Kết luận
Màn hình viewport chỉ thể hiện một phần của toàn bộ bản đồ vùng chiến sự, vì thế,
đế quan sát toàn cảnh bản đồ vùng chiến sự, viewport cần được nhận điêu khiển từ người dùng và di chuyển trên khắp bản đồ vùng chiến sự Để thực hiện được điều này, vị trí của góc trái trên viewport sẽ bị thay đổi tùy theo tín hiệu điều khiển thông qua các tính toán vecto trên hệ tọa độ toàn cục của toàn bộ bản đồ vùng chiến sự
4.6 Thể hiện các hành động của một sprite
vấn đề
Mỗi Sprite trong Game có một tập những trạng thái hoạt động nhất định bao gồm
những hoạt động cơ bản sau : IDLE, WALK, ATTACK, DIE được gọi tắt là trạng thái
Mỗi trạng thái, cùng với hướng hoạt động của trạng thái đó, bao gồm một loạt các hình ảnh chuyển đổi liên tiếp, mô phỏng từng bước hoạt động của trạng thái đó Hình ảnh sau là 15
ảnh mô tả một Sprite cụ thể là một quân lính đang di chuyển( w ALK)
Trang 29Hình 4.8 Tập các hình ảnh mô tả hành động của quân lính
Như vậy, để một tả một hoạt động, cần phải liên tục chuyển đổi hình ảnh theo thứ tự cho trước theo một khoảng thòi gian trì hoãn giữa mỗi lần chuyển đổi Nhờ vào
vòng lặp update và Draw của XNA, việc chuyển đổi hình ảnh sẽ được thực hiện dễ dàng nhờ vào quá trình thực hiện liên tục của phương thức override Update được cài đặt trong lớp sprite
W Giải pháp
Giải pháp 1: Lưu tập hình trên thành một Frame hình
Một ảnh có chiều rộng lớn và trên đó là các hình mô tả chuyển động đã xếp thứ tự Bao gồm 2 cách sau:
• Tất cả hình của tất cả các trạng thái nằm trong một frame hình
• Mỗi trạng thái có một frame hình
Sự chuyển đổi liên tiếp được thực hiện bằng cách liên tục khoanh vùng hình ảnh trên frame và vẽ ra màn hình Cách làm như thế có ưu điểm là chỉ can load Frame một lần, rồi chuyển khoanh vùng liên tục trên Frame hình và vẽ ra, nhưng
Trang 30khuyết điểm của nó là phải xây dựng được Frame hình phù hợp, đồng thời, xác định khoanh vùng phải chính xác và đủ nhanh, mặt khác, XNA chỉ có the load hình ảnh với size 2024x2024
px, vì thế, nếu số lượng hình ảnh trên một Frame là quá nhiều có lẽ sẽ làm chiều rộng của Frame vượt ngưỡng
- fc.
!
X r -
Hình 4.9 Di chuyển quân lính theo từng ô
Giải pháp 2: Lưu các hình ảnh một cách rời rạc
Mô tả đường dẫn đến mỗi hình trong file XML sao cho mỗi tập hình cho một trạng thái được lưu cùng chỗ Từ file XML, mỗi lẫn muốn thể hiện trạng thái của
Sprite, load toàn bộ tập hình vào mảng và việc chuyển đổi sẽ thực hiện bằng cách
chuyển index của mảng
❖ Kết luận
Để thể hiện hành động của một nhân vật trong game, cụ thể là các thao tác
của một quân lính, các hình ảnh sẽ lần lượt được thay đổi thông qua sự thay đổi
index trong tập hình đã xây dựng sẵn theo thứ tự Các hình ảnh được thể hiện có
tính chất tuần tự lặp lại sẽ thể hiện hành động và hướng hoạt động của nhân vật
trong game
vấn đề
Các Sprite trên vùng chiến sự có số lượng rất nhiều, và chia thành nhiều loại
bao gồm quân lính(Unit), công trình(Structure) mặt khác, với các sprite là Unit,
Structure, chúng thuộc sở hữu của một Player cụ thể vấn đề đặt ra là làm cách nào
để quản lý và truy xuất các sprite theo từng loại nhanh và dễ dàng
a
Trang 31• Trên toàn bộ Game, chia các Sprite thành các danh sách con mà các phần tử là một loại Sprite muốn quản lý
o Danh sách các Unit hiện có trong vùng chiến sự
o Mảng các Structure hiện có trên BattleField
o Thực hiện vòng lặp trên hai danh sách này để tìm Sprite cần thiết
o Đối với mỗi Player, lưu hai danh sách bao gồm danh sách các unit và danh sách các Structure
o Trong Structure, lưu danh sách các Unit do nó sinh ra
o Mỗi Unit có thuộc tính là lớp Structure cho biết nó do Structure nào sinh ra
o Mỗi Unit và Structure có một thuộc tính là lớp Player cho biết nó thuộc Player nào
• Nhờ vào các mối quan hệ này, việc truy cập thông tin các Sprite trên map sẽ thực hiện nhanh chóng hơn
♦> Kết luận
Bằng cách sử dụng danh sách để lưu các tập quân lính và công trình trong game, và các quan hệ associate trong các lớp cài đặt, các thành phần của game được truy xuất một cách nhanh chóng để thực thi các tính toán với game
4.8 Xử lý tấn công của quân lính
vấn đề
Trang 32Một Unit có khả năng tấn công sẽ tiêu diệt đối phương khi đối phương tiến lại gần
hoặc do chính player chủ động điều khiển Unit đánh quân địch, vấn đề phải giải quyết là
xử lý toàn bộ quá trình phát hiện, tấn công và chết của một Unit
w Giải pháp
• Các Unit có khả năng tấn công có thuộc tính mô tả phạm vi tấn công và phạm vi phát hiện, được thể hiện bằng khoảng cách từ Unit tới đối phương và phạm vi tấn công lớn hơn phạm vi phát hiện, bất kì đối phương nào rơi vào phạm vi phát hiện
sẽ bị Unit áp sát và rút ngắn khoảng cách, khi khoảng cách nằm trong phạm vi tấn công Unit sẽ ra đòn tấn công lên đối phương để tiêu hao sinh lực địch
• Đội tượng đang bị Unit tấn công có còn sinh lực không, nếu đã hết, Unit sẽ ngừng tấn công và chờ đợi một đối tượng tấn công khác
• Nếu đối tượng bị tấn công nếu đã bỏ chạy ra ngoài phạm vi tấn công, Unit sẽ ngừng tấn công và đuổi theo, nếu đối tượng bị tấn công nằm ngoài phạm vi phát hiện, Unit dừng tấn công và đứng yên hoặc chờ lệnh từ Player
• Trong trường hợp Unit đã cạn kiệt sinh lực, DIE là trạng thái Unit sẽ phải nhận lấy và được dispose ra khỏi chương trình
Trang 33Tài nguyên là thành phần quan trọng, từ đó, Player có thể xây dựng lực lượng, duy trì cuộc chơi Trong suốt quá trình diễn ra trò chơi, việc khai thác tài nguyên là không thể thiếu, từ các tài nguyên khai thác được, Player thực hiện quá trình “quy đổi” thành các
Structure và Unit Tài nguyên sẽ được khai thác từ các mỏ tài nguyên tùy loại Player tham gia trận chiến cần phải khai thác tài nguyên là điều cần thiết
Giải pháp
Các tài nguyên sẽ được cung cấp từ các mỏ tài nguyên Ta dùng một danh sách lưu các mỏ tài nguyên có trong bản đồ chiến sự, và sử dụng đối tượng ProducerUnit để khai thác các mỏ bằng cách:
• Duyệt qua danh sách các mỏ tài nguyên có trên bản đồ trong quá trình đối tượng này di chuyển, khi đã phát hiện mỏ tài nguyên có thể khai thác, thực hiện các bước kiểm tra
o Kiểm tra tài nguyên mang trên người cùng loại hay khác loại với tài nguyên mà
mỏ sắp khai thác cung cấp Nếu tài nguyên đang mang khác loại với tài nguyên
mà mỏ cung cấp, sẽ xóa bỏ hết tài nguyên đang mang và khai thác loại tài
nguyên từ mỏ này
❖ Kết luận
Các tài nguyên được khai thác bởi các quân lính khai thác tài nguyên (ProducerUnit), các quân lính này xác định mỏ tài nguyên nhờ vào khoảng cách của quân lính và mỏ, đồng thời, mỗi quân lính khai thác chỉ được mang theo một loại tài nguyên nhất định trong một thời điểm với số lượng tối ta nhất định Với giải pháp này, các vấn đề tranh chấp và đụng độ giữa các người chơi trên các mỏ tài nguyên
Trang 34sẽ tăng phần đa dạng cho game, đồng thời, người chơi phải có những yêu cầu điều khiển khai thác thích hợp cho số lượng tài nguyên mỗi loại của người chơi
4.10 Hiệu ứng âm thanh
Vấn đề
Bất kì một thể loại Game nào, chơi trên hệ máy nào thì âm thanh cũng đã trở thành một phần không thể thiếu Âm thanh kết hợp hài hòa với hình ảnh trên màn hình, cùng với các hiệu ứng đặc biệt góp phần gây cảm giác hứng thú với người chơi Như vậy, vấn đề đặt
ra là phải sử dụng hiệu ứng âm thanh trong Game
Giải pháp
Giải pháp
• XNA framework 3.0 cũng cung cấp lớp Các hàm trong SoundEffect cài đặt cho
phép phát âm thanh từ file nguồn với âm lượng khác nhau và vị trí loa khác nhau(loa trái, phải) tùy theo các tham số đầu vào SoundEffect
• Trong phần demo của Game, đã cài đặt hiệu ứng âm thanh thực hiện dựa trên sự
tùy biến về âm lượng và vị trí loa này Bằng cách sử dụng các tham số âm lượng
và vị trí loa, quá trình cài đặt được thực hiện như sau:
o Cài đặt lớp AudioGame.es để phát âm thanh với các tham số đầu vào bao gồm âm lượng và âm lượng loa trái phải
o Trong lớp Unit, trong hàm chuyển ảnh để mô tả trạng thái, kiểm tra Unit đã đi đến ảnh cuối trong tập ảnh của trạng thái ATTACK để phát âm thanh theo các yêu cầu sau:
o Trong trường hợp xung đột xảy ra tại phần bản đồ nằm trong vùng nhìn của Viewport, âm thanh được phát đồng thời cả hai loa và âm lượng lớn
o Trong trường hợp xung đột xảy ra tại phần bản đồ nằm ngoài vùng
Viewport, âm thanh sẽ được điều chỉnh nhỏ dần và loa phát tùy theo vị trí của xung đột so với Viewport(loa trái nếu bên trái, loa phải nếu bên phải)
Trang 35hiện các hiệu ứng âm thanh đơn giản hơn việc xử dụng XACT, đồng thời, cũng là một tùy chọn cho việc phát triển các game trên nền Microsoft Zune
đó Như thế, để ngưM chơi có một cách nhìn tổng quát về toàn cảnh trận chiến, cần phải
có một hình ảnh thu nhỏ của bản đồ, thể hiện toàn bộ các đối tượng Unit, Structure của các Player, đồng thời hình ảnh thu nhỏ này có thể tương tác với bản đồ thật
W Giải pháp
Xây dựng một hình ảnh mô phỏng bản đồ thật với các Unit và Structure của các Player trên đó gọi là lớp MiniMap Dùng một hình ảnh thu nhỏ của bản đồ làm thuộc tính nền cho MiniMap Hình ảnh này có hình dạng mô tả lại hình dạng của bản đồ thật
Sự tương tác qua lại giữa mini map và bản đồ thật được thể hiện như sau:
• Khi Viewport được thay đổi vị trí trên map, đồng thời hình chữ nhật thể hiện
cũng thay đổi vị trí như vậy
• Khi click chọn vị trí mới cho hình chữ nhật trên mini map, Viewport cũng phải
thay đổi vị trí trên bản đồ thật đứng với vị trí thể hiện của hình chữ nhật trên mini map
Trang 36Hình 4.10 Minimap
❖ Kết luận
Như vậy, giải pháp đơn giản chỉ là tính lại vị trí của các thành phần muốn thể hiện trong mini map bằng vị trí các thành phần trên bản đồ thực thông qua phép tỷ lệ và thực hiện thao tác trên mini map cũng qua phép tỉ lệ
4.12 Hiển thị thông tin Công ừình, Quân lính, Đội chơi trên menu game
Biểu diễn thông tin của Structure tương tự như thông tin của Unit và cũng chỉ được biểu diễn khi người chơi chọn một Structure để xem thông tin Ngoài ra, trong trạng thái không chọn bất kì Unit hoặc Structure hoặc Unit nào trên bản đồ, Menu sẽ luôn luôn hiển thị thông tin về các Structure mà Player có thể xây dựng cùng với các yêu cầu về tài nguyên để xây dựng
Trang 37này dưới dạng văn bản và hình ảnh bằng đối tượng SpriteFont và SpriteBatch do XNA framework cung cấp
Sau khi người chơi click chọn một Structure từ Menu, chuyển đổi màu sắc của hình ảnh hiển thị Structure trong Menu để cho biết người chơi đã chọn xây dựng Structure này Người chơi click vào vùng bản đồ nằm trong Viewport để chọn vị trí xây Structure
Trang 38Kiểm tra số lượng tài nguyên yêu cầu cho Structure Trong quá trình xây dựng, Structure không thể đi vào hoạt động Structure chỉ đi vào hoạt động sau khi đã hoàn tất, việc này được kiểm tra bằng cách dựa vào tập hình ảnh mô tả hoạt động xây dựng của Structure
❖ Kết luận
Bằng cách kiểm tra tính hợp lệ trong việc xử lý xây dựng công trình, người cần phải đáp ứng đầy đủ các yêu cầu về tài nguyên để tiến hành xây dựng một công trình và phải theo trình tự xây dần dần lên
4.14 Xử lý mua quân lính
vấn đề
Vấn đề cần giải quyết là xây dựng các bước để thực hiện chức năng mua Unit của Game từ các Structure, bao gồm cả việc các Unit này xuất hiện thế nào và ở đâu sau khi đã mua thành công
T Giải pháp
Khi người chơi đang ở trạng thái chọn một Structure của đội mình trên bản đồ, Menu
sẽ hiễn thị thông tin Structure đó, đồng thời sẽ hiển thị danh sách các Unit mà đội chơi này được phép mua mà Structure cung cấp được
Chương trình kiểm tra tài nguyên hiện có đủ để mua Unit hay không, khi đó có hai trường hợp xảy ra : đủ tài nguyên để mua Unit, không đủ tài nguyên để mua Unit
• Nếu người chơi có đủ tài nguyên để mua Unit, số lượng Unit của loại chọn mua trong hàng đợi được mua sẽ tăng lên, và tài nguyên của Player sẽ giảm với số lượng đã yêu cầu trong menu Sỡ dĩ các Unit đặt mua phải nằm trong hàng đợi vì một Unit muốn mua xong cần phải có một khoảng
Trang 39• Trong trường hợp kiểm tra và thấy không đủ tài nguyên để mua Unit, hiển nhiên Unit sẽ không được đưa vào hàng đợi để đợi mua xong
Giải pháp xây dựng công trình và mua quân lính được thực hiện tương tự đối với các đội chơi thông minh, chỉ khác là các thao tác được thực hiện một cách tự động, không cần
dùng các thiết bị nhập như đối với đội chơi do người chơi điều khiển
- Đọc các thông tin của đối tượng cần bổ sung từ tập tin xml lên, sử dụng đối tượng
CodeGenerator để xây dựng một lớp đối tượng cụ thể, kế thừa từ lớp đối tượng
chung, sử dụng các thông tin đọc được từ tập tin xml Có thể thực