You are on page 1of 34

1

Mc lc
Phn I - Tng quan ..........................................................................................................................3 - Li ni u ......................................................................................................................................4 - Ngnh cng nghip game hin nay v hng pht trin ................................................................4 Phn II Nhp mn XNA ...............................................................................................................5 - Cc phn c bn..............................................................................................................................6 - a mt dng ch vo game ..........................................................................................................9 - a mt tm hnh vo game...........................................................................................................14 - Input................................................................................................................................................17 - a mt on m thanh vo game .................................................................................................19 Phn III Bt u lm mt game n gin ..................................................................................20 - Tnh ton d n ...............................................................................................................................21 + To hnh cho cc i tng trong game ........................................................................................21 + Xy dng cc class ........................................................................................................................21 Class Phi Thuyn .........................................................................................................................21 Class n .....................................................................................................................................22 Class Background ........................................................................................................................28 Class Enemy.................................................................................................................................29 Va Chm ......................................................................................................................................30 Phn IV Review.............................................................................................................................34

Phn I
Tng Quan
Phn ny s tp trung khi qut v ebook ny

Li ni u
Ebook ny do Green Ray Games pht hnh hon ton min ph. Chng ti hi vng cc bn c nim am m c th tip cn nhanh hn vi ngnh cng nghip pht trin game. C rt nhiu ngn ng v nn tng bn c th lp trnh mt game, a phn ngy nay khi lm game client chy trn PC cc nh sn xut u vit trn C++ vi s h tr tuyt vi ca directX, nhng hm nay chng ti s gii thiu vi cc bn mt nn tng c th ni l mi Vit Nam thm ch trn th gii nhng thc s th khng c g l mi . Microsoft XNA c mt qu trnh pht trin qua nhiu nm, thi im hin ti chng ti vit ebook ny l XNA 4.0 chy trn C# 2010. c th lm c game theo hng dn ca ebook ny yu cu cc bn phi c b Visual Studio 2008 hoc t nht l phi c C# 2008. Sau cc bn phi ci Microsoft XNA Game Studio 3.1. Mt iu cn ni thm l tuy ch lm mt game n gin v dnh cho ngi mi, nhng chng ti s khng hng dn chi tit v C#. Nu bn cha lp trnh trn C# bao gi hoc thm ch cn cha bit lp trnh trn cc ngn ng khc th nn bt u tm c mt cun ebook c bn v C# c th tip cn nhanh chng ebook ny . V sao chng ti khng hng dn trn XNA 4.0 C# 2010 m li li mt phin bn. V XNA 4.0 cn phi c windows XP PS3 tr ln nn c th kh cho mt s bn ci cc bn OS c. XNA 3.1 hoc cc phin bn c hn c th d dng cover ln 4.0 m him khi pht sinh li. Tuy ni XNA l d nhng thc s ban u khng phi d dng g. Bn hy c gng kin tr v am m lp trnh th s thnh cng thi.

Ngnh cng nghip game hin nay v hng pht trin


C th ni ngnh cng nghip game hin nay pht trin ht sc a dng. Nu trn PC bn c th thy chia ra lm hai trng phi l game ci t v game chy trn web. Tt nhin theo ebook ny th chng ta chc chn s cho ra mt game ci t nhng ti s ni r hn mt cht v mng game PC. Nu bn ang c d tnh lm game on web th bn nn bit rng ngy nay game trn web thng c vit bng flash, him hn cht l Java v sau ny c th l HTML 5. Nu bn d tnh lm game ci t th c 2 s la chn cho bn l C++ - DirectX v mi hn v gi chng ta ang hc l C# - XNA. Tt nhin Flash, Java v nhiu ngn ng/nn khc cng c th vit game ci t nh bnh thng. Bn cn phi bit thm l theo d on ca cc chuyn gia th k nguyn ca PC sp chm dt, tt nhin d on vn l d on, qua thi gian mi c th chng minh c.

Phn II
Nhp Mn XNA

Cc thnh phn c bn
Sau khi ci ti bn XNA 3.1 v ci t, n s t tm n C# v add vo. So vi DirectX add vo C++ th cng on ny rt thoi mi.

Sau khi ci t xong vo cc loi d n ca C# bn s thy nh hnh trn XNA c th vit game chy trn c Xbox 360 v Zune nhng gio trnh ny s ch i hng dn phn Windows game thi. Sau khi la chn templates Windows game (3.1) bn t tn ri ch ni lu d n sau OK . Sau khi OK d n s c to ra. Trong d n mi bn s thy bn khung Solution Explorer c cp sn Properties, Reference, Content, mt ci hnh icon cho game, mt gamethumbnail v 2 class l game1.cs v program .cs.

+ Properties c cha 1 class ghi thng tin ca d n hin hnh, ci ny bn by gi n v khng cn quan tm.

