50
Copyrights by HuyetSat - Xvna.forumb.biz - 2010 Nếu muốn tự mình viết trò chơi máy tính thì đây sẽ là tài liệu cần thiết cho bạn. Nó sẽ hướng dẫn bạn lập trình xna từ những điều cơ bản nhất đến khi bạn có thể viết một game hoàn chỉnh! Bạn cần phải biết qua về C# trước khi đọc tài liệu này. Đây là một tài liệu hữu ích cho những newbie chưa từng viết game! Các game mình hướng dẫn rất đơn giản (GetSix, Pong, Asteroids) để newbie dễ hiểu. Cái gì cũng phải bắt đầu từ đơn giản trước. , bác sĩ cũng phải học các mổ Amiđan trước khi được phân công vào một ca giải phâu não Xvna.forumb.biz là diễn đàn của tài liệu này, nếu cần thêm thông tin có đề cập đến trong tài liệu, vui lòng truy cập vào diễn đàn. Bản quyền thuộc về HuyetSat - Xvna.forumb.biz . yêu cầu bạn ghi rõ nguồn gốc nếu bạn muốn phát hành tài liệu này trên trang web hoặc forum cá nhân của bạn. Contact me at [email protected] or http://xvna.forumb.biz

[Xvna.forumb.biz]XNA Basic for Newbie

Embed Size (px)

Citation preview

Page 1: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

N u mu n t mình vi t trò ch i máy tính thì đây sẽ là tài li u c n thi t cho b n. ế ố ự ế ơ ệ ầ ế ạNó sẽ h ng d n b n l p trình xna t nh ng đi u c b n nh t đ n khi b n có ướ ẫ ạ ậ ừ ữ ề ơ ả ấ ế ạth vi t m t game hoàn ch nh! B n c n ph i bi t qua v C# tr c khi đ c tài ể ế ộ ỉ ạ ầ ả ế ề ướ ọli u này. Đây là m t tài li u h u ích cho nh ng newbie ch a t ng vi t game! Các ệ ộ ệ ữ ữ ư ừ ếgame mình h ng d n r t đ n gi n ướ ẫ ấ ơ ả (GetSix, Pong, Asteroids) đ newbie d ể ễhi u. Cái gì cũng ph i b t đ u t đ n gi n tr c. , bác sĩ cũng ph i h c các m ể ả ắ ầ ừ ơ ả ướ ả ọ ổAmiđan tr c khi đ c phân công vào m t ca gi i phâu não ướ ượ ộ ả

Xvna.forumb.biz là di n đàn c a tài li u này, n u c n thêm thông tin có đ ễ ủ ệ ế ầ ềc p đ n trong tài li u, vui lòng truy c p vào di n đàn.ậ ế ệ ậ ễ

B n quy n thu c v HuyetSat - Xvna.forumb.biz . yêu c u b n ghi rõ ngu n g c ả ề ộ ề ầ ạ ồ ốn u b n mu n phát hành tài li u này trên trang web ho c forum cá nhân c a ế ạ ố ệ ặ ủb n.ạ

Contact me at [email protected] or http://xvna.forumb.biz

Page 2: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

==========================================Copyrights by Xvna.forumb.biz © - 2010VietNam XNA Game Development Community!Written by HuyetSat.

Ch ng 1: ươ

Phát tri n game là gì?, XNA là gì và t i sao l i vi t game trên xna.ể ạ ạ ế

1.T i sao l i c n phát tri n game?ạ ạ ầ ể

Đây là m t s lý do chính:ộ ố+Doanh thu t game cao h n nhi u so v i phim nh!ừ ơ ề ớ ả+L p trình game là m t thách th c l n v m t kỹ thu t!ậ ộ ứ ớ ề ặ ậ+L p trình game là môt công vi c thú v !ậ ệ ị

2.Vi t game nh th nào?ế ư ế

Có 2 cách chính n u b n mu n vi t game:ế ạ ố ế+S d ng m t s engine nh GameMaker, RPG Maker, FPS Creatorử ụ ộ ố ư , ... Nói chung là ch c n có ý t ng và tài nguyên là đ cỉ ầ ưở ượ . nh ng engine trên hok yêu ữc u b n ph i bi t l p trình! B n ch c n Drag và Drop object , ch n thêm methodầ ạ ả ế ậ ạ ỉ ầ ọ có s n trong engine th là b n đã có game! Nói chung là ko nên sài m y engine ẵ ế ạ ấnày! L p trình chính là x ng s ng c a GameMaking ch hok ph i design!ậ ươ ố ủ ứ ả

+H c v C, C++ ,..., h th ng đ h a API, vât lý, toán h c cao c pọ ề ệ ố ồ ọ ọ ấ . nh ng ki n ữ ếth c r t khó nh ng cũng r t h u ích! Tuy v y tài li u này vi t cho newbie nên ứ ấ ư ấ ữ ậ ệ ếchúng ta cũng ko b t đ u v i nó :>ắ ầ ớ

Cái chúng ta b t đ u là C# và xna 3.1 ! nó đ n gi n nh ng cũng hok kém ắ ầ ơ ả ưph n hi u qu trong l p trình game!ầ ệ ả ậ Yêu c u c a m t Game Project hoàn ch nh:ầ ủ ộ ỉ+Game đó ph i ch i đ c!ả ơ ượ t c là đ h a khá, ho t hình m t, có n i dung, có ứ ồ ọ ạ ượ ộth ng thua, k t h p v i hi u ng âm thanh.ắ ế ợ ớ ệ ứ+Ph i có m t k ho ch rõ ràngả ộ ế ạ : T t nh t các b n vi t h t các ý t ng và thu t ố ấ ạ ế ế ưở ậtoán mà các b n nghĩ ra lên gi y, sau đó l c ra nh ng cái kh thi, m xna lên và ạ ấ ọ ữ ả ởb t đ u code!ắ ầ

Contact me at [email protected] or http://xvna.forumb.biz

Page 3: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

+ Nghiên c u kỹ cách b n sẽ code:ứ ạ Code là m t ngh thu t! có nhi u cách đ ộ ệ ậ ề ểl p trình t c là b n sẽ th y có nhi u thu t toán cho m t v n đ , cái chính là b n ậ ứ ạ ấ ề ậ ộ ấ ề ạph i ả ch n ra m t gi i pháp hi u qu nh t (Đ nZ gi n, t n it tài nguyên khi ọ ộ ả ể ả ấ ơ ả ốrun, ph i hi u qu ...) cái này m y ch ng sau mình sẽ đ a ra ví d c th .ả ệ ả ấ ươ ư ụ ụ ể

3. XNA là gì và T i sao l i là C# và XNA?ạ ạ

XNA là m t công ngh làm game c a microsoft phát tri n. nó h ng đ n đ i ộ ệ ủ ể ướ ế ốt ng s d ng là các h c sinh, sinh viên và nh ng ng i đam mê l p trình ượ ử ụ ọ ữ ườ ậgame... B n XNA 3.1 yêu c u b n ph i có visual studio 2008 tr lên (b n có th ả ầ ạ ả ở ạ ểdown b n Express 2008 SP1) t i trang web c a microsoft và b XNA 3.1 (hoàn ả ạ ủ ộtoàn mi n phí). Do XNA s d ng C# nên b t bu c b n ph i có n n t ng C# t t. ễ ử ụ ắ ộ ạ ả ề ả ốn u ch làm game đ n gi n thì b n n m v ng ph n l p trình h ng đ i t ng ế ỉ ơ ả ạ ắ ữ ầ ậ ướ ố ược a C# là ok! Sau khi cài đ t XNA, nó sẽ tích h p tr c ti p vào visual studio C# , ủ ặ ợ ự ếb n có th ch n new project => XNA 3.1 Window game. XNA có 1 u đi m là vi tạ ể ọ ư ể ế game đc cho Xbox, Zune game v n ch y trên HĐH Window mobile m y cái này ẫ ạ ấquan tr ng l m nhé, n u b n mu n ki m ti n t vi c vi t game thì Xbox là môi ọ ắ ế ạ ố ế ề ừ ệ ếtr ng h p d n ko thua PC. N u game b n vi t hay thì có th mang lên ch ườ ấ ẫ ế ạ ế ể ợgame XBox c a microsoft mà bán cho nh ng ng i ch i game khác.ủ ữ ườ ơ

Search Các bài h ng d n training v C# và xna t i xvna!ướ ẫ ề ạ

4. Giao di n s d ng cho coder khi b n làm vi c trên Visual C# 2008 express edition!ệ ử ụ ạ ệ

Contact me at [email protected] or http://xvna.forumb.biz

Page 4: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

5.H ng d n Download và cài đ t xna.ướ ẫ ặ

Contact me at [email protected] or http://xvna.forumb.biz

Page 5: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Ch ng 2:ươ

Các thành ph n c b n c a xnaầ ơ ả ủ

1.H t a đệ ọ ộNew bie các b n nên b t đ u v i tr c t a đ 2D c a XNA.ạ ắ ầ ớ ụ ọ ộ ủG c (0:0) n m đ nh trên cùng, bên trái c a màn hình game khi b n run ố ằ ở ỉ ủ ạgame!Tr c Ox h ng t trái sang ph i theo chi u d ngụ ướ ừ ả ề ươTr c Oy h ng t trên xu ng d i theo chi u d ngụ ướ ừ ố ướ ề ươGiá tr t a đ có th là s th c (float)ị ọ ộ ể ố ự

Nh có h t a đ mà b n có th t o ra v trí (position) v n t c (velocity), gia ờ ệ ọ ộ ạ ể ạ ị ậ ốt c (accelerate), tr ng l c (gravity) ...ố ọ ự

2.các thành ph n Game, GameService và Game Componentầ

Ko b t bu c b n ph i s d ng, tuy nhiêu n u b n dùng chúng thì ch ng ắ ộ ạ ả ử ụ ế ạ ươtrình c a b n sẽ đ n gi n đi r t nhi u!ủ ạ ơ ả ấ ề

