3.4.1. Giới thiệu
Dựa trên các lối chơi chung đã được xây dựng, chúng em xây dựng game The Age of Heroes. Các hệ thống chiến đấu, xây dựng, nâng cấp, khai thác của game tương tự như thể loại game đã mô tả. Tuy nhiên, các đối tượng trong game được hiện thực hóa.
Phần này sẽ trình bày sơ lượt các thành phần trong game mà nhóm chúng em xây dựng. Chi tiết các thông tin về game sẽ được chúng em trình bày trong phần phụ lục B.
3.4.2. Dân tộc
Game chúng em xây dựng bao gồm 4 dân tộc : Aztecs, Mongols, Huns, Teutons.
3.4.3. Anh hùng
Hệ thống các hero trong game cũng được xây dựng dựa trên lối chơi cơ bản. Các anh hùng có trong game
Anh hùng Dân tộc Anh hùng Dân tộc
Bleda The Hun
Huns
Joan of Arc
Aztecs
Attila the Hun
Huns Genghis Khan Mongols Saladin Teutons El Cid Teutons Harald Hardaade Aztecs King Afonso Teutons Henry V Aztecs
Erik the Red
Mongols
Bảng 3-2-Các anh hùng trong game
3.4.4. Quân lính
Hệ thống các đơn vị quân lính trong game được xây dựng dựa trên game Age of Empires. Hệ thống quân lính chia làm 4 loại : quân bộ, kị binh, phù thủy và một lính đặc biệt. Đặc biệt, Aztec không có kị binh mà sẽ có 1 loại lính khác để thay thế cho kị binh.
Long Swordsman
Teutons, Mongols,
Huns và Aztecs Champion Aztecs
Berserk Mongols Wood Raider Huns
Huskarl Teutons Pikeman
Teutons, Mongols, Huns và Aztecs
Halberdier
Teutons, Mongols,
Huns và Aztecs Eagle Warrior Aztecs
Bảng 3-3-Các đơn vị bộ binh trong game
Quân lính Dân tộc Quân lính Dân tộc
Knight Teutons, Mongols, Huns Paladin Huns Mameluke Mongols Hussar Teutons
Bảng 3-4-Các đơn vị kị binh trong game
Quân lính Dân tộc Quân lính Dân tộc
Monk
Teutons, Mongols, Huns
Natural Monk
Aztecs
Bảng 3-5-Các đơn vị phù thủy trong game
Quân lính Dân tộc Quân lính Dân tộc
Teutonic Knight Teutons Magudai Mongols Cataphract Huns Jaguar Warrior Aztecs
3.4.5. Nguyên tố
Game sử dụng hệ thống nguyên tố dựa trên qui luật tương sinh tương khắc của ngũ hành : kim, mộc, thủy, hỏa, thổ. Mỗi element đều có một element tương sinh và tương khắc với nó.
3.4.5.1. Qui luật tương sinh
Mộc sinh Hỏa sinh Thổ sinh Kim sinh Thủy sinh Mộc
Qui luật tương sinh là qui luật hỗ trợ lẫn nhau giữa các element. Các element tương sinh với nhau sẽ hỗ trợ nhau, giúp đỡ nhau phát triển.
3.4.5.2. Qui luật tương khắc
Mộc khắc Thổ khắc Thủy khắc Hỏa khắc Kim khắc Mộc
Qui luật tương khắc là qui luật áp chế. Trong quan hệ ngũ hành, bất kỳ element nào cũng có element nó khắc và element khắc nó.
3.4.6. Phép thuật
Bảng 3 -7 và Bảng 3 -8 lần lượt liệt kê danh sách các phép thuật thuộc nhóm tấn công và nhóm hỗ trợ trong trò chơi.
Fire Storm Flare Ray Thunder Rage Of Earth Cherry
Spray Bubbles Golden Hit Fiery Globby
Bảng 3-7-Nhóm phép thuật tấn công
Phép thuật Thuộc tính Chức năng
Healing Không có Phục hồi máu cho quân lính Bảng 3-8-Nhóm phép thuật hỗ trợ
3.4.7. Công nghệ
Có 2 loại công nghệ, loại công nghệ cho phép tạo lính, phép và anh hùng.
Công nghệ Chi phí Công nghệ Chi phí
Champion 30 Berserk 30
Wood Raider 30 Huskarl 30
Halberdier 30 Eagle Warrior 30
Paladin 30 Mameluke 30
Hussar 30
Bảng 3-9-Các công nghệ cho phép tạo lính
Công nghệ Thông tin Chi phí
Summon Mỗi thị trấn có một loại công nghệ cho phép học phép thuật
tạo lính riêng 30
Attack Mở nhóm các phép thuật tấn công 30
Support Mở nhóm các phép thuật hỗ trợ 30
3.4.8. Công trình
Công trình Chi phí Công trình Chi phí
Barrack 100 Monastary 100 50
Stable 100 Mill 75
Castle 100 100 Mining Camp 75
Lumber Camp 75
Bảng 3-11-Các công trình của dân tộc Huns, Teutons, Mongols và Aztecs
3.4.9. Thị trấn
Mỗi đạo quân trong game đều chỉ có duy nhất một loại thị trấn.
Mỗi thị trấn chỉ có thể xây dựng một số loại công trình nhất định. Các công trình này được qui định dựa trên sơ đồ phụ thuộc giữa các công trình trong game.
3.4.10. Tài nguyên
Game chúng em xây dựng có 3 loại tài nguyên: Food (lương thực), wood (gỗ) và Gold (vàng): là các loại tài nguyên phụ của game, tài nguyên này được sử dụng để tạo lính, xây dựng công trình, nâng cấp,...
Chương 4
Các vấn đề, giải pháp xử lý đồ họa trong game trên Windows Mobile
Chương 4 sẽ giới thiệu các vấn đề và giải pháp xử lý đồ họa trong quá trình phát triển game trên hệ điều hành Windows Mobile.
4.1. Tìm kiếm và xây dựng thư viện đồ họa
Vấn đề
Với sự phát triển của công nghệ, các mobile ngày nay được trang bị phần cứng tốt hơn trước rất nhiều, bộ nhớ cũng tăng lên đáng kể. Tuy nhiên, hạn chế về tốc độ cũng như tài nguyên vẫn là trở ngại lớn nhất trong việc phát triển game trên mobile. Vì vậy, bên cạnh cơ chế xử lý hợp lý, cần phải có một thư viện đồ họa đủ mạnh cũng như tốc độ đủ nhanh mới đảm bảo được tốc độ của game.
Hiện nay có một số thư viện hỗ trợ phát triển ứng dụng đồ họa trên Windows Mobile như DirectX, GDI+, GAPI. Tuy nhiên, cần phải thử nghiệm và lựa chọn thư viện đồ họa phù hợp cho phát triển game.
Ngoài ra, phát triển game có thể dựa trên rất nhiều cơ chế, thư viện xử lý đồ họa khác nhau. Chính vì vậy, game xây dựng cần phải độc lập với thư viện xử lý đồ họa. Đây cũng là một trong những mục tiêu trong quá trình tìm kiếm, xây dựng cơ chế xử lý cũng như kiến trúc cho thư viện xử lý đồ họa.
Giải pháp
Trong suốt quá trình phát triển game trên mobile, chúng em đã thử nghiệm một số thư viện đồ họa trên hệ điều hành Windows Mobile như GAPI-Game API, GDI+ trên .Net Compact Framework 2.0, 3.5 cũng như thư viện DirectX cho Windows Mobile.
GAPI: thư viện này xử lý đồ họa trực tiếp với hệ thống nên tốc độ tương đối nhanh nhưng việc phát triển thư viện này gặp vấn đề khó khăn khi phát triển trên độ phân giải cao. Hơn nữa, thư viện này hiện đã không còn được hỗ trợ
nữa trong các phiên bản Windows Mobile 5.0 trở đi mà nó đã được thay thế bằng thư viện DirectX phát triển riêng cho Windows Mobile.
DirectX: thư viện này đòi hỏi cấu hình máy cao. Bên cạnh đó, DirectX trên Windows Mobile chưa hoạt động hiệu quả được như trên PC.
GDI+: phát triển tương đối đơn giản. Đặc biệt, có thể mở rộng lớp Graphics bằng cách thêm phương thức vào lớp đó sử dụng công nghệ của .Net Compact Framework 3.5 (extension method).
Trong quá trình tìm kiếm, xây dựng thư viện đồ họa, chúng em tìm được một số tài liệu xây dựng thư viện đồ họa dành cho phát triển game trên MSDN. Cuối cùng, nhóm chúng em sử dụng thư viện đồ họa miễn phí dành cho lập trình game trong các tài liệu trên MSDN.
4.1.1. Thư viện IGraphics
Thư viện bao gồm 2 nhóm thư viện đồ họa chính được xây dựng trên DirectX và GDI là DirectXGraphics và GdiGraphics. Hai thư viện này đều cài đặt interface IGraphics. Nhờ đó, người sử dụng có thể sử dụng các đối tượng đồ họa thông qua interface IGraphics mà không cần quan tâm cơ chế xử lý bên dưới của đối tượng đồ họa mà mình đang sử dụng. Nói cách khác, nếu người dùng muốn thay
đổi thư viện đồ họa, họ không cần phải cài đặt lại toàn bộ mã nguồn của game mà chỉ cần thay đổi đoạn lệnh khởi tạo đối tượng đồ họa.
Thư viện đồ họa được xây dựng theo mẫu thiết kế Abstract Factory Method. Interface IGraphics cung cấp các phương thức xử lý đồ họa cùng các phương thức cho phép tạo các đối tượng đồ họa tương ứng. Lớp xử lý đồ họa được sử dụng thông qua interface IGraphics. Việc lựa chọn sử dụng lớp đồ họa nào tùy thuộc vào lệnh khởi tạo. Đối tượng Bitmap và Font được tạo ra dưới dạng interface IBitmap và IFont. Đối tượng xử lý Bitmap và Font được tạo ra tương ứng với đối tượng đồ họa sử dụng.
Hình 4-21- Thư viện IGraphics gốc trên MSDN
4.1.1.1. DirectXGraphics và GdiGraphics
Cả 2 thư viện DirectXGraphics và GdiGraphics đều cài đặt interface IGrahpics nên cả 2 đều cung cấp những chức năng chính tương tự nhau. Tuy nhiên, trong quá trình phát triển game, chúng em đã thử nghiệm cả 2 thư viện DirectXGraphics và GdiGraphics. Kết quả thử nghiệm vẽ một ảnh Bitmap trên DirectXGraphics mất hơn 1s trong khi vẽ một ảnh bitmap lên toàn màn hình với độ phân giải 480x640 chỉ dưới 100ms. Chính vì vậy, chúng em sử dụng thư viện GdiGraphics để phát triển game. Ngoài ra, chúng em vẫn giữ nguyên kiến trúc xử lý đồ họa nhằm dễ dàng thay đổi thư viện đồ họa cũng như mở rộng về sau.
Hình 4-22- DirectXGraphics và GdiGraphics
4.1.1.2. Xử lý Bitmap và Font
Bên cạnh những hàm xử lý đồ họa thông thường, thư viện còn bao gồm những lớp xử lý ảnh Bitmap và Font. Các lớp xử lý này được sử dụng cùng với thư viện đồ họa tương ứng nên khi thay đổi thư viện đồ họa các lớp xử lý Bitmap và Font cũng thay đổi theo. Tuy nhiên, các đối tượng đồ họa cài đặt interface IGraphics đều tạo ra Bitmap và Font dưới dạng 2 interface IBitmap và IFont. Nhờ đó, mọi thao tác sử dụng về sau đều được thực hiện trên 2 interface này và sự thay đổi thư viện đồ họa sẽ hoàn toàn trong suốt với người sử dụng.
Hình 4-23- Lớp xử lý Bitmap và interface IBitmap
Hình 4-24-Lớp xử lý Font và interface IFont 4.1.1.3. Xử lý Animation
Thư viện còn xây dựng lớp hỗ trợ tạo các chuyển động animation. Các animation này được xây dựng đưới dạng một ảnh bitmap chứa tất cả các khung hình của chuyển động. Do sử dụng ảnh qua interface IBitmap, nên sự thay đổi thư viện đồ họa không ảnh hưởng đến lớp này.
Hình 4-25-Lớp xử lý Animation
4.1.2. Cải tiến thư viện IGraphics
Trong quá trình sử dụng thư viện IGraphics trên để phát triển game, chúng em cải tiến một số chức năng để phù hợp hơn với mục đích sử dụng. Cụ thể, chúng em đã thêm vào một số chức năng như :
Xử lý ảnh có độ trong suốt.
Hỗ trợ nạp ảnh bitmap từ đối tượng Bitmap và đối tượng Stream.
Hỗ trợ nạp font không chỉ dựa trên tên font mà còn kích cỡ với kiểu font. Hỗ trợ vẽ chữ trên một vùng trong màn hình. Ngoài ra còn hỗ trợ canh lề cho
chữ được vẽ trong khung trên màn hình. Hỗ trợ cơ chế lưu lại ảnh nền.
Vẽ lên màn hình theo từng vùng riêng, nhờ đó giảm bớt thời gian vẽ lên màn hình.
Cơ chế cache ảnh nền.
Cùng một số chức năng mở rộng thêm cho các lớp GdiFont, GdiBitmap, GdiGraphics, Animation.
4.1.3. Khởi tạo đối tượng đồ họa
Một game trong suốt quá trình thực thi chỉ sử dụng duy nhất một đối tượng đồ họa. Tuy nhiên, xử lý của game vẫn phải thông qua một đối tượng trung gian đóng vai trò là cửa sổ chính của game để tạo đối tượng đồ họa. Chính vì vậy, game phải sử dụng một đối tượng Form của Windows Form để làm trung gian bắt lấy các sự kiện cũng như xử lý đồ họa trên đối tượng Form đó.
Khởi tạo đối tượng GdiGraphics : public GamePanel(Control owner) {
g = new GdiGraphics(owner); }
Hàm tạo khởi tạo GdiGraphics:
public GdiGraphics(Control owner) {
back = new Bitmap(640, 480);
gBack = Graphics.FromImage(back); screen = owner.CreateGraphics(); }
Thao tác khởi tạo sẽ tạo ra đối tượng đồ họa GdiGraphics và gán vào 1 biến g là interface IGraphics nên mọi thao tác về sau đều sử dụng các hàm có trong interface này mà không cần quan tâm đến đối tượng đồ họa thật sự.
4.1.4. Vẽ trên IGraphics
Mọi thao tác vẽ, giao tiếp trên đối tượng đồ họa đều thực hiện thông qua interface IGraphics.
Vẽ animation :
public void DrawAnimation(int x, int y, Animation animation)
Vẽ ảnh trong suốt :
public void DrawImageAlphaChannel(IImage image, int x, int y)
public void DrawImageAlphaChannel(IImage image, Rectangle dest)
public void DrawImageAlphaChannel(IImage image, Rectangle dest, Rectangle src)
public void DrawImageTransparent(IBitmap image, Rectangle destRect)
Vẽ chuỗi :
public void DrawText(int x, int y, string text, Color color, IFont font,
FontDrawOptions options)
Các thao tác này thật tế chỉ vẽ vào vùng đệm của đối tượng đồ họa. Vùng đệm của đối tượng đồ họa được vẽ ra màn hình bằng hàm Flip(). Các hàm Flip() cung cấp chức năng vẽ vùng đệm của đối tượng đồ họa ra màn hình gồm 3 hàm với chức năng vẽ toàn bộ vùng đệm ra toàn màn hình, vẽ lên một vùng trên màn hình và vẽ lên nhiều vùng trên màn hình.
public void Flip()
public void Flip(Rectangle rect)
public void Flip(List<Rectangle> listRect)
4.1.5. Hủy IGraphics
Đối tượng đồ họa được tạo ra thông qua các API và chứa nhiều thành phần không thuộc managed code nên cần phải giải phóng đối tượng này trước khi thoát khỏi chương trình.
Thao tác hủy đối tượng đồ họa : public void Dispose()
Kết luận
Dựa trên thư viện IGraphics từ MSDN, chúng em đã xây dựng thêm các tính năng cho thư viện IGraphics để hỗ trợ hiệu quả hơn cho quá trình phát triển game. Với thư viện IGraphics, chúng em có thể vẽ các ảnh Bitmap, các ảnh có độ trong suốt nhằm tăng tính hấp dẫn cho game, dễ dàng mở rộng, thay thế các thư viện đồ họa khác, tận dụng tốt hơn tốc độ của máy.
Nhằm dễ dàng thay thế các thư viện đồ họa về sau, mọi giao tiếp với đối tượng xử lý đồ họa đều thông qua interface IGraphics nên thư viện đồ họa có thể thay đổi về sau mà không cần phải cài đặt lại chương trình.
4.2. Xử lý ảnh Bitmap
Vấn đề
Một trong những chức năng cơ bản của lớp xử lý đồ họa là phải xử lý được trên các ảnh Bitmap. Các ảnh Bitmap là thành phần được thể hiện nhiều nhất trong game.
Giải pháp
Thư viện đồ họa tạo Bitmap thông qua interface IBitmap. Lớp này được cài đặt dựa trên các đối tượng GDI+. Trong quá trình cài đặt, chúng em đã thêm vào 2 chức năng cho phép IGraphics tạo IBitmap này từ Stream và từ đối tượng Bitmap. Nhờ đó, có thể sử dụng các ảnh dưới dạng embedded resource của chương trình. Ngoài ra, thư viện còn hỗ trợ xóa nền của ảnh.
Hình 4-26-Lớp xử lý ảnh Bitmap
4.2.1. Tạo Bitmap
IBitmap có thể được tạo dựa trên 3 hàm của interface IGraphics với các chức năng lần lượt là : tạo IBitmap từ đường dẫn một tập tin trong hệ thống, từ đối tượng Stream và từ đối tượng Bitmap. Ngoài ra, ta còn có thể xác định ảnh có được làm trong suốt nền hay không bằng giá trị transparent. Nếu giá trị này là true thì ảnh sẽ được xóa nền khi vẽ còn nếu không thì ảnh sẽ được giữ nguyên.
IBitmap CreateBitmap(Stream stream, bool transparent) IBitmap CreateBitmap(System.Drawing.Bitmap bmp,
bool transparent)
4.2.2. Sử dụng Bitmap
Interface IBitmap có thể được vẽ ra màn hình bằng các hàm trong interface IGrahpics :
Vẽ ảnh lên một vùng nào đó lên đối tượng đồ họa. Ảnh sẽ tự động được biến đổi cho phù hợp với vùng cần vẽ (destRect)
void DrawImageTransparent(IBitmap image, Rectangle destRect)
Vẽ một vùng trong ảnh gốc lên vị trí có tọa độ x, y
void DrawImageTransparent(IBitmap image, Rectangle srcRect, int x, int y)
4.2.3. Hủy Bitmap
Bitmap có thể được hủy bằng cách sử dụng hàm Dispose trong interface IBitmap. Mặc dù bản chất IBitmap ở đây được cài đặt bên dưới là managed code sẽ được bộ thu gom rác quản lý và tự động thư hồi bộ nhớ nhưng thao tác hủy cần thiết để dễ dàng hơn khi thay đổi cài đặt của lớp xử lý Bitmap đồng thời bộ nhớ cũng được quản lý tốt hơn.
Kết luận
Bằng cách sử dụng interface IBitmap để giao tiếp với các ảnh Bitmap, game xử lý với các ảnh chỉ thông qua interface. Mọi sự thay đổi về cách cài đặt lớp xử lý ảnh Bitmap đều trong suốt với người dùng. Nhờ đó, game có thể được mở rộng và phát triển về sau mà không cần cài đặt lại quá nhiều mã nguồn.
4.3. Xử lý chuỗi và Font