+ Reference nu hc qua C# chc bn cng bit n l g. Gi bn cng chng cn quan tm ti n na ( nu lp trnh trn DirectX bn s kh vt v vi phn ny). + Game icon l icon ca game bn, phn ny by gi bn khng nn u t vo. + GameThumbnail thuc v bn Xbox cng khng cn quan tm n . + Class Program.cs bn c gi nguyn v cng khng quan tm n. + Nhng ci trn u khng cn quan tm, gi n ci cui cng v duy nht bn phi quan tm tht c bit chnh l class game1.cs. Game1.cs nu nhn ln u bn s thy y l mt class k l, n c using kh nhiu Microsoft.Xna.Framework.* v c to sn nhiu phng thc (method) trong . y chnh l class chnh ca game chng ta s to sau ny, vi tng tng thnh phn ca cc namespace Microsoft.Xna.Framework.* cc bn nhn tn cng on ra n s m nhn nhim v g sau ny, gi bn c gi nguyn n khng cn quan tm lm. Sau y ti s ni r tng phng thc ang c trong game1.cs.

+ u tin l hm to ca game1.cs bn trong n ang c ha v content (content l nhng i tng nh nh , nhc, model, bn s em vo game sau ny).
public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; }

+ K n l phng thc lm nhim v khi to.


protected override void Initialize() { base.Initialize(); }

+ Tip theo l phng thc lm nhim v load content cho game ca bn


protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); }

+ Tip l phng thc unload content, ci ny tm thi bn cha cn quan tm ti . + Tip n l mt phng thc kh quan trng chi phi game ca bn sau ny, phng thc Update
protected override void Update(GameTime gameTime) { base.Update(gameTime); }

Phng thc ny nh tn gi (cp nht), bt c th g bn b vo phng thc ny cng s c cp nht lin tc nu bn khng ghi iu kin km theo. Bn c th xa i dng sau v gi mnh khng cn n:
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

this.Exit();

+ Cui cng l mt phng thc cng quan trng, phng thc Draw.
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); base.Draw(gameTime); }

Nh tn gi ca mnh, n s v cc i tng bn load t content ln game khi c yu cu . Nu bn khng rnh v ting anh v khng thch ri th c th xa sch cc dng ch thch trong game1.cs i chong.

Sau khi xa sch ch thch c v thng thong hn nhiu nh hnh trn. - By gi bn hy th chy xem sao. V y ch ton b l cc phn c sn ca XNA nn sau khi chy thnh cng th bn s thy xut hin mt ci ca s mu xanh. Tm li l t u n gi XNA ch xy dng sn cho chng ta nhng phng thc thit yu sau ny, sau chng ta s t thm vo nhng thnh phn ca ring mnh thnh mt game hon thin.

a mt dng ch vo game
y l ci n gin nht m chng ta s thm vo. - u tin bn cn phi to mt font ch trong content. Click chut phi vo Content >> Add >> New Item Xut hin hp thoi mi (Add new item Content ) Bn chn Sprite Font, sau t tn font (vd: FontChu.spritefont ), sau bm Add. Khi add xong s xut hin mt file font trong content v hin ra mt tab iu chnh cc thng s ca font ch va to. Trong tab mi m ra bn c th thy nhiu th vd nh th font name <FontName>Kootenay</FontName>. Nu bn thch font hay size g th sau ny i, gi tm thi hy gi nguyn v ng tab FontChu.spritefont li.

Tt nhin l ch mi b 1 font ch vo content cha th vit n ra ci ca s xanh c. Gi ta bt u khai bo n.

Vo class game1.cs bn khai bo mt Sprite font sau t tn. VD: SpriteFont fontSeViet; Sau bn vo phng thc LoadContent ch ng dn n font ch bn Content nh sau:
fontSeViet = Content.Load<SpriteFont>("FontChu");

Trong fontSeViet l ci bn va khai bo trn, bn cho content load n tn ca font ch bn to lc trc. Cui cng l phng thc Draw bn thm vo:
spriteBatch.Begin(); spriteBatch.DrawString(fontSeViet, "Game dau tien cua toi ne!", Vector2.Zero, Color.White); spriteBatch.End();

Trong mi khi mun vit/v g bng spriteBatch ta phi m u (.begin) v kt thc n (.end), ti sao li phi rc ri nh vy?- Sau ny nhiu game ln dnh ti matrix bn phi thm i s vo . By gi th ch vy thi. 9

gia m u v kt thc SpriteBatch ta thm vo spriteBatch.DrawString ci u tin chng ta truyn vo l tn khai bo trn (fontSeViet), string "Game dau tien cua toi ne!" chnh l dng ch chng ta s vit ra mn hnh, bn c th thay i nu mun, Vector2.Zero l ta ca dng ch mnh s vit ra mn hnh, Color.White l mu ca dng ch ( y l mu trng).

Nu xut ln mn hnh dng ch bn va vit th phn ny bn thnh cng. Nu chy b li c l bn lm khng ng ch, bn c th gii nn code 1 ra xem. Gi chng ta s tm hiu k v phn vector trong XNA. Cc bn nu hc qua chng trnh ton ph thng hoc i hc chc quen vi trc ta . Nu nh trc ta bn bit th O c ta nh hnh bn di

10

Trc ta trong XNA c phn hi khc so vi ci trn (nu bn hc qua mn ha my tnh c l s quen vi trc ta mi ny). .- Theo ta zero (0,0) s gc tritrn ca mn hnh. - Cng qua phi X cng tng v ngc li. - Cng xung di Y cng tng v ngc li. Phn ny cc bn nn ghi nh k v rt cn thit sau ny

Tr li vi phn vit ch ln mn hnh lc ny. Gi bn hy khai bo thm mt vector2 lm ta ca dng ch.

Vector2 toaDoDongChu = new Vector2(300,200);