2.1. Game, Service và nh ng đi u c n l u ýữ ề ầ ư

G c gác c a XNA là 1 class đ c xây d ng , chính là ố ủ ượ ựMicrosoft.Xna.Framework.Game (g i t t là Game) B n sẽ th y 1 file là ọ ắ ạ ấprogram.cs sẽ run cái Game1.cs này và nó chính là file ch a toàn b mã ngu n ứ ộ ồchính đ ch y game, nó bao g m m i thành ph n c a game, th ng thì chúng ta ể ạ ồ ọ ầ ủ ườc n 1 th hi n c a class Game1 là đ . ầ ể ệ ủ ủ Trong class game chính c a b n (đc k th a t Game) sẽ th y có r t nhi u ủ ạ ế ừ ừ ấ ấ ềmethod mà Game cho phép b n override: initilize(), Update() ...ạ Tuy nhiên kh i đ u cho vi c l p trình là khai báo bi n, b n nên khai báo các ở ầ ệ ậ ế ạbi n nh là Player, hay Enemy... ế ư nhi u Enemy thì có th t o 1 class ch a toàn ề ể ạ ứb t i nó g i là Enemy Manager ch h nộ ụ ọ ả ạ , n u b n có nhi u màn trong game ế ạ ềthì chúng ta khai báo player , Enemy trong t ng màn (dùng GameCompomentừ - sẽ nói sau) và khai báo màn file game chínhở (nh m c đ nh là Game1.cs ư ặ ịđó)

Contact me at [email protected] or http://xvna.forumb.biz

Page 6: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

B n có th c p d li u v m t th dùng chung nào đó cho các ạ ể ấ ữ ệ ề ộ ứGameCômpoment b ng cách dùng service:ằ

Services.AddService(typeof(SpriteBatch), spriteBatch);

GameCompoment sẽ có giá tr c a spriteBatch mà dùng cho 2D graphic Draw ị ủ ởmethod Ti p đ n b n có method Initilize() nó sẽ đ c g i tr c Update hay Drawế ế ạ ượ ọ ướ method, b n thi t l p các giá tr c b n nh : ch y nh c n n hay tùy ch n full ạ ế ậ ị ơ ả ư ạ ạ ề ọmàn hình, thi t l p cho Enemy và player n u có...ế ậ ế LoadContent là method giúp b n load tài nguyên t th m c Content (theo m c đ nh ạ ừ ư ụ ặ ịsẽ là th m c g c ch a tài nguyên).ư ụ ố ứ Cú pháp đ load khá đ n gi n. th c ra b n ể ơ ả ự ạload đâu cũng đc nh ng th ng là sau khi Init và khi đã b t đ u ch y game ở ư ườ ắ ầ ạ(vào Update) thì ch ai l i load l i content c , nó sẽ có th gây ra nh ng l i ả ạ ạ ả ể ữ ỗnghiêm tr ngọ Update là method có nhi m v duy t t t c các thành ph n c a game, KT ệ ụ ệ ấ ả ầ ủđi u ki n đ Update cho game (VD t c đ c a object là 1, sau 1 l n update , ề ể ể ố ộ ủ ầt a đ c a nó sẽ c ng thêm b i 1)ọ ộ ủ ộ ở Khi dùng Update b n nên c n th n đ ng đ ạ ẩ ậ ừ ểquá nhi u object Update 1 lúc game sẽ r t l c.ề ấ ắ b n nên KT đi u ki n mà sẽ ạ ề ệUpdate cho object (VD nh ch Update cho nh ng Object n m trong vùng nhìn ư ỉ ữ ằth y c a camera khi làm game 3D) ấ ủ Theo m c đ nh thì XNA update 60 l n 1 giây ặ ị ầb n có th tăng gi m con s này tùy thix cho phù h p v i game và s c ch u đ ng ạ ể ả ố ợ ớ ứ ị ực a cái máy b n: code d i đây làm XNA update 100 l n 1 giâyủ ạ ướ ầ

Draw Method là cái b n c n chú ý sau cùng, nó cũng h t s c quan tr ng vì ạ ầ ế ứ ọm i th b n nhìn th y trong game đ u đc đ a lên đâyọ ứ ạ ấ ề ư ở . t t nhiên đi u này ấ ềlà ko b t bu c b n có th đ nó trong Update, tuy nhiên XNA đã t o s n cho ắ ộ ạ ể ể ạ ẵchúng ta rùi, ngu gì ko sài và làm ch ng trình đ n gi n h n? Draw cũng đc ươ ơ ả ơ"update" nh Update() method nh ng ch là khi có s thay đ i thích h p liên ư ở ư ỉ ự ổ ợquan đ n Update method nghĩa là b n cũng ế ạ KT ĐK đc đây nh ng ch là đ ở ư ỉ ểDraw object cho thix h p thôi, còn v game lôgic thì đ Update() là hay ợ ề ể ởnh tấ

Contact me at [email protected] or http://xvna.forumb.biz

Page 7: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

B n có th th c m c v m y ch Base trong môi method. Nhi m v c a chúng ạ ể ắ ắ ề ấ ữ ệ ụ ủr t đ n gi n thôi, đó là g i các method t ng ng c a các gamecompoment ấ ơ ả ọ ươ ứ ủtrong game (n u có) ví d nh Update Method (sau khi Update cho Game1.cs ế ụ ưxong, ph n Base.Update(gameTime) sẽ update cho t t c các GameCompoment ầ ấ ảđã đăng ký (kh i t o và added vào m ng Compoments c a class Game1.cs)ở ạ ả ủ

2.2.GameCompoment và DrawableGameCompoment Cach t o ra GameComponent, ch n nh sau: kích ph i vào project trong c a s ạ ọ ư ả ử ổSolution...

Sau đó ch n XNA 3.1 >> GameComponent >> gõ tên l p vào tr ng Name.ọ ớ ườ

Contact me at [email protected] or http://xvna.forumb.biz

Page 8: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Visual sẽ t o cho b n m t l p k th a t GameComponent có tên l p b n v a gõạ ạ ộ ớ ế ừ ừ ớ ạ ừ vào trong tr ng Name.ườ

Components là m t danh sách List<(Drawable)GameCompoment> c a Game, nó ộ ủđc t o s n cho b n. nh ng gì b n c n làm là t o class k th a t ạ ẵ ạ ữ ạ ầ ạ ế ừ ừ(Drawable)GameCompoment và add nh ng th hi n c a class v a vi t này vào ữ ể ệ ủ ừ ếm ng Components và nó sẽ đc t đ ng Update hay Draw trong nh ng method ả ự ộ ữBase.Update(GameTime) hay Base.Draw(GameTime) c a Game !ủ

Gi i thích kỹ h n m t tý thì nó là th này:ả ơ ộ ếChúng ta s d ng (Drawable)GameComponent, class s n có c a XNAử ụ ẵ ủ . Dùng nó r t có l i b i lẽ ấ ợ ở trong Class Game1.cs c a chúng ta, XNA đã t o m t List cóủ ạ ộ tên Components. M i Đ i t ng là GameComponent hay làỗ ố ượ DrawableGameComponent khi đc Add vào m ng nàyả sẽ đc t đ ng ch y cácự ộ ạ method quan tr ng nh initilize, update (n u là Drawable thì có thêm Drawọ ư ế method). Nghĩa là n u b n t o ra 100 object ki u này thì sẽ đ công code, chúngế ạ ạ ể ỡ ta ch c n đ a nó vào m ng Component là xong! M t khác s d ng Classỉ ầ ư ả ặ ử ụ component trên chúng ta còn có 1 tham s quan tr ng đó là Game, t c làố ọ ứ Game1.cs đó khi XNA t o s n cho b n l p Game1.cs có ph i nó k th a tạ ẵ ạ ớ ả ế ừ ừ Microsoft.Xna.Framework.game. Khi nh p d li u (b ng 1 method trùng tên v i tên c aậ ữ ệ ằ ớ ủ class) trong Game1.cs (thu ng LoadContent Method). ờ ở Khi đã có Game trong

Contact me at [email protected] or http://xvna.forumb.biz

Page 9: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

tay b n có th d dàng l y d li u t Game1.cs truy n cho cácạ ể ễ ấ ữ ệ ừ ề GameComponent (thông qua Service). Khi using Microsoft.Xna.Framework.GamerServices;

nghĩa là chúng l y kh năng cho phép XNA truy n d li u t chu ng trình ấ ả ề ữ ệ ừ ơchính (Game1.cs) sang Các gameComponent

Các gameComponent là nh ng ph n t o lên 1 game hoàn ch nh đc vi t cho ữ ầ ạ ỉ ếXNA. B n sẽ th y chúng luôn có m t bi n đc nh p vào, đó là ạ ấ ộ ế ậ game và khi đó m i ỗGameCompoment sẽ có s n m t bi n tên là Game (nó liên quan tr c ti p) đ n ẵ ộ ế ự ế ếgame1.cs . VD b n có th thêm GameCompoment object vào game chính nh ạ ể ưsau: Game.Compoments.Add(object); Drawable cũng nh GameComponent, cái khác là nó có kh năng Draw mà ư ảko c n thêm code game chính làm game code c a chúng ta đ n gi n đi r t ầ ở ủ ơ ả ấnhi u. ềGameCompoment dành cho nh ng th ko c n draw nh camera, light, ữ ứ ầ ưmaterials, input ...Bi n Game th c s r t h u ích, khi mà b n c n các giá tr t game chính (VD: ế ự ự ấ ữ ạ ầ ị ừGame.GraphicDevice - n u ko có nó thì đ b n tìm đ c giá tr aspectRatio mà ế ố ạ ượ ịlàm ko gian chi u ph i c nh khi vi t game 3D)ế ố ả ế Ngoài ra nó có th nh n giá tr mà Game chính truy n cho thông qua service, ể ậ ị ềtheo nh VD ph n 1:ư ầ( ph n 1, trong class game1.cs: ở ầServices.AddService(typeof(SpriteBatch), spriteBatch); ) L y service gameComponent:ấ ở spriteBatch = Game.Services.GetService(typeof(SpriteBatch)) n u b n dùng Drawable, b n sẽ dùng cái spriteBatch cho Draw method, t đó ế ạ ạ ừCompoment sẽ có kh năng t Draw ki u nh :ả ự ể ưspriteBatch.Draw(texture,position,Color.White)

ch c n base.Draw(gameTime) là đ đ Vẽ t t c DrawableGameCompoment ỉ ầ ủ ể ấ ảtrong game là xong!

Contact me at [email protected] or http://xvna.forumb.biz

Page 10: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

T t c nh ng th liên quan đ n service t t nh t b n s đ n nó initilize() lúc ấ ả ữ ứ ế ố ấ ạ ờ ế ởnày init c a game chính đã ch y và bi n truy n d li u đó ko b null, b n sẽ ko ủ ạ ế ề ữ ệ ị ạm t th i gian debug m y l i v v n nh th :Dấ ờ ấ ỗ ớ ẩ ư ế

Ngoài ra, hai thu c tính c a GameCompoment là Enable và Visiable, n u chúng làộ ủ ế false thì trong ph n Base các method Update và Draw trong class Game chính sẽầ ở ko ch y (t c là nó ko h ho t đông và ko nhìn th y) ạ ứ ề ạ ấ

3. S d ng Texture, Audio, Video:ử ụ

Xem t i m c XNA c b n - Xvna.forumb.bizạ ụ ơ ả

Ch ng 3: Code Game Đ u tiên c a b n! - GetSixươ ầ ủ ạ

1.Ý t ng c a game!ưở ủ

Đây là tài li u dành cho newbie, nên game r t đ n gi n. newbie nên t coi và t ệ ấ ơ ả ự ựcode game, tuy đ n gi n nh ng t nh ng game đ n gi n này, b n sẽ tích lũy ơ ả ữ ừ ữ ơ ả ạnhi u kinh nghi m cho nh ng game ph c t p h n! Mình sẽ c g ng code th t dề ệ ư ứ ạ ơ ố ắ ậ ễ hi u và khoa h c cho các b n ti n theo dõi.ể ọ ạ ệ

GetSix là trò ch i h t s c đ n gi n. b n sẽ quay súc x c và n u đc 6 đi m b n sẽơ ế ứ ơ ả ạ ắ ế ể ạ chi n th ng, n u ko game sẽ đ a ra s đi m b n đ đc và t o c h i cho b n đ ế ắ ế ư ố ể ạ ổ ạ ơ ộ ạ ổsúc s c m t l n n a. :> Nào b t tay vào vi c luôn ch nh y :)ắ ộ ầ ữ ắ ệ ứ ẩ

