Tải bản đầy đủ (.docx) (20 trang)

Nghiên cứu phát triển game Mario

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.21 MB, 20 trang )

I. 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.
 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à
class 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:
• Block: Tạo đường đi và các chướng ngại vật trong game.
• Scenery: Tạo cảnh trong game như cây cối, bảng chỉ dẫn,
scenery không xét va chạm.
• Mark : Tạo các điểm kết thúc game hay tạo quỹ đạo chuyển

động cho các enemy.
• Enemy: Các enemy trong game.
• Bonus: bao gồm gạch, item, box, coin trong game.
• Các Object này phân biệt với nhau bởi thuộc tính Type. Các
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
</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>
Kiểm tra FPS

Xử lý Input
Cập nhật game
Render
Kiểm tra trong lực
Xử lý Input tương ứng
Animation tương ứng
Cập nhật lọa vị trí camera
• Thông tin object gồm:
 Type: loai object.
 ID: Định danh object.
 X,Y: Tọa độ Object trong map.
 Left, Right, Top, Bottom: hình chữ nhật của object để xét va cham.
• 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
 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
 Mô hình hoạt động của mario:
Animation
Kiểm tra trọng lực
Tìm điểm di chuyển thích hợp
Di chuyển

 Mô hình hoạt động của Object:
 Mô hình vật lý trong game:
 Á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.”
 Object đang đứng yên muốn chuyển động phải có phản lực tác dụng
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.
P
Với: Delta t là khoảng thời gian giữa 2 frame.
 Các bước để cho object chuyển động:
Kiểm tra xem bên đưới Object có đất hay không.
 Nếu có đất:
 Cho Object chuyển động theo phương ngang theo
công thức:
 Có thể bắt đầu nhảy.
 Nếu không có đất.
 Nếu đang nhảy: Chuyển động gồm 2 chuyển động
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.
 Nếu không đang nhảy:
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:
• C.x <= E.x.
• A.x >= G.x
S = Vx*∆t
S = Vx*∆t
S = Vy*∆t – ½*T
2
S = g*T
H
• C.y <= E.
• A.y >= C.y
• 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ớ.
H
H
H
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.
}
}
Thuật toán lấy Object trong pham vi Rectangle
GetObject(list<StaticObj*> *_list, RECT Screen)
{
• Duyệt từng Obj trong node . Nếu va cham với Screen thì
them vào _list.
• Nếu node là node lá Thoát
• Nếu không phải node lá :
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.
b. Begin: thông tin bất đầu màn chơi.
• Play
Mario nhỏ:
Mario To:
• Mario có súng:

d. Load save game:
e. Save game:
f. Map Editor:
6. Đá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:
o Bên cạnh những thành công đã đạt được, game còn bị một số
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
o Chưa có option tùy chỉnh kích thước màn hình, âm thanh.
o Mắc một số lỗi va chạm khi biến hình.
• 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.
III.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ụ:
Int **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ẽ.

c. 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ả:
a. Menu:
b. New Game
c. Pause game
d. High Score
4. 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.
V. Tài liệu tham khảo
• Jonathan S. Harbour (2007) – Beginning Game Programming
Second Edition
• Jonathan S. Harbour (2006) – Advanced 2D Game
Development
• Frank D.Luna (2003) – Introduction to 3D Game Programming
with DirectX 9.0
• James W. Cooper (2002) – Introduction to Design Patterns in
C#




×