11

y sau khi khai bo ti cho n mt ta mi lun l (300,200). Tip theo bn xung ch phng thc Draw v cp nht phn Vector2.Zero thnh toaDoDongChu Chy d n, nu dng ch c ta nh hnh bn di l bn thnh cng. Nu cha lm c hoc b li bn hy gii nn code 2 v tm hiu.

Qua , bn c th chui ch di chuyn n ta mi l (x = 300, y = 200). y l phng thc np chng th nht nn ta ca dng ch s l ta ca gc tri trn ca ch ci u tin ca dng ch , y l ch G

12

Hin gi cc bn ch cn quan tm n y l c th lm game n gin ri, khng cn i su vo cc phng thc np chng khc ca spriteBatch.DrawString.

Kt thc phn thc hnh u tin. Bn hy xem k li vi ln nm chc, sau chng ta s cng qua mt phn rt th v, a mt hnh ln mn hnh.

13

V mt hnh ln mn hnh
u tin cc bn nn xa phn khai bo, ta ch, phng thc DrawString ca phn trc i trnh nhm ln vi phn ny. ( Tt nhin bn li cng c s khng nh hng g). u tin ta phi b vo Content mt ci hnh, u tin hy th load mt hnh chic phi thuyn vo mn hnh xem sao nh. Nu bn khng c hnh chic phi thuyn no hy vo th mc ngun v ly n ra. Cch thc b vo Content nh sau:

Ln trc l ta to ra 1 spriteFont, cn ln ny chng ta s add vo Content mt hnh c sn. Content >> Add >> Existing Item. Chn ng dn n hnh phithuyen.png sau OK. Nu bn thy phithuyen.PNG c add vo Content ( cng ch vi spriteFont ) hi ny l thnh cng.

Gi cng l 3 bc ging vi ln trc ( Khai bo Dn xut Draw ) nh lc vit ch nhng cu lnh s khc v ln ny l ta v hnh. Khai bo mt Texture2D t tn l hinhPhiThuyen:

Texture2D hinhPhiThuyen;

Trong phng thc LoadContent, ch ra ng dn n hnh ca n trong Content:

hinhPhiThuyen = Content.Load<Texture2D>("phiThuyen");

K n l xung phng thc Draw, ln ny cng nh ln trc bn phi b lnh v sau vo sau spriteBatch.Begin(); v trc spriteBatch.End();.

spriteBatch.Draw(hinhPhiThuyen, Vector2.Zero, Color.White);

14

Ch vy thi l bn c th v mt hnh ra mn hnh ri y. Hy chy d n xem thnh cng cha. Nu cha c hy m code 3 ln tham kho. Bn c th thay i ta v ca phi thuyn nh cch thay i ta ca ch trn. Hy th thay i ta ca phi thuyn thnh (400,300) xem sao. Phng thc spriteBatch.Draw ny bn thy 3 i s np vo tr ci u th 2 ci cn li ging vi cch DrawString ca ch. C n 5 phng thc spriteBatch.Draw bn c th np chng. v y l ti liu cn bn chng ta ch i tm hiu phng thc d nht spriteBatch.Draw(texture2D, vector2 ta , mu sc). Nu bn mun nghin cu thm hy t tm hiu thm. V y l phng thc Draw n gin nn khi bn cho ta , phi thuyn s ly ta gc tri trn ca hnh phi thuyn lm ta phi thuyn.

15

Ta (400,300) chnh l im mu xanh l cy trn mn hnh, nhng li cng chnh l ta (0,0) ca phi thuyn. Bn nn tp load nhiu nh bng phng thc ny quen vi cch tnh ta trong XNA. Nhng phng thc Draw phc tp hn c th chuyn ta ca phi thuyn vo tm ca n, sau ny bn c th tip tc nghin cu thm.

hon thnh phn v mt sprite ra mn hnh. Phn tip theo chng ta s n vi mt iu m mi game cn phi c l Input.

16

Input
Trc khi i vo phn ny, ti nhc li v phng thc Update, bt c lnh no bn trong phng thc ny u s cp nht lin tc. Vn code 3 khi ny, bn hy gi nguyn. Nu bn cha khai bo v thm vo mt vector2 lm ta ca phi thuyn th hy bt u khai bo li. + Ta ca phi thuyn l (400,300); + Bn nn m code 4 ra v chng ta chun b bt u th nghim mt lnh trong hm Update. Gi chng ta th cho phi thuyn bay ln trn xem sao nh. Vo hm Update bn thm dng lnh sau:
toaDoPhiThuyen.Y--;

Hy chy th xem phi thuyn ca bn c phi ang bay ln trn khng. Nu khng c g xy ra hoc b li bn hy m code 5 ra tham kho. Ti sao phi thuyn li bay ln c? l cu lnh ca bn yu cu ta phi thuyn theo trc Y phi gim 1 n v. Nu bn b lnh ny trong mt hm khc ngoi Update th n s ch gim 1 n v. Nhng trong hm update n c cp nht lin tc ln n lin tc gim lm cho chng ta thy phi thuyn ang bay ln. Ngoi l: Khi lp trnh game bn phi i mt vi mt s tht rt r rng, trong trng hp trn, nu l gamer, ngi chi s bit l phi thuyn ca h ang bay ln. Cn i vi bn l mt ngi lp trnh game, bn bit l phi thuyn ca bn ang gim Y. Gi ta bt u vo phn Input, hy tm thi xa dng lnh gim Y va ri i chng ta bc vo iu thit yu nht trong mi game: S tng tc ca ngi chi vi game. XNA c sn namespace Input nn gi cng vic ca chng ta kh nh nhng. u tin chng ta s th mt VD: Khi nhn nt mi tn ln (UP) th phi thuyn s bay ln, cn khi ngng nhn th phi thuyn s dng li. + Khai bo mt trng thi bn phm:

KeyboardState trangThaiBanPhim;

+ Sau bn vo phng thc Update vit thm mt s dng lnh sau:

trangThaiBanPhim = Keyboard.GetState(); if (trangThaiBanPhim.IsKeyDown(Keys.Up)) toaDoPhiThuyen.Y--;

+ Hy bm chy game th sau nhn mi tn ln xem phi thuyn bay ln cha.

Trong XNA bn phi lun khai bo trng thi bn phm nh vy. Sau vo phng thc Update cp nht. Khi t iu kin v d nh trn l .IsKeyDown (c phi bn phm ang nhn xung khng?) th s thc thi mt lnh gim Y. Bn hy th lm khi phm mi tn xung (down) nhn xung th phi thuyn li, tng t vi nhn sang tri, phi xem sao nh.

17

Khi hon thnh bn hy m code 6 ra tham kho v nhn cc key xem n hot ng th no.

18

a m thanh (Sound) vo game.


Phn Sound chia ra 2 loi: Bi ht nh trn, thng lm nhc nn (theme song) v Sound Effect cc m thanh hiu ng. m thanh hiu ng v d nh ting n, ting bn ca phi thuyn. u tin ta hy th pht mt bn nhc khi vo game. Phn ny sau khi hc bn c th lm nhc nn cho game ca mnh. + Hy tm cho mnh mt bn nhc a thch nh dng .mp3, nu khng c bn c th gii tm thy trong th mc nguon. Khai bo
Song baiHat;

Sau ch cn thm 2 dng ny vo phng thc LoadContent


baiHat = Content.Load<Song>("Virus - Beethoven"); MediaPlayer.Play(baiHat);

Hy vo game v nghe th xem nhc pht ln cha no. Nu cha nghe nhc pht ln bn hy tham kho thm code 7. Khng cn quan tm qu cao, bn ch cn bit nh vy l c th pht c nhc ri. Tip theo ta s th add mt sound effect vo game + Hy vo th mc nguon trong th mc ebook tm tiengno.wav v add vo Content. Khai bo:
SoundEffect tiengNo;

Tng t nh trn vo phng thc LoadContent v b thm 2 dng lnh sau vo


tiengNo = Content.Load<SoundEffect>("TiengNo"); tiengNo.Play();

Chy v ch lng nghe v m thanh hiu ng rt ngn. Nu khng thnh cng hy gii nn code 8 ra tham kho.

ch s lc nh th thi, tip sau y chng ta s bt tay vo lm th mt game hon thin.

19

Phn III
Bt u lm mt game n gin
Phn ny ti s hng dn chi tit bn c th to ra mt game n gin.

20

Tnh ton d n
V d nh lm game n gin nn chng ta s khng cn phi tnh ton nhiu. Tuy nhin nu bn d nh lm mt d n game ln th rt nhiu th phi tnh ton trc y. Ln ny ti s cng cc bn lm mt game rt n gin: + Player c mt phi thuyn khng gian c kh nng di chuyn v bn + Mt k ch +

Xy dng cc class
T u ebook n gi chng ta ch code trong class game1.cs, nhng gi chng ta cn lm mt game hon thin nn s chia ra lm cc class sau: Mt class cho phi thuyn ngi chi, mt cho n ca player, mt cho enemy v mt cho background. Hy to li mt d n mi v chng ta s bt tay vo lm game theo tng cng on. D n mi ti t tn l GameBanPhiThuyen, bn c th vo th mc Du An Game 1 v gii nn GameBanPhiThuyen code1.rar chng ta cng bt u code. Bn hy add vo Content ht tt c nhng g c trong th mc Nguon (m thanh, hnh).

Class Phi Thuyn, di chuyn cho Phi Thuyn


+ Bn hy to 1 class mi t tn PhiThuyen.cs

Bn trn l nh ca class PhiThuyen ta mi to, n hon ton cha c g. + Bn hy thm vo phn using namespace:
using using using using Microsoft.Xna.Framework.Input; Microsoft.Xna.Framework.Content; Microsoft.Xna.Framework; Microsoft.Xna.Framework.Graphics;

21

+ Trong 4 namespace trn ci u ta cn cho vic di chuyn ca phi thuyn, k l cn cho LoadContent, Update v cui cng l Draw. + Nh phn trn ta bit cc phng thc thit yu cho game ca bn xut hin trong game1.cs ht ri. Class PhiThuyen.cs ta mi to gi cn phi thm vo 3 phng thc l: LoadContent, Update v Draw.
public void LoadContent(ContentManager Content) { } public void Update(GameTime gameTime) { } public void Draw(SpriteBatch sp) { }