2.T o tài nguyên cho game!ạ

Kich phai chu t vào m c Content trong c a s solution >> ộ ụ ử ổ Add new Item >> Sprite Font >> đ t tên cho Font là "font"ặ >> Add

Contact me at [email protected] or http://xvna.forumb.biz

Page 11: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

3.L p trình c b n cho GetSixậ ơ ả

3.1 Tao s ng u nhiên!ố ẫ

T o s ng u nhiên th ng là ph n c b n c a game, t s ng u nhiên chúng ta ạ ố ẫ ườ ầ ơ ả ủ ừ ố ẫt o ra v trí, t c đ , s l ng, ch s s c m nh... c a đ i t ng trong game m t ạ ị ố ộ ố ượ ỉ ố ứ ạ ủ ố ượ ộ

Contact me at [email protected] or http://xvna.forumb.biz

Page 12: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

cách ng u nhiên! Ng i ch i ko bi t đc m t s ng u nhiên là bao nhiêu, đi u nàyẫ ườ ơ ế ộ ố ẫ ề t o ra h ng thú cho hạ ứ ọ

Class mình xây d ng đ t o s ng u nhiên, s d ng ự ể ạ ố ẫ ử ụ method Get(num) nh m ằt o 1 s nguyên ng u nhiên t 0 đ n numạ ố ẫ ừ ế///namespace GetSix_Xvna.forumb.biz{ static class GetRanDom { static Random random = new Random();

public static int Get(int num) { random.GetHashCode(); return random.Next(num)+1; } }}

3.2 Đi u khi n Input t keyBoard b ng kỹ thu t Press và Release!ề ể ừ ằ ậ

Class này xây d ng nh m m c đích check input d dàng h n cho player.ự ằ ụ ễ ơ Method Press(key) xác đ nh khi m t key dc nh n xu ng! method tr v true ị ộ ấ ố ả ềtrong su t quá trình key đ c nh n!ố ượ ấ Method Release(Key) xac dinh khi m t key đ c nh n xu ng, sau đó nó ộ ượ ấ ốđ c nh ra, khi nó nh ra thì method này m i tr v trueượ ả ả ớ ả ề Method Update() ph i đ c g i trong Update(GameTime) c a class Game ả ượ ọ ủc a b n!ủ ạ///namespace GetSix_Xvna.forumb.biz{ class Input { KeyboardState keyBoard ; KeyboardState lastKeyBoard = Keyboard.GetState();

public void Update() { lastKeyBoard = keyBoard; keyBoard = Keyboard.GetState(); } public bool Press(Keys key) { return keyBoard.IsKeyDown(key); } public bool Release(Keys key) { return (keyBoard.IsKeyUp(key) && lastKeyBoard.IsKeyDown(key));

Contact me at [email protected] or http://xvna.forumb.biz

Page 13: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 } }}

3.3 Hoàn thi n trò ch i trong class Game chính!ệ ơ

D i đây là class chính cho trò ch i GetSix! ướ ơnamespace GetSix_Xvna.forumb.biz{ /// <summary> /// This is the main type for your game /// </summary> public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; //Cac bien ban khai bao': int number = 0; Input input = new Input(); SpriteFont font;

Đây là hàm c u trúc cho game:ấ public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; }

