[Xvna.forumb.biz]XNA Basic for Newbie

Post on 02-Dec-2014

166 views 3 download

Transcript of [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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

Copyrights by HuyetSat - Xvna.forumb.biz - 2010

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

Contact me at thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz

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 thanh_vinh648@yahoo.com or http://xvna.forumb.biz