Nghiên cứu phát triển game Mario Ngày nay sự phát triển của kĩ thuật công nghệ trên thế giới nói chung và Việt Nam nói riêng đang trên đà phát triển mạnh mẽ. Đặc biệt là ngành công nghệ thông tin với sự phát triển vượt bậc của máy tính và các ứng dụng được xây dựng trên đó.
Trang 1I. Mở đầu.
Ngày nay sự phát triển của kĩ thuật công nghệ trên thế giới nói chung
và Việt Nam nói riêng đang trên đà phát triển mạnh mẽ Đặc biệt là ngành công nghệ thông tin với sự phát triển vượt bậc của máy tính và các ứng dụng được xây dựng trên đó Một trong những phát minh vĩ đại của ngành công nghệ thông tin đó là sự xuất hiện của game Hiện nay, các sản phẩm giải trí mà đặc biệt là game đã đem lại một nguồn lợi nhuận cho ngành công nghiệp máy tính Do nhu cầu của thị trường tăng cao, ngày càng nhiều game được ra đời và chất lượng của chúng càng được nâng cao Bên cạnh đó các thiết bị chuyên dụng cho game ngày càng phát triển phục vụ cho nhu cầu giải trí của con người Do
đó, hiện nay phát triển game đang là một hướng đi được nhiều người quan tâm đến
Phải công nhận rằng chơi game đã là một sự hấp dẫn, nhưng chơi game do chính mình làm ra thì còn hấp dẫn hơn nhiều Cùng với những đam mê và được sự hướng dẫn của thầy Ngô Thanh Hùng chúng em đã chọn và thực hiện game Mario Còn gặp khó khăn trong quá trình tiềm hiểu và áp dụng công nghệ, nhưng chúng em cũng đã
cố gắng và đã hoàn thành được game
Chúng em xin chân thành cảm ơn sự hướng dẫn của thầy và sự chia sẽ kinh nghiệm của các bạn để chúng em có thể hoàn thành tốt đồ án được giao!
II Mario
1 Các class chính
Class GameApp: Là class quan trọng nhất trong game, nhiệm vụ
tạo ra một thể hiện duy nhất là đối tượng Mario chịu trách nhiệm khởi tạo game, update game,render game và kết thúc game
Class Input: Nhận sự kiện Input từ người chơi.
Class Suface: Load suface cho game.
Class Texture: Load texture cho game.
Class Sprite: Tạo đối tượng Sprite cho game.
Class Audio:Cung cấp các chức năng load, play, stop các file
audio thông dung Cùng lúc có thể play 100 file
Trang 2 Class Font: Cung cấp chức năng in một đoạn text hay số ra màn
hình
Class Static_Object: Tạo đối tượng tĩnh trong game như: Block,
Scenery, Mark trong game.
Class Super_Object: Kế thừa từ class Static_Object, tạo các đối
tượng động trong game như: item, box, enemy, bullet.
Class Item: Quản lý các item trong game, cung cấp chức năng :
animation, move item
Class Enemy: Quản lý các enemy trong game, chung cấp các chức
năng animation, move các enemy là class cơ sở cho các class Enemy cụ thể khác để xử lý các đối tượng tương ứng như: Class ConRua,Class KhungLong, class Eato, class otherE, class BulletE, class BulletP
Class EnemyDie: Tạo hiệu ứng khi enemy chết.
Class ExplodeGach: tạo hiệu ứng vỡ gạch.
Class Scores: Tạo hiệu ứng chạy chữ khi đạt điểm.
Class ShowCoin: Tạo hiệu ứng chạy đồng tiền khi ăn đồng tiền từ
hộp
Class Form: Tạo ra đối tượng form để hiện thị thông tin dùng
trong MapEditor, cung cấp các chức năng vẽ form, bắt các xự kiên input từ người dùng, là class cơ sở của các class FormBlock,
FormBonus, FormBuddiels, FormMark, FormMenu, FormScenery, FormPref, FormTool, FormEditor
Class StopWatch: Xác định thời gian trong game, tính khoảng
thời gian giữa 2 frame, đảm bảo cố định số frame per second
Class Image: Tạo thể hiên duy nhất là g_Image để load toàn bộ
resource của game
Class RectMana: Lưu thông tin về kích thước của các đối tượng
trong game như: enemy, item, block, scenery
Class Node: Lưu thông tin của một node trong quadtree, bao
gồm danh sách các object trong node và 4 node con (nếu có)
Class QuadTree: Chứa các Node trong game dùng để tạo
bảng đồ Cung cấp các chức năng cho phép cập nhật các object trong quadtree
Class Player: Tạo ra đối tượng nhân vật mario, cung cấp các chức
năng nhận input từ người chơi điều khiển nhân vật mario, kiểm tra
va chạm với các object khác trong map tạo nên game Player là
Trang 3class cơ sở của các class PlayerTo, PlayerSung, SuperMan,
SuperManBe, PlayerDie để xử lý tương ứng từng trạng thái của
mario
Class State: Tạo từng state khác nhau của game, là class cơ sở của
các class GamePlay,GameMenu,GameHepl,
GamePause,GameMenuEnd, Editor, GameLoad,GameSave để
thực hiện các chức năng của từng màn chơi tương ứng
2 Xây dựng Map
a Các object trong map
Có 5 loại object: Block, Scenery, Mark, Enemy, Bonus.
Các objetc trong game được chia làm 2 loại lớn là Static Object và
superOject.
- StaticObject gồm: Block, Scenery, Mark Đặt điểm là không
animation, không di chuyển
- SuperObject gồm: Enemy, Bonus Đặt điểm là có animation và di
chuyển
Đặt điểm của Object:
scenery không xét va chạm
động cho các enemy
object con cụ thể được phân biệt bởi thuộc tính ID
b Cấu trúc lưu Map từ file
<Map>
<Name>Save9</Name> Tên map
<Data>31/0/2011 14:9</Data> ngày giờ tạo map
<MapX>0</MapX> Tọa độ x của camera lúc bắt đầu <MapY>5800</MapY> Tọa độ y của camera lúc bắt đầu <MarioX>50</MarioX> Tọa độ x của mario lúc bắt đầu <MarioY>6240</MarioY> Tọa độ y của mario lúc bắt đầu <MarioState>0</MarioState> trạng thái của mario lúc bắt đầu
<Coins>
<Gach ID="4" Type="4" x="3100" y="6100" Left="3100" Right="3150" Top="6100" Bottom="6150"/>
Danh sách gach có đồng tiền
</Coins>
<Congs>
<Cong x="3625" y="5700" xx="125" yy="4450"/>
Danh sách các cống
Trang 4Kiểm tra FPS
Xử lý Input
Cập nhật game
Render
</Congs>
<Objects>
<Object ID="7" Type="0" x="0" y="4350" Left="0" Right="50" Top="4350" Bottom="4400"/>
Danh sách các object
</Objects>
</Map>
Thông tin object gồm:
Thông tin cống gồm:
X,Y: Tọa độ đầu vào
XX,YY: tọa độ đầu ra
c Save và load game: Cấu trúc file save game và wordmap là như
nhau Khi save game sẽ lưu toàn bộ thông tin trong quadtree xuống file save tương ứng khi load lên thì load từ file đã save như load wordmap
3 Mô hình hoạt động của game
Xử lý Input: bắt các sự kiện input từ người chơi, xử lý các sự
kiện tương ứng đó
Cập nhật game: Animation, move các object trong game.
Render: Vẽ tất cả các object ra man hình
Trang 5Kiểm tra trong lực
Xử lý Input tương ứng
Animation tương ứng
Cập nhật lọa vị trí camera
Animation
Kiểm tra trọng lực
Tìm điểm di chuyển thích hợp
Di chuyển
Áp dụng định luật 3 của Niuton.
Nội dung định luât:
“Đối với mỗi lực tác động bao giờ cũng có một phản lực cùng độ lớn, nói cách khác, các lực tương tác giữa hai vật bao giờ cũng là những cặp lực cùng độ lớn và ngược chiều.”
lên nó, phản lực trong trường hợp này xuất phát từ mặt đất mà Object đang đứng
Trang 6Với: Delta t là khoảng thời gian giữa 2 frame.
Kiểm tra xem bên đưới Object có đất hay không
công thức:
thành phần:
- Theo phương x
- Theo phương y:
Với: T là thời gian từ lúc Object bắt đầu rơi tự do
Object rơi tự do theo công thức:
4 Các thuật toán trong game
Xét va chạm giữa các Object:
Để đơn giản trong việc xác va chạm giữa các object, mỗi object được
đại diện bởi một hình chữ nhật, lúc đó xác định va chạm giữa các
object chính là xác định va chạm giữa các hình chữ nhật đó
Thuật toán xét va chạm giữa 2 hình chữ nhật.
Bốn trường hợp ABCD không va cham với EFGH:
P
S = g*T
S = Vx*∆t
S = Vy*∆t – ½*T2
S = Vx*∆t
H
Trang 7 C.y <= E.
Các thuật toán trong cây tứ phân.
Thông tin một node:
Thuộc Tính:
- _TL,_TR,_BL,_BR : lưu địa chỉ 4 node con.
- _IsFull : giới hạn hiện tại của Node.
- ListObject : lưu danh sách Object trong Node.
Phương thức:
- ChiaNodeCon(): Cấp phát bộ nhớ và đẩy
Object xuống node con
- Insert(): Chèn Object vào cây tứ phân.
- Update() : cập nhât trạng thái mới cho các
Object
- End(): Giải phóng bộ nhớ.
Thuật toán Insert Object vào node:
Insert(StaticObj* obj)
{
if (ListSection rỗng)//node lá
{
Thêm obj vào node.
If(Node đầy)
{
Chia node con
Thêm các object của node vào node con
}
}
Else
{
Tìm node con A chứa obj.
+ Tìm thấy A: A->Insert(obj) + Không thấy A: thêm vào tai node
}
}
H
H
H
Trang 8Thuật toán lấy Object trong pham vi Rectangle
GetObject(list<StaticObj*> *_list, RECT Screen) {
them vào _list
Tìm node con A của node chứa Screen
o Tìm thấy A: A->GetObject(_list,Screen)
o Không tìm thấy A:
Gọi R1,R2,R3,R4 là phần giao nhau giữa Screen với 4 node con
iF(R1 tồn tại) _TL->GetObject(_list,R1) iF(R2 tồn tại)
_TR->GetObject(_list,R2) iF(R3 tồn tại)
_BL->GetObject(_list,R3) iF(R4 tồn tại)
_BL->GetObject(_list,R4)
}
5 Kết quả:
a Menu:
Dùng phìm Up,Down để di chuyển, Enter để chọn.
Trang 9b Begin: thông tin bất đầu màn chơi.
Trang 10Mario nhỏ:
Mario To:
Trang 11Mario có súng:
d Load save game:
Trang 12e Save game:
f Map Editor:
Trang 136 Đánh giá
Ưu điểm:
Nhìn chung, chương trình đã hoàn thành tốt các yêu cầu cơ bản được đặt ra,
đã xây dựng được một game chạy gần hoàn chỉnh về các chức năng Nhân vật mario di chuyển tương đối khá, nhảy, va chạm với các vật cản trên map tương đối khá Về phần bản đồ thì đã thể hiện được khung cảnh của game: có nhân vật chính, gạch, cỏ, vàng (tiền), hố sâu nguy hiểm, rùa, khung long Hiệu suất của game tương đối khá, việc load game tương đối nhanh, hình ảnh rất rõ không gây phản cảm cho người sử dụng Ngoài ra, việc bố trí các phím chức năng khá hợp giúp cho người chơi dễ dàng làm quen với game.
Map Editor có thể chạy thử thuận lợi cho người chơi tạo ra các map riêng cho mình.
Khuyết điểm:
khuyết điểm như sau:
o Vấn đề va chạm xử lý chưa mượt Trong game hầu hết việc xử lý va chạm chỉ giữa sprite, với mỗi sprite là một hình chữ nhật Nhưng mỗi nhân vật có hình dáng khác nhau nên nhiều lúc va chạm không chính xác
Hướng phát triển: khắc phục các khuyết điểm còn tồn tại, đồng thời hướng đến xây dựng trên nền tảng 3D
Trang 14III.Tetris 3D:
Tetris đươc phát triển từ project Mario nên về kiến trúc chương trình tương đối giống Mario
1 Các class chính
Class GameApp: Là class quan trọng nhất trong game, nhiệm vụ tạo
ra một thể hiện duy nhất là đối tượng Mario chịu trách nhiệm khởi tạo
game, update game,render game và kết thúc game.
Class Input: Nhận sự kiện Input từ người chơi.
Class Suface: Load suface cho game.
Class Texture: Load texture cho game.
Class Sprite:Tạo đối tượng Sprite cho game.
Class Audio:Cung cấp các chức năng load, play, stop các file audio
thông dung Cùng lúc có thể play 100 file
Class Font: Cung cấp chức năng in một đoạn text hay số ra màn hình.
Class Item: Quản lý các item xuất hiện theo thời gian, có 2 item: tăng
scores và clear map
Class DongHo: Quản lý thời gian thực để tăng level theo thời gian.
Class Xfile: chức năng load và vẽ các file *.x
Class ImageScr: load các image của game.
Class Map: lưu trữ các Block đã rơi.
Class Block: Lưu trữ hình dạng các block, cung cấp chức năng xoay
khối, render, xoay theo thời gian Đây là class cơ sở của các class
BlockVuong, BlockDai, BlockLTrai, BlockLPhai, BlockT, BlockZTrai, BlockZPhai.
Class State: Tạo từng state khác nhau của game, là class cơ sở của
các class GamePlay,GameMenu,GameHepl, GamePause để thực hiện
các chức năng của từng màn chơi tương ứng
2 Xây dựng Map
a Cấu trúc của Block:
Hình dạng Block đươc lưu trong một mảng 2 chiều Có 4 trạng thái, mỗi trạng thái tương ứng với một mảng 1 chiều có 4 phần tử lưu
vị trí 4 khối con của Block trong ma trận 4x4 , và một biến kiểu int để lưu màu của block
Ví dụ:
Trang 15Int **Info; int _Color;
Info[0]= {1,2,6,10};
Info[1] = {3,5,6,7};
Info[2] = {2,6,10,11};
Info[3] = {5,6,7,9};
b Cấu trúc Map:
Map được lưu bằng một mảng 2 chiều thể hiện ma trân như sau:
o Ô còn trống là -1
o Ô khác -1 đã chứa block, giá trị là màu của block
o Ô có giá trị là 0 ở bên trái, bên phải và phía dưới có sãn trong map để xét va chạm, tránh làm cho block di chuyển ra khỏi Map Các ô này không được vẽ
Trang 16c Di chuyển Block:
Block được chứa trong ma trận 4x4, ma trận 4x4 được chứa trong Map là ma trân 20x14
Di chuyển Block chính là di chuyển ma trận 4x4
d Xét va chạm:
Tìm vị trí của các ô của block trong ma trận 20x14 Lần lượt kiểm tra các vị trí đó trong Map đã chứa block chưa, nếu có tức là va chạm,
và ngược lại
Ví dụ:
Info[0]= {1,2,6,10};
Vị trí của Block trong ma trận 4x4 là : {0,1} , {0,2} , {1,2} , {2,2}
Ma trận 4x4 có vị trí {5,7} trong ma trận 20x14
Vị trí của Block trong ma trân 20x14 là: {5,8} , {5,9} , {6,9} , {7,9}
Kiểm tra tại các vị trí: {5,8} , {5,9} , {6,9} , {7,9} Nếu tồn tại một điểm khác -1 va chạm
e Xét di chuyển Block:
Xét vị trí sắp di chuyển có va chạm không? Nếu không thì va chạm
f Xét xoay Block
Xét trạng thái sắp xoay của Block có va chạm không? Nếu không thì xoay
3 Kết Quả:
Trang 17a Menu:
b New Game
c Pause game
Trang 18d High Score
Trang 194 Kết luận
Ưu điểm:
o Cơ bản hoàn thành các chức năng của game, thêm item làm game thêm sinh động
o Các Block, Map, item được vẽ hoàn toàn bằng 3D
o Tuy là một game nhỏ, nhưng nó đã giúp nhóm làm quen với công nghệ 3D, hiểu được các khái niệm căn bản của một game viết 3D bằng DirectX
Khuyết điểm:
o Một tuần là một thời gian không nhiều để tìm hiểu biển kiến thức 3D, nên nhóm chỉ sử dụng những kiến thức căn bản nhất để làm game
o Góc đặt camera chưa thất tốt, thiết lập ánh sáng còn hạn chế
o Chưa tạo được background 3D
Hướng phát triển:
o Khắc phục các khuyết điểm
o Thêm các hiệu ứng particle để game thêm đẹp mắt
o Phát triển play online
IV Kết luận đề tài
Game là một lĩnh vực đầy thú vị nhưng cũng đầy gian khổ, tuy không nhiều nhưng chúng em đã nếm trãi cái cảm giác đó Khi thì rối bời, chẳng có ý tưởng gì, sao mà khởi tạo window hoài không xong? Để rồi khi load được một tấm ảnh đầu tiên và render nó ra, lúc đó là một cảm vui mừng không thể nào tả hết Thế là chu kỳ đó
cứ tiếp diễn bí đường rồi lại tìm ra, nỗi buồn thất bại đan xen niềm vui chiến thắng, có lẽ những người trong cuộc mới hiểu được cảm giác này! Tuy chưa thật hoàn hảo nhưng với mario và tetris 3D là sản phẩm đầu tay của chúng em, là thực tế của những gì được học Chúng em chân thành cảm ơn sự nhiệt tình chỉ dạy của thầy Hùng, thầy Dũng đã giúp chúng em có những kiến thức đầu tiên trên con đường chinh phục con đường đầy khó khăn này Dù khó khăn, nhưng với lòng say mê với game, chúng em tin chắc mình có thể tiến xa hơn, sẽ cải thiện được 2 game này tốt hơn, để đồ án môn học không chỉ còn là đồ án môn học Và để thực hiện được điều này chúng em rất cần sự giúp đỡ của các thầy
Trang 20V Tài liệu tham khảo
Second Edition
Development
with DirectX 9.0
C#