Chúng ta thi t l p spriteBatch đây, load font t Content đây cũng đ c!ế ậ ở ừ ở ượ protected override void Initialize() {//Thi t l p cho spriteBatch c a b n đây, chúng ta sẽ dùng nó trong //vi c Draw text lên gameế ậ ủ ạ ở ệ spriteBatch = new SpriteBatch(GraphicsDevice);//Load font t contentừ font = Content.Load<SpriteFont>("font"); base.Initialize(); }

Method Update này sẽ đ c g i đi g i l i trong su t quá trình ch y game, m c ượ ọ ọ ạ ố ạ ụđích là Ki m tra tính lôgic c a game thông qua các câu l nh mà b n code!ể ủ ệ ạ protected override void Update(GameTime gameTime) {//Update cho Input input.Update(); //Nhan space de quay suc xac if (input.Release(Keys.Space)) //So diem suc xac la` 1 den 6! number = 1 + GetRanDom.Get(5); //Thoat neu nhan esc if (input.Release(Keys.Escape)) Exit();

base.Update(gameTime); }

Contact me at [email protected] or http://xvna.forumb.biz

Page 14: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Method Draw(GameTime) này làm nhi m v đ a đ h a lên màn hình, nh ph i ệ ụ ư ồ ọ ớ ảbegin() spriteBatch tr c khi b n mu n Draw b t c th gì lên màn hình và ướ ạ ố ấ ứ ứEnd() sau khi đã Draw h t m i th b n mu n.ế ọ ứ ạ ố protected override void Draw(GameTime gameTime) {//Thi t l p màu n n là CornflowerBlue!ế ậ ề GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();

DrawText("Chao mung ban den voi tro choi Do suc xac!", new Vector2(100, 200),Color.Red);

if (number == 0) DrawText("Moi ban quay so", new Vector2(100, 300), Color.Purple); else if(number == 6) DrawText("Xin chuc mung, ban da chien thang khi quay dc so 6", new Vector2(100, 300), Color.Pink); else DrawText("Diem so hien tai ma ban quay duoc: " + number, new Vector2(100, 300), Color.PowderBlue);

DrawText("Nhan Space de bat dau quay so!", new Vector2(150, 400), Color.PapayaWhip); DrawText("Nhan ESC de thoat game!", new Vector2(150, 500), Color.OrangeRed); spriteBatch.End();

base.Draw(gameTime); }

Method DrawText , Draw n i dung , v trí vi t ch và màu chộ ị ế ữ ữ public void DrawText(string st, Vector2 pos,Color color) { spriteBatch.DrawString(font, st, pos, color); }

Xong rùi đó!

Contact me at [email protected] or http://xvna.forumb.biz

Page 15: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Ch ng 4: Vi t m t Game có tính t ng tác cao - Pong!ươ ế ộ ươ

1.T i sao l i là pong?ạ ạ

Pong là m t trò ch i c đi n, Chính xác thì nó là game đ u tiên c a th gi i! tuy ộ ơ ổ ể ầ ủ ế ớv y pong l i là m t trò ch i thú v , có tính t ng tác cao và có đ y u t c a m t ậ ạ ộ ơ ị ươ ủ ế ố ủ ộgame hoàn ch nh. Thêm n a code trò pong khá đ n gi n nên newbie có th n m ỉ ữ ơ ả ể ắđ c mã l nh m t cách d dàng, t ng đó b n sẽ rút ra đc kinh nghi m l p trình ượ ệ ộ ễ ừ ạ ệ ậxna cho b n thânả

Trong pong sẽ có 2 cây v t (pad) và 1 qu bóng (ball). Ng i ch i ho c AI sẽ ợ ả ườ ơ ặđi u khi n v t, đánh bóng và n u đ i ph ng ko đ đc qu bong b n đánh v ề ể ợ ế ố ươ ỡ ả ạ ềphía h , b n sẽ ghi đ c 1 đi m!ọ ạ ượ ể

Chúng ta sẽ xây d ng 2 phiên b n cho pong: player vs player và player vs AI !ự ả

2. Chu n b tài nguyênẩ ị

Ko có gì đ c bi t c , các b n ch c n ki u nh :ặ ệ ả ạ ỉ ầ ể ư

Contact me at [email protected] or http://xvna.forumb.biz

Page 16: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

: Trái banh đ đánhể

: Cây v tợ

1 Sprite Font (Cách t o có ch ng tr c)ạ ở ươ ướ

3. Code Game!

B n nh n th y c ball và pad đ u chuy n đ ng, n u mu n m t v t chuy n ạ ậ ấ ả ề ể ộ ế ố ộ ậ ểđ ng nó ph i có 2 y u t là v trí và v n t c. b n cũng c n ki m tra va ch m c a ộ ả ế ố ị ậ ố ạ ầ ể ạ ủc v t và bóng trong quá trình ch i đúng ko nào? v y chúng ta đã tìm ra nh ng ả ợ ơ ậ ữđi m chung c a pad và ball, do đó sẽ r t ti n n u chúng ta xây d ng 1 l p c s ể ủ ấ ệ ế ự ớ ơ ởlà Sprite t đó pad và ball sẽ k th a t Sprite!ừ ế ừ ừ Hãy nh th t code game: ớ ứ ự Bao gi cũng ph i code l p c s tr c, sau đó ờ ả ớ ơ ở ướđ n các l p m r ng c a nó và cu i cùng m i là class game chính !ế ớ ở ộ ủ ố ớ

Sprite là gì? Nói m t cách nôm na thì sprite và nh ng v t th có th di chuy nộ ữ ậ ể ể ể và t ng tác trong game (ng i ch i, k thù, NPC...). Phân bi t nó v i static ươ ườ ơ ẻ ệ ớhay solid object, t c là nh ng đ i t ng c ng ko t ng tác hay thay đ i trong ứ ữ ố ượ ứ ươ ổgame (nh b c t ng, hòn đá...).ư ứ ườ

3.1 Sprite class

D i đây là chi ti t cho l p Sprite:ướ ế ớ

namespace Pong_Xvna.forumb.biz{ /// <summary> /// This is a game component that implements IUpdateable. /// </summary> public class Sprite : Microsoft.Xna.Framework.DrawableGameComponent {

Đi m chung c a ball và pad sẽ đ c th hi n đây.ể ủ ượ ể ệ ở Texture (m t b c nh 2D bao ph lên đ i t ng trong game)ộ ứ ả ủ ố ượV trí, v n t c, SpriteBatch làm nhi m v Draw Sprite!ị ậ ố ệ ụ

Contact me at [email protected] or http://xvna.forumb.biz

Page 17: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Đi m Center (tr v t a đ tâm c a Sprite) làm c s cho thu t toán n y choể ả ề ọ ộ ủ ơ ở ậ ả trái banh!Đánh d u là protected đ đ m b o l p m r ng c a b n có th s d ng l i ấ ể ả ả ớ ở ộ ủ ạ ể ử ụ ạnh ng bi n này!ữ ế

protected Texture2D texture; protected Vector2 position, velocity; protected SpriteBatch sp;

Hãy t o thói quen xây d ng thu c tinh, t t nhiên, b n có th đánh d u là public ạ ự ộ ấ ạ ể ấcho position và velocity, tuy th v i 1 game ph c t p , thu c tính sẽ làm b n d ế ớ ứ ạ ộ ạ ễdàng nh n ra giá tr h n nhi u so v i bi n. T o thói quen đ t tên : ậ ị ơ ề ớ ế ạ ặ vi t th ng ế ườcho bi nế và vi t hoa ch cái đ u tiên cho thu c tínhế ữ ầ ộ ! Nh là 1 quy t c ng m v y ư ắ ầ ậvà b n sẽ ko bao gi nh m l n gi a 2 lo i này.ạ ờ ầ ẫ ữ ạ public Vector2 Center { get { return position + new Vector2(texture.Width / 2, texture.Height / 2); } } public Vector2 Position { get { return position; } set { position = value; } } public Vector2 Velocity { get { return velocity; } set { velocity = value; } }

Method c u trúc cho sprite, cái "base" đây là do nó k th a t ấ ở ế ừ ừDrawableGameComponent! public Sprite(Game game,Vector2 pos, Vector2 velo) : base(game) { this.position = pos; this.velocity = velo;

S d ng Service l y t class Game chínhử ụ ấ ừ , sau này khi code class game chính, chúng ta sẽ Add service, bây gi c ờ ứ GetService cái đã ! sp = (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));

mã l nh th hi n List Component c a Class game chính sẽ add Sprite vào, sau ệ ể ệ ủnày nó sẽ đ c t đ ng Update và Draw, b n kh i ph i dài dòng code thêm trongượ ự ộ ạ ỏ ả class game chính (Game đây là bi n có liên quan tr c ti p đ n Game chính c a ở ế ự ế ế ủb n (Game1.cs)ạ Game.Components.Add(this); }

Bây gi đ n thu t toán va ch m. do đ c thù c a pad là object pad có d ng hcn ờ ế ậ ạ ặ ủ ạnên chúng ta vi t method tr v hcn bao quanh l y pad! Nh d i đây:ế ả ề ấ ư ướ

Contact me at [email protected] or http://xvna.forumb.biz

Page 18: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

public Rectangle getBound() { return new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height); }

Đ xác đ nh va ch m gi a 2 Sprite, ta ch vi c xem xem hcn bao quanh 2 Sprite đóể ị ạ ữ ỉ ệ có trùng nhau hay ko! Intersects() method sẽ xác đ nh vi c đó và hành d i đây ị ệ ướsẽ xác đ nh xem 2 Sprite có va ch m nhau hay ko! Quá đ n gi n ph i không b n.ị ạ ơ ả ả ạ public bool CheckCollides(Sprite s) { return getBound().Intersects(s.getBound()); }

Không c n Update gì nhi u, đo n code này b n cũng hi u là khi velocity != ầ ề ạ ạ ểvector2.Zero thì v t sẽ di chuy n theo 2 tr c Ox và Oy theo các giá tr velocity.X ậ ể ụ ịvà velocity.Y public override void Update(GameTime gameTime) { position += velocity;

base.Update(gameTime); }

Quá đ n gi n! đ a sprite lên màn hinh c a ng i ch i.ơ ả ư ủ ườ ơ public override void Draw(GameTime gameTime) { sp.Draw(texture, position, Color.White); base.Draw(gameTime); } }}

3.2 Xây d ng l p Pad (player control)ự ớ

Nh b n th y, pad k th a t sprite!ư ạ ấ ế ừ ừ