+ Khi to xong 3 phng thc nh trn gi nhim v u tin ca bn l s lm nhng g hc v hnh ca phi thuyn ca player ra mn hnh. Tt c nhng g bn di u lm trong class PhiThuyen, bn ng nhm vi class game1.cs. ++ Khai bo: Bn khai bo mt texture2D lm hnh cho phi thuyn, mt vector2 lm ta cho phi thuyn.
Texture2D hinhPhiThuyen; Vector2 toaDoPhiThuyen; KeyboardState trangThaiPhim;

++ LoadContent: Thm cc dng sau vo phng thc LoadContent


hinhPhiThuyen = Content.Load<Texture2D>("PhiThuyen"); toaDoPhiThuyen = new Vector2(390, 500); //ta mc nh khi xut hin

++ Update: Thm cc dng sau vo phng thc Update


trangThaiPhim = Keyboard.GetState(); if (trangThaiPhim.IsKeyDown(Keys.Up)) toaDoPhiThuyen.Y--; if (trangThaiPhim.IsKeyDown(Keys.Down)) toaDoPhiThuyen.Y++; if (trangThaiPhim.IsKeyDown(Keys.Left)) toaDoPhiThuyen.X--; if (trangThaiPhim.IsKeyDown(Keys.Right)) toaDoPhiThuyen.X++;

++ Draw: Thm dng sau vo phng thc Draw


sp.Draw(hinhPhiThuyen, toaDoPhiThuyen, Color.White);

Tt nhin by gi d chy d n bn s vn cha thy phi thuyn ca mnh xut hin u. Vic tip theo chng ta cn lm l gi class ny qua game1.cs.

22

Bn trong game1.cs ta bt u lm cc vic sau: ++ Khai bo: class PhiThuyen t tn phiThuyen.


PhiThuyen phiThuyen;

+ Initialize: khi to
phiThuyen = new PhiThuyen();

++ LoadContent: b phng thc LoadContent ca class PhiThuyen vo class LoadContent ca game1.cs.


phiThuyen.LoadContent(Content);

++ Update: tng t nh trn nhng ln ny l phng thc Update


phiThuyen.Update(gameTime);

++ Draw: Phng thc Draw gi qua y cng cn phi nm trong m u v kt thc ca spriteBatch.
spriteBatch.Begin(); phiThuyen.Draw(spriteBatch); spriteBatch.End();

Hy th chy d n ca mnh v xem phi thuyn ca bn xut hin trn mn hnh cha?, bm cc phm mi tn n di chuyn c cha. Lu : ng qun b hnh phithuyen.png vo phn Content nh. Nu code bn lm gp vn g hy vo th mc Du An Game 1 v gii nn GameBanPhiThuyen code2.rar ra tham kho. Phi thuyn ca chng ta c v di chuyn hi chm, gi hy chnh sa cht trong class PhiThuyen.cs ++ Khai bo
int tocDoDiChuyen = 3; //ta cho tc di chuyn mc nh l 3

++ Sa li phn Update di chuyn Tng t cc bn sa vi cc hng di chuyn khc. Nu pht sinh vn g hy m GameBanPhiThuyen code3.rar ra tham kho.

23

Thm n cho phi thuyn.


chin u vi k th ta cn phi thm n cho phi thuyn. Bn hy to 1 class cho n, trong d n ny ti t tn class l Dan.cs Hy thm vo nhng using namespace v 3 phng thc: LoadContent, Update, Draw tng t i vi phi thuyn. u tin ta phi hiu rng xy dng class n cn nhng g. o n l mt thc th trong game nn s cn mt ci hnh o n c bn ra t phi thuyn ca player nn cn mt ta xut hin ban u l ti player. o n s bn theo hng no, v d trong game chng ta ang thc hin l l hng ln trn (gim Y) Lu ng qun b vo Content hnh Dan.png (hnh ny trong th mc Nguon) Ta bt u vo class Dan.cs v lm nhng cng vic sau: ++ Khai bo:
Texture2D dan; //hnh cho n public Vector2 toaDo; //ta mc nh khi n xut hin int tocDoBan = 5; //tc bn mc nh

++ LoadContent
dan = Content.Load<Texture2D>("Dan");

++ Update: do bn ln nn ta s tr Y bng tc bn
toaDo.Y -= tocDoBan;

++ Draw
sp.Draw(dan, toaDo, Color.White);

Tip tc ta qua class PhiThuyen.cs a n vo . ++ Phi thuyn khng th no ch bn mt vin ri thi c, v vy chng ta s to ra mt lot n cho phi thuyn bng cch ng dng list trong C#. ++ Khai bo:
public List<Dan> loatDan = new List<Dan>();

+++ Ngoi ra bn khai bo thm mt dng sau lt ta ly ContentManager ra ngoi phng thc LoadContent.
ContentManager layContent;

24

++ Trong phng thc LoadContent ca phi thuyn ta s khng load content cho n ngay ( vn c th load nu bn mun ), gi ta ch cn thm dng sau nhn ContentManager.
layContent = Content;

++ Gi ta bt u to 1 hm bn n. to mt hm mi trong class PhiThuyen.cs:


public void BanDan(GameTime gameTime) { Dan dan = new Dan(); //to ra mt vin n dan.LoadContent(layContent); dan.toaDo = toaDoPhiThuyen + new Vector2(21, 0); loatDan.Add(dan); //b vin n trn vo lot n }

++ Bn trn l hm lm nhim v to n, gi chng ta s cp nht mt phm bn vin n ra.


if (trangThaiPhim.IsKeyDown(Keys.Space)) BanDan(gameTime);

o Nu nhn phm Space th bn n ++ Gi ta cn phi cp nht cho tng vin n trong lot n.
foreach (Dan vienDan in loatDan) vienDan.Update(gameTime);

++ Xung phng thc Draw v thm vo 2 dng v lot n.


foreach (Dan vienDan in loatDan) vienDan.Draw(sp);

- Gi bn hy build v chy d n xem c nh hnh bn di cha. Nu gp vn g hy gii nn GameBanPhiThuyen code4.rar ra tham kho.

25

Bn c th thy va nhn Space n bn ra 1 lot di, l v phng thc Update cp nht lin tc v v chng ta khng lm bn n theo kiu cn 2 trng thi phm (KeyDown KeyUp). Gi khc phc ta s to ra mt bin time lm chm qu trnh khai ha (Delay n).

++ Trong class PhiThuyen.cs hy khai bo thm


int timeDelayDan;

++ Sa li mt cht trong phn nhn key bn n phng thc Update: o Nu chi nhiu game chc bn cng bit c nhiu skill (trong cc game nhp vai) khi s dng xong cn thi gian phc hi cho ln s dng tip theo. Thi gian ngi ta gi l timeDelay, tng t vi tng vin n c bn ra t phi thuyn ca chng ta, timeDelay cng t s bn ra cng nhanh.

26

if (trangThaiPhim.IsKeyDown(Keys.Space)) { timeDelayDan += gameTime.ElapsedGameTime.Milliseconds; if (timeDelayDan > 200) { timeDelayDan = 0; BanDan(gameTime); } }

Hy chy d n xem lot n ca bn c Delay nh hnh bn di cha, nu c pht sinh vn g hy m GameBanPhiThuyen code5.rar ra tham kho.

Bn n trn mn hnh xanh qu thc rt nhm chn, trc khi xy dng class Enemy ta s xy dng class Background (hnh nn) trc. 27

Xy dng hnh nn
ra dng l mt game khng gian ta phi to mt hnh nn v tr tht p, nu bn vn cha tm c hnh thch hp th hy ly hnh HinhNen.png trong th mc Nguon. Phn Background ny ta s lm cho n Scroll (cun) to cm gic phi thuyn ang bay ti. Phn cun ti s nhn background lm 2 v cho chy lin tc theo vng trn (A ni ui B ri B li ni ui A). n gin ch l vy cc bn khng cn quan tm nhiu lm v c rt nhiu thut ton khc nhau scroll background. ++ To mt class mi t tn HinhNen.cs using cc namespace v to cc phng thc nh 2 ln trc. ++ y l ton b class hnh nn vi kiu khai bo 2 ln v cho ni tip nhau:
class HinhNen { Texture2D hinhNen1, hinhNen2; Vector2 toaDo1, toaDo2; public void LoadContent(ContentManager Content) { hinhNen1 = Content.Load<Texture2D>("HinhNen"); toaDo1 = Vector2.Zero; hinhNen2 = Content.Load<Texture2D>("HinhNen"); toaDo2 = new Vector2(0, -600); } public void Update(GameTime gameTime) { toaDo1.Y ++; if (toaDo1.Y >= 600) toaDo1.Y = -600; toaDo2.Y ++; if (toaDo2.Y >= 600) toaDo2.Y = -600;

public void Draw(SpriteBatch sp) { sp.Draw(hinhNen1, toaDo1, Color.White); sp.Draw(hinhNen2, toaDo2, Color.White); } }

Rt n gin, ch l nhn ln lm 2 cho n ni tip nhau, nu ta n ln hn hoc bng 600 n s nhy ln -600 v tip tc tri xung. Lu : Nh qua class game1.cs khai bo v xy dng class hnh nn. Phn Draw bn phi lu l i tng no draw sau s ni ln trc, trng hp ca phi thuyn v background ta s Draw phi thuyn sau n ni ln trn background. Bn hy m GameBanPhiThuyen code6.rar ln tham kho.

28

Thm vo Enemy
K th ca phi thuyn chng ta xut hin. Sau khi xy dng 2 class PhiThuyen.cs v Dan.cs bn c bn c th t xy dng class Enemy ri y. V c mt s phn mi nn ti s ton b code ca class KeDich.cs ri gii thch sau.
class KeDich { Texture2D keDich; Vector2 toaDoKeDich; int tocDoKeDich; Random ranDom = new Random(); public void LoadContent(ContentManager Content) { keDich = Content.Load<Texture2D>("Enemy1"); toaDoKeDich = new Vector2(ranDom.Next(800), 0); tocDoKeDich = ranDom.Next(2, 5); } public void Update(GameTime gameTime) { toaDoKeDich.Y += tocDoKeDich; } public void Draw(SpriteBatch sp) { sp.Draw(keDich, toaDoKeDich, Color.White); } }

++ Bn c th thy ta vn c 3 phng thc nh cc class trc, ta c tc k ch lm s tng Y (ta cho Enemy lun bay t trn xung di. ++ to s ngu nhin ta theo X khi Enemy xut hin ta khai bo mt Random, trong phng thc LoadContent bn c th thy ti cho ta X khi xut hin ca Enemy nhy ngu nhin t 0 n 800 v ta Y th random t -20 n 0. Tc bay ca k ch t 2 n 5. ++ K n iu bn cn lm cng nh cc class trc l em n qua Game1.cs xy dng. Ta li dng List to ra mt list enemy. Bn hy t em qua game1.cs xem c thnh cng khng nh, nu khng rnh dng list c th coi li cch chng ta to list n. Hy tham kho GameBanPhiThuyen code7.rar. Trc khi qua phn mi ta cn phi sa li cc lnh di chuyn ca phi thuyn n khng vt qu mn hnh, sau khi sa nh bn di xong bn hy chy th xem phi thuyn cn vt khi ca s khng.
if (trangThaiPhim.IsKeyDown(Keys.Up) && toaDoPhiThuyen.Y > 0) toaDoPhiThuyen.Y -= tocDoDiChuyen; if (trangThaiPhim.IsKeyDown(Keys.Down) && toaDoPhiThuyen.Y < 550) toaDoPhiThuyen.Y += tocDoDiChuyen; if (trangThaiPhim.IsKeyDown(Keys.Left) && toaDoPhiThuyen.X > 0)

29

toaDoPhiThuyen.X -= tocDoDiChuyen; if (trangThaiPhim.IsKeyDown(Keys.Right) && toaDoPhiThuyen.X < 750) toaDoPhiThuyen.X += tocDoDiChuyen;

Va chm
Phn ny rt quan trng v cng khng phi l d i vi ngi mi. Va chm c nhiu loi v cch xy dng khc nhau. y chng ta s dng mt cch n gin nht l bao khi hnh ch nht cho tng i tng v x l khi 2 hnh ch nht va chm vi nhau.

V d y l phi thuyn ca ngi chi v enemy. Chng ta s bao quanh phi thuyn ca ngi chi mt hnh ch nht o, tng t vi enemy. Khi hai hnh ch nht ny va chm (chng ln nhau hay phm nhau) nhau n s ng iu kin no do chng ta t ra nh pht n. Trc khi i tip phn va chm ta phi nng cp class ca cc i tng: phi thuyn, n, k ch thm mt bool xem i tng cn sng hay khng.
public bool conSong = true;

Sau bn vo game1.cs tm nhng ch Update v Draw ca cc i tng t iu kin nu cn sng th mi c Update hay Draw. Hy lm th sao vo GameBanPhiThuyen code8.rar tham kho. Gi ta bt u to mt hnh ch nht o xung quanh cc i tng, trc tin ta s th vi phi thuyn v k ch trc. ++ Vo Class PhiThuyen.cs v KeDich.cs cc bn khai bo mt hnh ch nht t tn l bao khung:
public Rectangle baoKhung;

++ Hnh ch nht trong XNA c 4 i s ( X, Y, Di, Rng) trong X,Y l ta zero ca hnh ch nht, 2 ci cn li l chiu di v chiu rng ca hnh ch nht bn s to Minh ha mt rectangle (3,2,5,3) trn mn hnh: Khung mu tn to chnh ta ca s mn hnh. Khung mu en nh hn l hnh ch nht ca chng ta. Cc s mu l ta trn mn hnh S mu xanh dng l ta ca hnh ch nht S mu xanh l l chiu rng v cao ca hnh ch nht.

30

++ Gi bn tip tc vo class PhiThuyen.cs phng thc Update thm vo dng sau:


baoKhung = new Rectangle((int)toaDoPhiThuyen.X, (int)toaDoPhiThuyen.Y, hinhPhiThuyen.Width,hinhPhiThuyen.Height);

Nh bn c th thy ta cho 2 i s u ca rectangle l ta ca phi thuyn, 2 i s tip theo chnh l chiu rng v chiu cao ca phi thuyn. ++ Tng t bn lm vi class KeDich.cs
baoKhung = new Rectangle((int)toaDoKeDich.X, (int)toaDoKeDich.Y, keDich.Width, keDich.Height);

++ Tip theo c mt vic quan trng chng ta cn phi lm l qua class game1.cs vo phng thc Update kim tra s giao nhau gia 2 hnh ch nht trn. ++ Ti phng thc Update ca game1.cs ta thm vo:
for (int i = 0; i < listKeDich.Count; i++) { if (listKeDich[i].baoKhung.Intersects(phiThuyen.baoKhung)) { listKeDich[i].conSong = false; } }

o Tt nhin l khng phi ch c mt con qui vt va chm vi phi thuyn m ta phi dng for truy n tng i tng k ch, sau ra iu kin nu k ch no (trong list k ch) va chm vi phi thuyn th k ch s cht (conSong = false) Hy build v chy d n, khi vo hy cho phi thuyn ca bn lao vo k ch xem k ch c bin mt khng nh. Nu c vn g hy m GameBanPhiThuyen code9.rar tham kho. ++ Gi tng t bn hy bao khung cho vin n nh cch lm vi phi thuyn v k ch sau ta s vo phng thc Update ca game1.cs tip tc vit lnh iu kin cho tng vin n trong list n va chm vi tng k ch. o Trong cu lnh for m k ch bn thm vo:
foreach(Dan viendan in phiThuyen.loatDan) if (viendan.baoKhung.Intersects(listKeDich[i].baoKhung)) { viendan.conSong = false; listKeDich[i].conSong = false; }

Mi vin n trong list n nu va chm vi k ch th n ln k ch u b cht. Hy vo bn ch xem n v ch c bin mt khng nh, nu gp vn g hy gii nn GameBanPhiThuyen code10.rar ra tham kho.

31

Tip n ta s lm mt s ch ghi li thnh tch ca ngi chi. Bn hc cch vit ch ln mn hnh trn ri ch cn ng dng mt cht thi. ++ game1.cs hy thm vo int mng, int im, v 1 font ta vit ra mn hnh.
int Diem; int Mang = 3; SpriteFont fontDiem;

++ Cu lnh for m s k th ta cp nht li nh sau:


for (int i = 0; i < listKeDich.Count; i++) { if (listKeDich[i].conSong) { if (listKeDich[i].baoKhung.Intersects(phiThuyen.baoKhung)) { listKeDich[i].conSong = false; Mang--; //tru mang khi phi thuyen va cham voi dich } foreach (Dan viendan in phiThuyen.loatDan) if (viendan.baoKhung.Intersects(listKeDich[i].baoKhung)) { Diem += 10; //cong diem khi tieu diet dc dich viendan.conSong = false; listKeDich[i].conSong = false; }

++ Xung phng thc Draw thm vo 2 dng v string:


spriteBatch.DrawString(fontDiem, "Diem: " + Diem, Vector2.Zero, Color.White); spriteBatch.DrawString(fontDiem, "Mang: " + Mang, new Vector2(700,0), Color.YellowGreen);

Hy chy game xem khi bn h k ch bn c nhn c 10 im v khi b k ch m trng bn c b tr 1 mng khng nh. Nu c vn g hy m GameBanPhiThuyen code11.rar tham kho. Nhng phn c bn to mt game u c bn hng dn cho bn, gi trc khi kt thc ta s thm vo mt hiu ng m thanh n v nhc nn. Cch thm m thanh rt n gin nh hng dn cc phn trc, quan trng l khi play m thanh hiu ng bn phi b ng ch. ++ Hy add vo nhc nn v m thanh n c sn trong th mc Nguon vo Content trc, sau hy vo game1.cs ta bt u thm m thanh.
SoundEffect amThanhNo; Song nhacNen;

32

++ Phng thc LoadContent


amThanhNo = Content.Load<SoundEffect>("tiengno"); nhacNen = Content.Load<Song>("Virus - Beethoven"); MediaPlayer.Play(nhacNen);

++ Bt u play phn m thanh hiu ng n, bn ch cn b vo ng trong phn thc thi ca 2 cu lnh if phi thuyn va chm ch v ch va chm n phi thuyn.
/// if (listKeDich[i].baoKhung.Intersects(phiThuyen.baoKhung)) { listKeDich[i].conSong = false; Mang--; amThanhNo.Play(); } /// if (viendan.baoKhung.Intersects(listKeDich[i].baoKhung)) { Diem += 10; viendan.conSong = false; listKeDich[i].conSong = false; amThanhNo.Play(); } ///

Hy vo game nghe xong nhc nn pht ln cha v khi bn bn ch c nghe g khng. Nu gp vn hy m GameBanPhiThuyen code12.rar ra tham kho. Ting n nghe c v ging ting sng bn, do m thanh y ch mang tnh cht tham kho, nu bn lm game thc s th nn ch trng phn m thanh nh.

33

Review
Nhn li c qu trnh hc tp ca chng ta ty theo nng lc ca bn c th thy lp trnh trn XNA ra sao ri. Ring ti nhn xt l lp trnh trn XNA kh l d hn so vi cc ngn ng, nn tng lp trnh khc. V phn hng dn t u n gi ti ch cng cc bn i s qua nhng mng c bn ca XNA thi, v y ta hng theo ng tn ca gio trnh. XNA vn theo nhng khun mu nht nh ca C#, nn hi vng bn hc qua C# trc khi tip cn gio trnh ny. C th thy cc phn nh class, phng thc, list, random, np chng phng thc, qu ti ton t, ca C# trong gio trnh ny ti hu nh khng cp n. Bn c th hi nhiu l do ti sao cc i tng thc th (phi thuyn, n, k ch) ti li khng cho chng k tha t mt class c s. y khng phi l ln XNA kh k tha m ti nhn thy hng ti s c bn l ch yu nn khng cn lm vy. Nu nhn vo sn phm chng ta va to ra th c th ly vn cha gi l mt game hon thin, khi bn k ch cht khng c hiu ng n, hoc chng c thng thua hay im dng. Nhng phn va nu u thuc phn thut ton, mi ngi c mt cch xy dng ring, v d nh phn hiu ng n, c rt nhiu cch lm nh thut ton, animation, Nu bn c d nh nng cp game cho nhiu loi ch hn th khuyn bn nn p dng k tha ca C#. Cc bn c th tham kho game Black Hole Adventure ca Green Ray Games tm hng nng cp hn v ta game ca mnh. Trong qu trnh lm game ca mnh nu bn gp vn g khng gii quyt c hy vit ln tng nh ca chng ti trn zing me (http://me.zing.vn/b/greenraygames) nu c iu kin chng ti s gip cc bn.

Ln ti c l Green Ray Games s gii thiu vi cc bn mt ebook nng cao hn.

34

You might also like