public class Pad : Sprite {

Input, chúng ta cũng sẽ getService nó t Game chính!ừIndex là ch s cho ng i ch i, ỉ ố ườ ơ do index khác nhau nên sau này mã l nh đ Checkệ ể Keyboard cũng sẽ khác nhau.Point là s đi m ng i ch i, d a vào đó mà xác đ nh th ng thua.ố ể ườ ơ ự ị ắ

đây pad sẽ có Ở chuy n đ ng gia t c đ tăng tính h p d n , gia t c = 2.ể ộ ố ể ấ ẫ ố Input input; int index; int point = 0;

Contact me at [email protected] or http://xvna.forumb.biz

Page 19: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 float accel = 2f;

public int Point { get { return point; } set { point = value; } } public Pad(Game game,Vector2 pos,Vector2 velo,int index) : base(game,pos,velo) { this.index = index;

Đây là class riêng cho pad, b n có th load texture đây, tuy v y Sprite thì ko ạ ể ở ậ ởđ c load Texture do nó là đ dùng chung c a pad và ballượ ồ ủ texture = Game.Content.Load<Texture2D>("pad"); input = (Input)Game.Services.GetService(typeof(Input)); }

Nh b n th y , tùy theo index mà sẽ có cách Check KeyBoard khác nhau. V n ư ạ ấ ật c thay đ i b i gia t c, do đó pad sẽ di chuy n theo ki u ch m d n đ u hay ố ổ ở ố ể ể ậ ầ ềnhanh d n đi u!ầ ề public override void Update(GameTime gameTime) {//Pad chuy n d ng lên trênể ộ if (index == 1 ? input.Press(Keys.Up) : input.Press(Keys.W)) velocity.Y -= accel;//Pad chuy n đ ng xu ng d iể ộ ố ướ else if (index == 1 ? input.Press(Keys.Down) : input.Press(Keys.S)) velocity.Y += accel;//Do có gia t c, ta ph i gi i h n l i vân t c! giá tr ch n m trong kho ng [-7,7]ố ả ớ ạ ạ ố ị ỉ ằ ả velocity.Y = MathHelper.Clamp(velocity.Y, -7, 7);

Vector2 lastPos = position;//Base se tien hành : position+= velocity;

base.Update(gameTime);//Ngan chan pad ra khoi man hình (kick th c: 800 x 500)ướ if (position.Y < 0 || position.Y > 500 - texture.Height) position = lastPos; }

3.3 Ball Class.

public class Ball : Sprite { public Ball(Game game,Vector2 pos, Vector2 velo) : base(game,pos,velo) {//load texture texture = Game.Content.Load<Texture2D>("ball"); }

Contact me at [email protected] or http://xvna.forumb.biz

Page 20: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Ball sẽ đ o t c đ Y n u bóng ch m biên!, t i sao chúng ta ko KT t a X? đ n gi n ả ố ộ ế ạ ạ ọ ơ ảlà Khi bóng khi quá màn hình tr c X t c là 1 bên đã ghi đi m, t t nh t ph n ghi ở ụ ứ ể ố ấ ầđi m chúng ta hãy code class Game chính.ể ở public override void Update(GameTime gameTime) { if (position.Y < 0 || position.Y > 500 - texture.Height) velocity.Y *= -1;

base.Update(gameTime); }

3.4 Class Game Chính (Game1.cs)

Class này K th a t Game c a xna!ế ừ ừ ủ

public class Game1 : Microsoft.Xna.Framework.Game {

Chúng ta khai báo pad, ball, font (Đ ghi đi m ng i ch i), input (class t ch ngể ể ườ ơ ừ ươ tr c)ướ GraphicsDeviceManager graphics; SpriteFont font; SpriteBatch spriteBatch; Input input = new Input();

Pad player1, player2; Ball ball;

public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content";

//Đ t kick th c màn hình:ặ ướ graphics.PreferredBackBufferWidth = 800; graphics.PreferredBackBufferHeight = 500; }

Ch y u là thi t l p cho các bi n đã khai báo trên. Đ t 2 pad t i 2 đ u màn ủ ế ế ậ ế ở ặ ạ ầhình theo t a đ c a nó, truy n cho ball t c đ X d ng nh m cho bi t player ọ ộ ủ ề ố ộ ươ ằ ếbên trái sẽ là ng i giao bóng!ườ protected override void Initialize() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); Services.AddService(typeof(SpriteBatch), spriteBatch); Services.AddService(typeof(Input), input); font = Content.Load<SpriteFont>("font");

player1 = new Pad(this, new Vector2(0, 300), Vector2.Zero, 0);

player2 = new Pad(this, new Vector2(780, 300), Vector2.Zero, 1);

Contact me at [email protected] or http://xvna.forumb.biz

Page 21: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

ball = new Ball(this, new Vector2(30, 330), new Vector2(5, 0));

base.Initialize(); }

Đ u tiên ph i Update Input!ầ ả Ki m tra va ch m c a pad v i ball, t đó thay đ i v n t c cho ball.ể ạ ủ ớ ừ ổ ậ ố Có nhi u cáchề đ làm vi c này. ể ệ Chúng ta tính kho ng cách t trung tâm pad đ n trung tâm ball ả ừ ếđ xác đ nh t c đ tr c Y cho ball. Có 2 lý do đ sài thu t toán này.ể ị ố ộ ụ ể ậ+ Nó r t đ n gi n ch là : ấ ơ ả ỉ Math.Abs(ball.Center.Y - player1.Center.Y)/5

+ Hi u qu : khi ng i ch i đánh 1 pha bóng m o hi m (đi m ch m c a qu ệ ả ườ ơ ạ ể ể ạ ủ ảbóng n m xa trung tâm c a pad, do đó player d đánh h t) h sẽ làm cho v n t cằ ủ ễ ụ ọ ậ ố tr c Y c a ball đ t giá tr cao (bóng sẽ n y r t m nh ) gây khó khăn cho đ i thụ ủ ặ ị ả ấ ạ ố ủ! Ng c l i thì ượ ạ 1 pha bóng an toàn (đi m ch m g n tâm pad) sẽ đ y bóng n y y u ể ạ ầ ẩ ả ếvà đ i th d ph n công! Cái này th hi n 1 nguyên t c r t c b n c a game: ố ủ ễ ả ể ệ ắ ấ ơ ả ủLi u ăn nhi u ề ề protected override void Update(GameTime gameTime) { input.Update();

if (player1.CheckCollides(ball)) ball.Velocity = new Vector2(ball.Velocity.X * -1, Math.Abs(ball.Center.Y - player1.Center.Y)/5); if (player2.CheckCollides(ball)) ball.Velocity = new Vector2(ball.Velocity.X * -1, Math.Abs(ball.Center.Y - player2.Center.Y)/5);

Sau khi bóng v t qua biên màn hình, đi m sẽ đ c ghi và trái bóng đ c giao tượ ể ượ ượ ừ phía ng i ch i v a ghi đi m, code d i đây th hi n đi u này:ườ ơ ừ ể ướ ể ệ ề if (ball.Position.X < 0) { player2.Point++; ball.Position = new Vector2(740, 330); ball.Velocity = new Vector2(-5, 0); player1.Position = new Vector2(0, 300); player2.Position = new Vector2(780, 300); } if(ball.Position.X > 760) { player1.Point++; ball.Position = new Vector2(30, 330); ball.Velocity = new Vector2(5, 0); player1.Position = new Vector2(0, 300); player2.Position = new Vector2(780, 300); } base.Update(gameTime); }

Contact me at [email protected] or http://xvna.forumb.biz

Page 22: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Cu i cùng là Draw method. B n ph i begin spriteBatch, sau đó, Draw cho các ố ạ ảGameComponent thông quá base.Draw(GameTime), cu i cùng dùng SpriteBatch ốvẽ đi m s c a t ng ng i ch i lên màn hìnhể ố ủ ừ ườ ơ protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black);

spriteBatch.Begin(SpriteBlendMode.AlphaBlend);// Draw cho t t c gameComponent có trong Components c a Game1 !ấ ả ủ// ball và pad đi u đã add vào list này, xem l i l p Sprite.cs ề ạ ớ

base.Draw(gameTime);

spriteBatch.DrawString(font, "Player 1: " + player1.Point, new Vector2(100, 100), Color.White); spriteBatch.DrawString(font, "Player 2: " + player2.Point, new Vector2(600, 100), Color.White);

spriteBatch.End(); } }}

V c b n thì Pong: player vs player đã hoàn thành, b n ch c n xác đ nh ai win ề ơ ả ạ ỉ ầ ịki u nh :ể ưif(player1.Point>4){

spriteBatch.DrawString(font, "Player 1 win!", new Vector2(200, 200), Color.White);Components.Clear();

} else if (player2.Point > 4){

Components.Clear(); spriteBatch.DrawString(font, "Player 2 win!", new Vector2(200, 200), Color.White);}

Sẽ xác đ nh ng i đ u tiên đ t 5 đi m sẽ dành chi n th ng! ị ườ ầ ạ ể ế ắ

Ph n ti p theo mình sẽ nói đ n cách xây d ng AI cho Pong!ầ ế ế ự

4. Xây d ng AIPadự

4.1 Vi t Class AIPadế

B n xây d ng l p AIPad k th a t Sprite, chúng ta ch c n code nh d i đây, ạ ự ớ ế ừ ừ ỉ ầ ư ướđ n gi n là AIPad sẽ có cách chuy n đ ng khác v i Pad mà ng i ch i đi u ơ ả ể ộ ớ ườ ơ ềkhi n. Chúng ta sẽ code AI t i class Game chính.ể ạ /// </summary> public class AIPad : Sprite { int point = 0;

public int Point

Contact me at [email protected] or http://xvna.forumb.biz

Page 23: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 { get { return point; } set { point = value; } } public AIPad(Game game, Vector2 pos, Vector2 velo) : base(game, pos, velo) { texture = Game.Content.Load<Texture2D>("pad"); } }

4.2 S a l i trong game chính nh sau:ử ạ ư

Đ u tiên t o ra th hi n cho AIPad:ầ ạ ể ệ

AIPad player2;

Có 4 y u t t o nên 1 AI t t:ế ố ạ ố-D b đánh b i: Gamer nào cũng mu n win, n u h ko win đc, h sẽ ko đ i nào ễ ị ạ ố ế ọ ọ ờch i gameơ c a b nủ ạ .-không d b đánh b i: Đ i th quá y u làm gamer th y chán và h đi tìm m t ễ ị ạ ố ủ ế ấ ọ ộgame khó h n.ơ-Kh năng thay đ i: Nó có th t d tr thành khó h n khi ng i ch i lên tay và ả ổ ể ừ ễ ở ơ ườ ơgi h ng i xu ng lâu h n đ chinh ph c các m c đ m iữ ọ ồ ố ơ ể ụ ứ ộ ớ-Kh năng s ng đ ng: AI c n có tính logic, có th d đoán đc gi ng nh là m t ả ố ộ ầ ể ự ố ư ộcon ng i đnag ch i cùng b n v y (di chuy n, t n công...) giúp ng i ch i có thườ ơ ạ ậ ể ấ ườ ơ ể phán đoán và chi n th ng trong game.ế ắ

Bây gi nói đ n cách t o ra AI. M u ch t c a game là làm sao cho pad đánh ờ ế ạ ấ ố ủtrúng (va ch m) v i ball đ đánh qu banh v phía đ i th ph i hok nào. Gi s ạ ớ ể ả ề ố ủ ả ả ửban code trong Update nh sau: ưAIPad.Position.Y = Ball.Position.Y (Th c ra la hok dc vì Position là thu c tính)ự ộthì m i chuy n sẽ ra sao? Hi n nhiên AIPad luôn cùng t a đ Y v i ball và do đó ọ ệ ể ọ ộ ớnó luôn di chuy n cùng v i ball => nó sẽ ko bao gi đánh h t. AI đã làm quá t t, ể ớ ờ ụ ốko có 1 chút s h nào và đây cũng là đi m ko t t c a AI. Ng i ch i ko bao gi ơ ở ể ố ủ ườ ơ ờh ng thú v i AI Pad ko bao gi đánh h t. Nói cách khác là player sẽ ko bao gi ứ ớ ờ ụ ờchi n th ng, h sẽ th y đi u này ko thú v ế ắ ọ ấ ề ị . Do đó chúng ta sẽ code cho AIpad có tính "ng i" h n. T c là nó v n có s h đ ng i ch i có th chi n th ng ườ ơ ứ ẫ ơ ở ể ườ ơ ể ế ắ

Theo cách tính vân t c Y c a ball: ố ủ Math.Abs(ball.Center.Y - player1.Center.Y)/5

Contact me at [email protected] or http://xvna.forumb.biz

Page 24: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Trong file m u mình làm, qu bóng ball.texture.Width/2 = 20 pixel, ẫ ảPad.texture.Width/2 = 30 Pixel. Do đó kho ng cách xa nh t mà hai đi m center ả ấ ểc a pad và ball có th có mà v n đ m b o va ch m gi a chúng là 50 pixel! Chia ủ ể ẫ ả ả ạ ữcho 5 t c là v n t c t i đa (theo đ l n) mà ball có theo tr c Y (ball.Velocity.Y) sẽứ ậ ố ố ộ ớ ụ là 50/5 = 10 pixel / 1 l n Update . V y cú đánh t t nh t c a b n có th có sẽ có ầ ậ ố ấ ủ ạ ểđ n y (t c đ Y) c a trái banh là 10 pixel. V y n u mình code nh sau:ổ ả ố ộ ủ ậ ế ưif (player2.Center.Y < ball.Center.Y) { player2.Velocity = new Vector2(0, 10); } else { player2.Velocity = new Vector2(0, -10); }

Thì AI cũng ko bao gi đánh h t, đ n gi n t c đ Y c a nó đã b ng v i t c đ Y ờ ụ ơ ả ố ộ ủ ằ ớ ố ộcao nh t có th có là 10 pixel / 1 l n Update.ấ ể ầ

Đ AIpad ng i h n, chúng ta s a l iể ườ ơ ử ạ

//Trong Update method !

player2 = new AIPad(this, new Vector2(780, 300), Vector2.Zero);

if (player2.Center.Y < ball.Center.Y) { player2.Velocity = new Vector2(0, 5); } else { player2.Velocity = new Vector2(0, -5); }

N u nh v y v i nh ng cú đánh khó, AIpad sẽ bó tay ch u ch t! nh ng v i nh ngế ư ậ ớ ữ ị ế ư ớ ữ cú đánh d , nó sẽ ph n đòn l i b n và b n sẽ loay hoay tìm cách ch ng đ ! Sao ễ ả ạ ạ ạ ố ỡnào, thú v đ y ch , bây gi b n đã có 1 AI t m n đ ch i cùng! Đ tăng đ khó,ị ấ ứ ờ ạ ạ ổ ể ơ ể ộ b n tăng t c đ Y c a AIpad t 5 lên 9 xem nào ạ ố ộ ủ ừ Nâng c p game: th tăng s l ng pad cho nhi u ng i ch i ho c ch i 1 lúc ấ ử ố ượ ề ườ ơ ặ ơnhi u qu ball , t o v t c n trên đ ng đi c a ball ể ả ạ ậ ả ườ ủ ...

Contact me at [email protected] or http://xvna.forumb.biz

Page 25: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Ch ng 5: ươ Các t o gameComponent m t Cách "Đ ng" - Asteroids Projectạ ộ ộ

Pong ch ng 4 là m t game thú v , ph i ko nào? nh ng nh ng th hi n đ c ở ươ ộ ị ả ư ữ ể ệ ượchúng ta t o ra hoàn toàn b ng tay (khai báo, c u trúc, đi u khi n ... )ạ ằ ấ ề ể

Th c t trong game, object ph i đ c t o ra m t cách "đ ng", tùy thu c đi u ự ế ả ượ ạ ộ ộ ộ ềki n c a trò ch i. Ví d , 1 RangeMonster sẽ b t ra 100 đ n l a, đ n l a sẽ ph i ệ ủ ơ ụ ắ ạ ử ạ ử ảđc t o ra theo cách đ ng (ch ng lẽ b n đ nh khai báo 100 đ n l a rùi khi nào c nạ ộ ẳ ạ ị ạ ử ầ thì Show nó ra ah)

L n này mình sẽ h ng d n các b n vi t trò Asteroids. M t phi thuy n do ng iầ ướ ẫ ạ ế ộ ề ườ ch i sẽ l l ng trong ko gian, phi thuy n b n v các thiên th ch trôi g n mình, ơ ơ ủ ề ắ ở ạ ầkhi v sẽ có nhi u m nh thiên th ch nh h n v ra, và c th n u c b n , nó sẽ ỡ ề ả ạ ỏ ơ ỡ ứ ế ế ứ ắl i v ra ạ ỡ . T t nhiên t t c thiên th ch sẽ đ c t o ra 1 cách đ ng! Ngoai ra ấ ấ ả ạ ượ ạ ộtrong game, minh sẽ h ng d n cách t o GUI đ n gi n, các s d ng particle ướ ẫ ạ ơ ả ử ụeffect

Chung ta cũng sẽ xóa b thiên th ch b ng cách "đông" - dùng mã l nh, khi chúng ỏ ạ ằ ệcó kích th c quá nh !ướ ỏ

Tài nguyên các b n có th s d ng trong asteroids project m u mà mình làm ạ ể ử ụ ẫ(code và debug h t g n 4h ế ầ )

Hình d i đây là toàn b n i dung d án ướ ộ ộ ự :

Contact me at [email protected] or http://xvna.forumb.biz

Page 26: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

1.Core Folder

Ch a nh ng class c s : Sprite và GameSceneứ ữ ơ ở-Sprite m r ng ra cho Player, Rock và bulletở ộ-GameScene m r ng ra cho StartScene, ActionScene và EndScene.ở ộ

1.1Sprite

Sprite khá gi ng v i sprite trong d án pong, mình thêm vài th sau:ố ớ ự ứ

//Method lo i b sprite khi b n ko c n dùng đ n nó n a (thiên th ch b n ạ ỏ ạ ầ ế ữ ạ ị ổch ng h n)ẳ ạpublic virtual void Remove() { position = -100 * Vector2.One; Visible = false; Enabled = false; Dispose(true);

Contact me at [email protected] or http://xvna.forumb.biz

Page 27: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 }

//Trong update thêm code đ sprite cu n trong màn hìnhể ộ public override void Update(GameTime gameTime) { position += velocity; //Cuon trong man hinh if (position.X < 0) position.X = 800 - texture.Width; if (position.X > 800 - texture.Width) position.X = 0; if (position.Y < 0) position.Y = 600 - texture.Height; if (position.Y > 600 - texture.Height) position.Y = 0; base.Update(gameTime); }

Đ u tiên chúng ta nói qua v m t Draw() method đ y đ các tham s :ầ ề ộ ầ ủ ốspriteBatch.Draw(texture, position , sourceRectangle, Color.White, angle, origin, scale, SpriteEffects, depth);Các tham s l n l t là:ố ầ ượTexture: b c nh load t Content và sẽ bao ph lên toàn b sprite.ứ ả ừ ủ ộPosition: V trí mà XNA sẽ Draw sprite lên màn hình c a gamerị ủSourceRectangle: hình ch nh t trên b c nh là chúng ta v a load vào (ch có ữ ậ ứ ả ừ ỉnh ng vùng trên b c nh thu c hình ch nh t đó m i đc th hi n trong game.ữ ứ ả ộ ữ ậ ớ ể ệ B n có th kh i t o m t Rectangle v i thu c tính t a đ X,Y và chi u dài , ạ ể ở ạ ộ ớ ộ ọ ộ ềchi u r ng.ề ộColor: Màu sẽ tô n u b c nh có vùng tr ng (tuy nhiên tô ki u AlphaBlend thì ế ứ ả ố ểnó sẽ t đ ng không tô màu nh ng vùng nh tr ng)ự ộ ữ ả ố(float)angle: Góc sẽ xoay sprite (m c đ nh là 0f)ặ ị(Vector2)Origin : t a đ đi m trung tâm sprite (đ t là t a đ tâm c a m t ọ ộ ể ặ ọ ộ ủ ộ

frame), N u angle != 0 thì sprite sẽ xoay xung quanh đi m origin.ế ểScale: Phóng to hay thu nh sprite theo cùng t l width/heightỏ ỉ ệSpriteEffect: hi u ng l t texture (ngang, d c ho c ko dùng)ệ ứ ậ ọ ặDepth: Đ sâu (sprite nào có depth cao h n thì đ c draw chèn lên trên sprite ộ ơ ượ

có detph th p h n, n u cùng depth thì sprite nào đc t o ra tr c sẽ b sprite ấ ơ ế ạ ướ ịDraw đè lên trên (ch nh thêm Begin() method c a spriteBatch n a... )ỉ ở ủ ữ

Trong Draw method, mình s d ng sp.Draw v i đ y đ 7 tham s ử ụ ớ ầ ủ ốpublic override void Draw(GameTime gameTime) { sp.Draw(texture, position,new Rectangle(0,0,texture.Width,texture.Height), Color.White,angel, new Vector2(texture.Width/2,texture.Height/2) ,Scale,SpriteEffects.None,1f); base.Draw(gameTime); }

Contact me at [email protected] or http://xvna.forumb.biz

Page 28: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

1.2.GameScene Class:

B n t o ra 1 l p m i thuôc lo i DrawableGameCompoment, g i là GameScene,ạ ạ ớ ớ ạ ọ có th đánh d u nó là abtract cũng đc. Vì chúng ta sẽ t o ra nh ng class khác ể ấ ạ ữnhau cho nh ng màn khác nhau d a trên s th a k t GameSceneữ ự ự ừ ế ừBan t o nh ng method sau:ạ ữShow() : Enable và Visiable c a scêne là true, khi đó màn ch i sẽ đc hi n th ủ ơ ể ị(đc update và draw game chính)ởHide() : ng c v i Show(), dùng khi b n mu n qua màn khácượ ớ ạ ố

GameScene ko có m ng Compoments nh c a Game chính, dó đó b n có th ả ư ủ ạ ểt o m ng này (m ng ch a các gameCompoment khác trong màn, VD nh là ạ ả ả ứ ưmenu màn start, Player và Enemy màn Action)ở ở

Compoments c a GameScene cũng ho t đ ng gi ng nh game chính v y, do ủ ạ ộ ố ư ở ậđó Update và Draw method, b n l n l t Update và Draw cho m i object (kở ạ ầ ượ ỗ ế th a t GameCômpoment) có các thu c tính Enable và Vísiable là true nh ừ ừ ộ ưsau:

public override void Update(GameTime gameTime) { // Update the child GameComponents for (int i = 0; i < components.Count; i++) { if (components[i].Enabled) { components[i].Update(gameTime); } }

base.Update(gameTime); }

/// <summary> /// Allows the game component draw your content in game screen /// </summary> public override void Draw(GameTime gameTime) { // Draw the child GameComponents (if drawable)

Contact me at [email protected] or http://xvna.forumb.biz

Page 29: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 for (int i = 0; i < components.Count; i++) { GameComponent gc = components[i]; if ((gc is DrawableGameComponent) && ((DrawableGameComponent) gc).Visible) { ((DrawableGameComponent) gc).Draw(gameTime); } } base.Draw(gameTime);

}D i đây là toàn b code c a GameScene:ướ ộ ủ

#region Using Statements

using System.Collections.Generic;using Microsoft.Xna.Framework;

#endregion

namespace game{ /// <summary> /// This is the base class for all game scenes. /// </summary> public abstract class GameScene : DrawableGameComponent { /// <summary> /// List of child GameComponents /// </summary> private readonly List<GameComponent> components;

public GameScene(Game game) : base(game) { components = new List<GameComponent>(); Visible = false; Enabled = false; }

/// <summary> /// Show the scene

Contact me at [email protected] or http://xvna.forumb.biz

Page 30: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 /// </summary> public virtual void Show() { Visible = true; Enabled = true; }

/// <summary> /// Hide the scene /// </summary> public virtual void Hide() { Visible = false; Enabled = false; }

/// <summary> /// Components of Game Scene /// </summary> public List<GameComponent> Components { get { return components; } }

/// <summary> /// Allows the game component to update itself. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> public override void Update(GameTime gameTime) { // Update the child GameComponents for (int i = 0; i < components.Count; i++) { if (components[i].Enabled) { components[i].Update(gameTime); } }

base.Update(gameTime); }

Contact me at [email protected] or http://xvna.forumb.biz

Page 31: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

/// <summary> /// Allows the game component draw your content in game screen /// </summary> public override void Draw(GameTime gameTime) { // Draw the child GameComponents (if drawable) for (int i = 0; i < components.Count; i++) { GameComponent gc = components[i]; if ((gc is DrawableGameComponent) && ((DrawableGameComponent) gc).Visible) { ((DrawableGameComponent) gc).Draw(gameTime); } } base.Draw(gameTime); } }

}

S d ng GameScene cũng đ n gi n thôi, b n t o class cho Action Scêne ch h n,ử ụ ơ ả ạ ạ ả ạ khai báo các thành ph n c a m ng này (Enemy, player thu c lo i Drawable) và ầ ủ ả ộ ạadd nó vào m ng compoments c a GameScene. Khi dùng trong game chính , v y ả ủ ậlà khi show chúng sẽ ho t đ ng và nhìn th y, hide khi b n chuy n màn (d a vào ạ ộ ấ ạ ể ựthu c tính Enable và Visiable c a GameScene) và Scene t đ ng Update và Draw ộ ủ ự ộ(d a vào thu c tính Enable và Visiable c a chính thành ph n trong m ng đó).ự ộ ủ ầ ả

Cách1 đ n gi n h n r t nhi u đúng ko? Nh ng ch là v i sl màn it thôi, màn ơ ả ơ ấ ề ư ỉ ớnhi u thì switch m t ngh ! Cách 2 thì ph c t p h n nh ng ti n ch các ề ệ ỉ ứ ạ ơ ư ệ ở ỗcompoments sẽ t nó Update và Draw, n u game có nhi u nhân v t (VD: 100 ự ế ề ậEnemy khác nhau) thì cũng ti t ki m đc th i gian code đáng k đ y! n u dùng ế ệ ờ ể ấ ếcách 2 khi chuy n màn trong game chính , b n dùng method sau đ chuy n màn:ể ạ ể ểactiveScene = anyScene;

protected void ShowScene(GameScene scene) { activeScene.Hide(); activeScene = scene;

Contact me at [email protected] or http://xvna.forumb.biz

Page 32: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 scene.Show(); } đây mình vi t thêm hi u ng hình nh thông qua bi n Ở ế ệ ứ ả ế color, kỳ thu t đây là ậđ m đ c (tham s 4) c a m t ộ ờ ụ ố ủ ộ new Color ! do thay đ i đ m đ c c a hình n n ổ ộ ờ ụ ủ ềmà b n sẽ nhìn th y nh th nó v a hi n ra.ạ ấ ư ể ừ ệ

2. Effect folder

Nói chung thì đây là class t o ra effect n , cháy thông qua các particle (texture ạ ổr t nh ), do chuy n đ ng ko ng ng nên ng i xem có c m giác có th gì đó đangấ ỏ ể ộ ừ ườ ả ứ ph p phùng, (n , cháy...)ậ ổ

Các class fire, smoke và explosion ch a các ch s cho phép b n t o ra effect khác ứ ỉ ố ạ ạnhau, ... cũng khá đ n gi n...ơ ả

3. GUI Folder

Ph n này mình vi t m u các l p Button (t o ra nút ch n), Menu (g m 1 danh ầ ế ẫ ớ ạ ọ ồsách button và check keyboard đ đi u khi n button) và Bar (m t thanh hi n th ể ề ể ộ ệ ịHP c a player) ủ

Cách s d ng nh ng l p này xem thêm mã l nh các Scene nhé.ử ụ ữ ớ ở ệ

4.Helper Folder

Ch b sung thêm l p AssetPath, ch a các h ng s là đ ng đ n đ n resource ỉ ổ ớ ứ ằ ố ườ ẫ ếtrong content đ ti n khi code thuiể ệ

5.Object Folder

đây velocity c a player đ c tính d a trên thu c tính góc (angel) và t c đ Ở ủ ượ ụ ộ ố ộ(speed)//KT phim di chuyen if (input.Press(Keys.Up)) speed += 0.2f; if (input.Press(Keys.Down)) speed -= 0.2f; if (input.Press(Keys.Right)) angel += (float)Math.PI / 50; if (input.Press(Keys.Left))

Contact me at [email protected] or http://xvna.forumb.biz

Page 33: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 angel -= (float)Math.PI / 50; speed = MathHelper.Clamp(speed, -3, 5);

velocity = new Vector2(speed * (float)Math.Cos(angel - MathHelper.PiOver2), speed * (float)Math.Sin(angel - MathHelper.PiOver2));

M i ng i xem bài "L p trình ng d ng toán và lý" t i m c xna c b n nhéọ ườ ậ ứ ụ ạ ụ ơ ảHàm đ t o ra bullet m t cách đ ng:ể ạ ộ ộ//Check key de ban' if (input.Press(Keys.Space)) { if (time > 300) { time -= 300; Bullet b = new Bullet(game, Position, Vector2.Zero,angel); bullets.Add(b); } else { time += gameTime.ElapsedGameTime.Milliseconds; } } else { time = 300; }

Th c ra bullet cũng chuy n đ ng d a vào angle và speed nh player, do bullet có ự ể ộ ự ưspeed cao h n (ph n init c a bullet) và có cùng angle v i player => bullet sẽ bay ơ ầ ủ ớcùng h ng v i player và có c m giác phi thuy n đang b n ra đ n!ướ ớ ả ề ắ ạĐây là đo n mã Update c a bullet:ạ ủpublic override void Update(GameTime gameTime) { velocity = new Vector2(speed * (float)Math.Cos(angel - MathHelper.PiOver2), speed * (float)Math.Sin(angel - MathHelper.PiOver2));

//Neu co va cham, bullet tu tieu huy position += velocity;

if (position.X < 0 || position.Y < 0 || position.X > 750 || position.Y > 550) { Remove(); } }

Bullet ko cu n mà sẽ b remove khi ra kh i biên màn hình!ộ ị ỏ

6.Scene Folder

Contact me at [email protected] or http://xvna.forumb.biz

Page 34: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Đ u k th a t gameScene, m i th hi n đ u t n d ng đc list ề ế ừ ừ ọ ể ệ ề ậ ụDrawableGameComponent c a GameScene, th nên nh ng class nãy gi mình ủ ế ữ ờvi t, mình đ u add vào cái List này, (GUI, Sprites... ) r t ti n đúng ko?ế ề ấ ệ

6.1 SceneManager:public class SceneManager : Microsoft.Xna.Framework.DrawableGameComponent { GameScene active; StartScene start; ActionScene action; HelpScene help; EndScene end; List<GameScene> sceneList = new List<GameScene>();

public List<GameScene> SceneList { get { return sceneList; } } internal EndScene End { get { return end; } } public GameScene Active { get { return active; } } internal HelpScene Help { get { return help; } } internal StartScene Start { get { return start; } } public ActionScene Action { get { return action; } set { action = value; } }

public SceneManager(Asteroids game) : base(game) { start = new StartScene(game, Game.Content.Load<Texture2D>(AssetPath.BG + "startBG")); action = new ActionScene(game, Game.Content.Load<Texture2D>(AssetPath.BG + "battleBG")); help = new HelpScene(game, Game.Content.Load<Texture2D>(AssetPath.BG + "startBG")); end = new EndScene(game, Game.Content.Load<Texture2D>(AssetPath.BG + "startBG"));

sceneList.Add(start); sceneList.Add(action); sceneList.Add(help); sceneList.Add(end);

active = start;

Contact me at [email protected] or http://xvna.forumb.biz

Page 35: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 ShowScene(start); }

/// <summary> /// Allows the game component to perform any initialization it needs to before starting /// to run. This is where it can query for any required services and load content. /// </summary> public override void Initialize() { foreach (GameScene scene in sceneList) scene.Initialize();

base.Initialize(); }

đây, đ u tiên t o ra m t danh sách các màn (Scene) trong game, t đó mình Ở ầ ạ ộ ừkhai báo, thi t l p các màn và Add nó vào líst. Ngoài ra khai báo thêm 1 ế ậActiveScene nh m m c đích:ằ ụ+b n mu n ch y scene nào thì gán nó thành ActiveScene thông qua ShowScene ạ ố ạmethod !+Quá trình Update và Draw Scene, nó ch th c hi n v i ActiveScene, do đó b n sẽ ỉ ự ệ ớ ạt n ít tài nguyên máy tính khi ph i l p đi l p l i mã l nh trong Update và Draw !ố ả ặ ặ ạ ệ

public void ShowScene(GameScene scene) { active.Hide(); scene.Initialize(); active = scene; scene.Show(); } /// <summary> /// Allows the game component to update itself. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> public override void Update(GameTime gameTime) { active.Update(gameTime);

base.Update(gameTime); } public override void Draw(GameTime gameTime) {

active.Draw(gameTime);

base.Draw(gameTime); } }}

Quá đ n gi n đúng ko nào ơ ả

6.2 StartScene, EndScene.

Contact me at [email protected] or http://xvna.forumb.biz

Page 36: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Thêm m t vài button, add nó vào compoments...ộ

Cái chính là bi n game đây, tham s thu c ki u Asteroids , t c chính là class ế ở ố ộ ể ứGame chính c a chúng ta. Mình t o 1 thu c tính SceneManager tr v bi n ủ ạ ộ ả ề ếsceneManager c a game chính, do đó t nh ng Scene ph nh Start, End, b n ủ ừ ữ ụ ư ạcũng có th đi u khi n vi c chuy n màn thông qua SceneManager !ể ề ể ệ ểclass StartScene:GameScene { Button start; Button end;

public StartScene(Asteroids game, Texture2D BG) : base(game, BG) { Compoments = new List<DrawableGameComponent>(); Texture2D active = game.Content.Load<Texture2D>(AssetPath.GUI+"Selected"); Texture2D wait = game.Content.Load<Texture2D>(AssetPath.GUI + "NoSelect"); start = new Button(game, active, wait, Button.Status.active,"Start!"); start.Position = Vector2.Zero; end = new Button(game, active, wait, Button.Status.wait,"Quit"); end.Position = new Vector2(0, 50); listButton.Add(start); listButton.Add(end); menu = new Menu(game, listButton); Compoments.Add(menu); input = (Input)Game.Services.GetService(typeof(Input)) as Input; } public override void Update(GameTime gameTime) { if (menu.Index == 0 && input.Release(Keys.Enter)) { game.SceneManager.Action = new ActionScene(game, game.Content.Load<Texture2D>(AssetPath.BG + "battleBG")); game.SceneManager.ShowScene(game.SceneManager.Action); } if (menu.Index == 1 && input.Release(Keys.Enter)) Game.Exit(); base.Update(gameTime); } }

6.3 ActionScene

Đ update và check va ch m cho các object trong game (rock, player, bullet), xem ể ạmã sau:

for (int i = 0; i < rocks.Count;i++ ) { foreach (Bullet b in player.Bullets)

Contact me at [email protected] or http://xvna.forumb.biz

Page 37: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 { //KT va cham bullet voi rock if (b.CheckCollides(rocks[i])) { b.Remove(); explosion.AddParticles(rocks[i].Center); smoke.AddParticles(rocks[i].Center); player.Point += 100; //Tao them 3 rock nho? hon if (rocks[i].Scale > 0.9f) { Rock r1 = new Rock(game, rocks[i].Center, new Vector2(GetRanDom.Get(5) - 2, GetRanDom.Get(5) - 2), rocks[i].Scale * 2 / 3); rocks.Add(r1); Compoments.Add(r1); Rock r2 = new Rock(game, rocks[i].Center, new Vector2(GetRanDom.Get(5) - 2, GetRanDom.Get(5) - 2), rocks[i].Scale * 2 / 3); rocks.Add(r2); Compoments.Add(r2); Rock r3 = new Rock(game, rocks[i].Center, new Vector2(GetRanDom.Get(5) - 2, GetRanDom.Get(5) - 2), rocks[i].Scale * 2 / 3); rocks.Add(r3); Compoments.Add(r3); } rocks[i].Remove(); } //Update cho bullet } //KT va cham cua player voi rock if (player.CheckCollides(rocks[i])) { fire.AddParticles(player.Position); smoke.AddParticles(player.Position); rocks[i].Remove(); player.HitPoint--; if (player.HitPoint <= 0) { score = player.Point; game.SceneManager.ShowScene(game.SceneManager.End); } }

Class cho t ng object ch nên code nh ng v n đ c a riêng object đó, còn khi ừ ỉ ữ ấ ề ủnh ng object t ng tác v i nhau, t t h n b n nên code trong Scene chung c a ữ ươ ớ ố ơ ạ ủcác object, đây là ActionScene. Dùng l nh for và foreach đ KT check va ch m ở ệ ể ạgi a các object, ngoài ra còn remove nh ng object ko còn s d ng đã đ c g i ữ ữ ử ụ ượ ọph ng th c Remove()ươ ứ Vi c remove object khoi list object (bullets, rocks) và component c a ệ ủGameScene sẽ làm cho s l n l p mã l nh m i đ t Update và Draw gi m xu ng, ố ầ ặ ệ ỗ ợ ả ốgame cũng sẽ ch y m t h n (trò này ít ch m y game chi n thu t thì có c ạ ượ ơ ứ ấ ế ậ ảngàn object)

Contact me at [email protected] or http://xvna.forumb.biz

Page 38: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010if (!rocks[i].Enabled)

{ Compoments.Remove(rocks[i]); rocks.Remove(rocks[i]); } for (int i = 0; i < player.Bullets.Count;i++) if (player.Bullets[i].Enabled) player.Bullets[i].Update(gameTime); else player.Bullets.Remove(player.Bullets[i]));

Action có 1 bi n l u l i s đi m ng i ch i - score.ế ư ạ ố ể ườ ơ

score = player.Point;

(m i l n b n trúng rock, score c a player sẽ tăng), khi player ch t (HP <0), scoreỗ ầ ắ ủ ế sẽ đ a ra thành tích ng i ch i EndScene.ư ườ ơ ở

7. Class game chính - Asteroids.cs Game chính h u nh ch có gì ngoài vài cái service truy n cho GameComponent ầ ư ả ề(Input, spriteBatch), ngoài ra b n t o 1 th hi n và c u trúc cho sceneManager, ạ ạ ể ệ ấrùi add nó vào Component, th thui, m i chuy n h t cái method ế ọ ệ ựbase.Update(gameTime) v i base.Draw(GameTime) nó t làm vi c, vi t theo ớ ự ệ ếki u này b n đã t n d ng đ c t t đa s c m nh c a xna! Mã l nh game chính ể ạ ậ ụ ượ ố ứ ạ ủ ệnày ch ch y ch y u d a vào k th a t Microsoft.Xna.Framework.Gameỉ ạ ủ ế ự ế ừ ừ

public class Asteroids : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics;

SceneManager sceneManager;

//Services: Input input = new Input(); SpriteBatch spriteBatch;

public SceneManager SceneManager { get { return sceneManager; } }

public Asteroids() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content";

graphics.PreferredBackBufferWidth = 800; graphics.PreferredBackBufferHeight = 600;

Contact me at [email protected] or http://xvna.forumb.biz

Page 39: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010 } protected override void Initialize() { spriteBatch = new SpriteBatch(GraphicsDevice);

//Add services Services.AddService(typeof(SpriteBatch), spriteBatch); Services.AddService(typeof(Input), input);

sceneManager = new SceneManager(this); sceneManager.Initialize(); Components.Add(sceneManager); base.Initialize(); } protected override void Update(GameTime gameTime) { input.Update();

//Update Active Scene ! base.Update(gameTime); }

protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin(SpriteBlendMode.AlphaBlend); //Draw Active Scene ! base.Draw(gameTime); spriteBatch.End(); } }

Lẽ ra cái code d i này xna t o s n cái program.cs cho b n, mình gom nó vào ướ ạ ẵ ạclass game chính cho g n l i thuiọ ạ //Entry point! - WRITTEN BY HUYETSAT - Xvna.forumb.biz :) static class Program { /// <summary> /// The main entry point for the application. /// </summary> static void Main(string[] args) { using (Asteroids game = new Asteroids()) { game.Run(); } } }}

Xong Asteroids rùi đó, mong các b n t tìm l i cách vi t thông qua h ng d n ạ ự ạ ế ướ ẫmình nhé, n u th y có thì m file m u ra xem rùi nh t code ch đùng C v i V ế ấ ở ẫ ớ ự ứ ớ ở đây nhá

Contact me at [email protected] or http://xvna.forumb.biz

Page 40: [Xvna.forumb.biz]XNA Basic for Newbie

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

Nâng c p game:ấ Có r t nhi u th đ th kh năng l p trình c a b n: tăng thêm Item, thêm ấ ề ứ ể ử ả ậ ủ ạÊnemy có AI, vi t thêm th ng Boss, thêm vũ khí nh tên l a, vòng b o v ... Ai ế ằ ư ử ả ệphát tri n ti p trò asteroid này thì nh Up lên đ m i ng i cùng th ng th c ể ế ớ ể ọ ườ ưở ứnhé

L i k t: Hi v ng các newbie sẽ th y thích thú v i game coding thông qua tài li u ờ ế ọ ấ ớ ệnày! Mình cũng m t g n 2 ngày đ vi t tài li u + làm Resource + t o project ấ ầ ể ế ệ ạm u!ẫ

Chúc m i ng i training Zui Z - HuyetSat - Xvna.forumb.bizọ ườ ẻ

Contact me at [email protected] or http://xvna.forumb.biz