418383 การโปรแกรมเกม การบรรยายครั้งที่ ...

102
418383 กกกกกกกกกกกกก กกกกกกกกกกกกกกกกก 3 กกกกกก กกกกกกก [email protected]

Upload: lobo

Post on 06-Jan-2016

55 views

Category:

Documents


6 download

DESCRIPTION

418383 การโปรแกรมเกม การบรรยายครั้งที่ 3. ประมุข ขันเงิน [email protected]. XNA. ไลบรารีภาษา C# ของ Microsoft สำหรับเขียนเกม Platform เป้าหมาย : PC, Xbox, Zune ความสามารถ : วาดภาพ 2 มิติและ 3 มิติ เล่นเสียงและวิดีโอ จัดการ content ของเกม - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

418383 การโปรแกรมเกมการบรรยายคร� งที่�� 3

ประม�ข ข�นเง�น[email protected]

Page 2: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

XNA

• ไลบราร�ภาษา C# ของ Microsoft สำ�าหร�บเข�ยนเกม– Platform เป าหมาย: PC, Xbox, Zune– ความสำามารถ:• วาดภาพ 2 ม�ติ�และ 3 ม�ติ�• เล&นเสำ�ยงและว�ด�โอ• จั�ดการ content ของเกม• ร�บและประมวลผล input จัาก keyboard, mouse, joystick

Page 3: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

XNA

• ช่&วยที่�าให+การเข�ยนเกมง&ายข, น– ไม&ติ+องก�งวลเร-�อง hardware– ไม&ติ+องเข�ยนโค+ดเพ-�อวาดภาพ อ&านข+อม�ลเข+า หร-อเล&นเสำ�ยง

• แติ&ก.ย�งติ+องเข�ยนมากพอสำมควร• เน-�องจัากไม&ม�องค/ประกอบพ- นฐานสำ�าหร�บสำร+างเกมที่��ม�

ความซั�บซั+อน– ไม&ม� collision detection– ไม&ม� physics engine– ไม&ม�ความสำามารถในการจั�ดการข+อม2ล 2 ม�ติ�หร-อ 3 ม�ติ�ระด�บ

สำ2ง

Page 4: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

การติ�ดติ� ง• ดาวน/โหลด Visual C# Express 2010

http://www.microsoft.com/express• ดาวน/โหลด Microsoft XNA Game Studio 4.0

• ลง Visual C# ให+เสำร.จัก&อนลง XNA Game Studio

Page 5: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

สำร+างเกมใหม&• เป3ด Visual C# 2010• เล-อกเมน2 File New Project…• ในช่&องที่างซั+าย เล-อก XNA Game Studio 4.0• ในช่&องที่างขวา เล-อก Windows Games (4.0)• ติ� งช่-�อเกมใน Name• ติ� งช่-�อ Solution (กล�&มของ project ที่��เก��ยวข+อง

ก�น) ใน Solution Name

Page 6: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

สำร+างเกมใหม&

Page 7: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame– Properties– References– Game.ico– Game1.cs– GameThumbnail.png– Program1.cs

• FirstGameContent (Content)– References

Page 8: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame เกมใหม&ที่��เราเพ��งจัะสำร+าง– Properties– References– Content References– Game.ico– Game1.cs– GameThumbnail.png– Program1.cs

• FirstGameContent (Content)– References

Page 9: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame– Properties เก.บข+อม2ลเก��ยวก�บเกมหล�งคอมไพล/แล+ว– References– Content References– Game.ico– Game1.cs– GameThumbnail.png– Program1.cs

• FirstGameContent (Content)– References

Page 10: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame

– Properties– References เก.บข+อม2ลว&าเกมน� ใช่+ library อะไรบ+าง– Content References– Content– Game.ico– Game1.cs– GameThumbnail.png– Program1.cs

• FirstGameContent (Content)– References

Page 11: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame– Properties– References– Content References– Game.ico– Game1.cs– GameThumbnail.png– Program1.cs• FirstGameContent (Content) เก.บ content (ร2ป, เพลง)

ของเกม– References

Page 12: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame– Properties– References– Content References เกมน� ใช่+ content project ไหนบ+าง– Game.ico– Game1.cs– GameThumbnail.png– Program1.cs• FirstGameContent (Content)– References

Page 13: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame– Properties– References– Content References– Game.ico ไอคอน– Game1.cs– GameThumbnail.png– Program1.cs

• FirstGameContent (Content)– References

Page 14: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame– Properties– References– Content References– Game.ico– Game1.cs น�ยามเกม– GameThumbnail.png– Program1.cs• FirstGameContent (Content)– References

Page 15: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame– Properties– References– Content References– Game.ico– Game1.cs– GameThumbnail.png ร2ปแที่นเกมในเคร-�อง Xbox – Program1.cs• FirstGameContent (Content)– References

Page 16: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ไฟล/ที่��สำร+างให+โดยอ�ติโนม�ติ�• ด2ช่&อง Solution Explorer ที่างด+านขวา• FirstGame– Properties– References– Content References– Game.ico– Game1.cs– GameThumbnail.png– Program1.cs ฟ5งก/ช่�น main• FirstGameContent (Content)– References

Page 17: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Program.csusing System;

namespace FirstGame{ static class Program { /// <summary> /// The main entry point for the application. /// </summary> static void Main(string[] args) { using (Game1 game = new Game1()) { game.Run(); } } }}

Page 18: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Program.cs

• ม�ฟ5งก/ช่�น main– ด�งน� นจั,งเป6นสำ&วนที่��น�ยาม โปรแกรมหล�ก ของเกม“ ”

• ใน main ม�การสำร+าง instance ของ Game1• แล+วเร�ยกเมธอด run ของคลาสำ Game1• เมธอด run ค-อติ�วเกม• คลาสำ Game1 จั,งสำ�าค�ญที่��สำ�ด

Page 19: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Game1.cs

• น�ยามคลาสำ Game1 ซั,�งบรรจั�รายละเอ�ยดของเกมเอาไว+

• Game1 เป6น subclass ของ Microsoft.Xna.Framework.Game(คลาสำที่��แที่นเกมของ XNA ที่� งหมด)

Page 20: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เมธอดของ Microsoft.XNA.Framework.Game

• void Initialize()– ใช่+ติ� งค&าเร��มติ+นก&อนอ&าน content ข, นมา

• void LoadContent()– ใช่+อ&าน content

• void UnloadContent()– ใช่+ประมวลผลเพ-�อน�า content ออกจัากหน&วยความจั�าหล�งเกม

จับ• void Update(GameTime gameTime)– ใช่+ที่�าการเปล��ยนแปลงสำถานะภายในของเกม– เป6นเมธอดที่�� logic ของเกมที่�างาน

• void Draw(GameTime gameTime)– ใช่+วาดภาพเกมออกที่างหน+าจัอ

Page 21: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Flowchart การที่�างานของคลาสำ Game

เร��ม (เร�ยก Run)

Initialize()

LoadContent()

Update()

Draw()

เกมจับ?UnloadContent()

จับการที่�างาน

Page 22: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3
Page 23: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เมธอดติ&างๆ ใน Game1.cs

• Constructor

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

• GraphicsDeviceManager จั�ดการหน+าจัอ• Content จั�ดการ content ของเกม

Page 24: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เมธอดติ&างๆ ใน Game1.cs

• Initialize()UnloadContent()– ไม&ได+ที่�าอะไรเลยนอกจัากเร�ยก method เด�ยวก�นของ

superclass

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

สำร+าง spriteBatch object ที่��เราจัะใช่+ม�นวาดร2ป

Page 25: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เมธอดติ&างๆ ใน Game1.cs

• Update() protected override void Update(GameTime gameTime)

{ // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit();

// TODO: Add your update logic here

base.Update(gameTime); }

Page 26: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เมธอดติ&างๆ ใน Game1.cs

• GamePad ใช่+ร�บ input จัาก joystick ของ XBOX• โค+ดบรรที่�ดแรกที่�าการเช่.คว&าป�:ม “back” ของผ2+เล&น

คนที่�� 1 ถ2กกดอย2&หร-อไม&• ถ+าใช่&เร�ยก this.Exit() ซั,�งจัะเป6นการจับเกม• ม�เช่&นน� นก.ไม&ที่�าอะไร

• เราจัะเข�ยนเกมบน PC โดยใช่+ Keyboard เป6นสำ&วนใหญ&• ด�งน� นจัะไม&ย�&งก�บ GamePad มากน�ก

Page 27: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เมธอดติ&างๆ ใน Game1.cs

• Draw()

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

• เคล�ยร/หน+าจัอเป6นสำ� CornflowerBlue

Page 28: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ผลล�พธ/

Page 29: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมแรก

Page 30: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมแรก

Page 31: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เพ��มร2ปเข+า Content• ก&อนจัะใช่+ร2ปหร-อเสำ�ยงในเกมได+ ติ+องเพ��มม�นเข+าใสำ& Content

ก&อน• คล�กขวาที่�� HelloWorldContent แล+วเล-อก

Add New Item…

• หล�งจัากน� นให+เล-อกร2ปที่��ติ+องการเพ��มเข+าเกม

Page 32: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เพ��มร2ปเข+า Content

• เม-�อลองขยาย Content จัะม�ช่-�อร2ปปรากฏอย2&

• ถ+าคล�กร2ปแที่.บ Properties จัะบอก “Asset Name” ของร2ป

• เราจัะใช่+ Asset Name น� อ+างถ,งร2ปในภายหล�ง

Page 33: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โหลดร2ปเข+าหน&วยความจั�า• ก&อนจัะน�าร2ปไปวาดได+ ติ+องโหลดม�นเข+าหน&วยความจั�าก&อน– ก&อนจัะโหลดได+ ร2ปติ+องอย2&ใน Content ก&อน

• ร2ปใน XNA ถ2กเก.บด+วย object ช่น�ด Texture2D• เราม�ร2ปที่��จัะใช่+ 2 ร2ป: ติ�วการ/ติ2น, พ- นหล�ง• สำร+าง field ช่น�ด Texture2D ในคลาสำของเกม 2 field

public class HelloWorld : Microsoft.Xna.Framework.Game{ GraphicsDeviceManager graphics; SpriteBatch spriteBatch;

Texture2D background; Texture2D sprite;

Page 34: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โหลดร2ปเข+าหน&วยความจั�า• เวลาโหลดร2ปเข+าหน&วยความจั�า ให+ที่�าใน

LoadContent()

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

background = Content.Load<Texture2D>("kagami-wallpaper"); sprite = Content.Load<Texture2D>("kagami");}

Page 35: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Content.Load

• ก�าหนด type parameter เป6นช่น�ดของว�ติถ�ที่��เราติ+องการอ&าน– ในที่��น� ค-อ Texture2D

• ม� argument ติ�วเด�ยว = Asset Name ของว�ติถ�ที่��จัะโหลด• ค-นว�ติถ�ช่น�ดที่��เราก�าหนดซั,�งติรงก�บสำ-�อที่��ม� Asset Name ที่��

ก�าหนด

• เราสำามรถใช่+ Content.Load โหลด– ร2ป– เสำ�ยง– ว�ติถ�ที่��เราน�ยามเอง (การบรรยายคร� งที่�� 6)

Page 36: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ก�าหนดขนาดของว�นโดวสำ/• เซัติค&า – graphics.PreferredBackBufferWidth (ความกว+าง)– graphics.PreferredBackBufferHeight (ความสำ2ง)

ใน contructor

public HelloWorld(){ graphics = new GraphicsDeviceManager(this);

// Setting the window's size. graphics.PreferredBackBufferWidth = 800; graphics.PreferredBackBufferHeight = 600;

Content.RootDirectory = "Content";}

Page 37: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ระบบ coordinate

• ว�นโดว/เป6นพ- นที่��สำ��เหล��ยมผ-นผ+า• เราว�ดติ�าแหน&งด+วยหน&วยพ�กเซัล• (0,0) ค-อติ�าแหน&งม�มบนซั+ายของว�นโดว/• (w, h) ค-อติ�าแหน&งที่��อย2&ที่��ม�มล&างขวาของว�นโดว/

เม-�อ w = ความกว+าง และ h = ความสำ2งของว�นโดว/

Page 38: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ระบบ coordinate(0,0)

(w,h)

Page 39: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ติ�าแหน&งของติ�วการ/ติ2น• เราติ+องการให+ติ�วการ/ติ2นเคล-�อนที่��ติามเมาสำ/• โดยให+จุ�ดศู�นย์�กลางของติ�วการ/ติ2นอย2&ติรงก�บติ�าแหน&งของ

เมาสำ/• เวลาเราจัะวาดติ�วการ/ติ2นเราจัะติ+องระบ�ติ�าแหน&งม�มบนซ้�าย์

ของติ�วการ/ติ2น• เราสำามารถเก.บติ�าแหน&งได+ด+วย object ช่น�ด Vector2– ม� property ช่-�อ X และ Y สำ�าหร�บเก.บพ�ก�ดติามแกน X และ Y

• สำร+าง field ช่-�อ spritePosition ในคลาสำของเกม

public class HelloWorld : Microsoft.Xna.Framework.Game{ GraphicsDeviceManager graphics; SpriteBatch spriteBatch;

Texture2D background; Texture2D sprite; Vector2 spritePosition;

Page 40: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ที่�าให+ติ�วการ/ติ2นเคล-�อนติามเมาสำ/• spritePosition ถ-อเป6นสำถานะภายในของเกม• ฉะน� นเราเปล��ยนม�นในเมธอด Update

protected override void Update(GameTime gameTime){ if ( ... ) this.Exit();

MouseState mouseState = Mouse.GetState(); spritePosition.X = mouseState.X - sprite.Width / 2; spritePosition.Y = mouseState.Y - sprite.Height / 2;

base.Update(gameTime);}

Page 41: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Mouse

• เป6น object ที่��สำามารถให+ข+อม2ลเก��ยวก�บเมาสำ/

• เมธอด GetState() ค-น object ประเภที่ MouseState

ซั,�งเก.บข+อม2ลของสำถานะป5จัจั�บ�นของเมาสำ/เอาไว+

• เราสำามารถหาพ�ก�ดแกน x และ y ของเมาสำ/ได+โดยการเข+าถ,ง property X และ Y ของ MouseState

Page 42: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

วาดร2ป• ในฟ5งก/ช่�น Draw

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

spriteBatch.Begin(); spriteBatch.Draw(background, new Vector2(0, 0), Color.White); spriteBatch.Draw(sprite, spritePosition, Color.White); spriteBatch.End();

base.Draw(gameTime);}

Page 43: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

SpriteBatch

• ใช่+สำ�าหร�บวาดร2ป 2 ม�ติ�จัาก Texture2D• ก&อนจัะใช่+ติ+องเร�ยกเมธอด Begin• หล�งจัากวาดร2ปเสำร.จัติ+องเร�ยกเมธอด End– ถ+าไม&เร�ยกร2ปจัะไม&ถ2กแสำดงออกที่างหน+าจัอ

• วาดร2ปด+วยเมธอด Draw– เมธอด Draw ม� signature ที่� งหมด 7 แบบ– แติ&ในโปรแกรมน� เราจัะใช่+แค&แบบเด�ยว

• ค�าสำ��ง draw ที่��ถ2กเร�ยกก&อนจัะถ2กค�าสำ��ง draw ที่��ถ2กเร�ยกที่�หล�งวาดที่�บ

Page 44: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

SpriteBatch

spriteBatch.Draw( sprite, Texture2D spritePosition, Color.White);

Page 45: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

SpriteBatch

spriteBatch.Draw( sprite, spritePosition, ตำ�าแหน�งม�มบนซ้�าย์ Color.White);

Page 46: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

SpriteBatch

spriteBatch.Draw( sprite, spritePosition, Color.White); สี�ที่��ใช้� คู�ณ ก"บร�ป“ ”

Page 47: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

SpriteBatch

spriteBatch.Draw( sprite, spritePosition, Color.Red);

• ถ+าสำ��งอย&างข+างบนจัะได+ร2ปที่��ม�โที่นสำ�แดง

Page 48: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

สำ�• สำ� = tuple ม�สำมาช่�กเป6นเลข 3 ติ�ว (R, G, B) – R บอกระด�บความเข+มของแสำงสำ�แดง– G บอกระด�บความเข+มของแสำงสำ�เข�ยว– B บอกระด�บความเข+มของแสำงสำ�น� าเง�น

• เลขแติ&ละติ�วม�ค&าติ� งแติ& 0 ถ,ง 2จั�านวนบ�ติที่��ใช่+เก.บความเข+มแติ&ละ

สำ�-1– สำ&วนใหญ&เราจัะใช่+พ- นที่�� 32 บ�ติเก.บ 1 พ�กเซัล– แติ&ละสำ�ได+ 8 บ�ติ– ด�งน� นค&าสำ2งสำ�ดค-อ 255

Page 49: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Trichromatic Theory of Vision

• สำ�ที่��มน�ษย/มองเห.นแบ&งออกเป6นสำามสำ&วน – แดง เข�ยว น� าเง�น – ประสำาที่สำ�มผ�สำของมน�ษย/ของแติ&ละสำ�เป6นอ�สำระจัากก�น – สำ�อ-�นๆ เก�ดจัาก การน�าสำ�ที่� งสำามน� มาประกอบก�น

• หล�กฐาน– เซัลล/โคนในเรติ�นาม�สำามช่น�ด– แติ&ละช่น�ดไวติ&อ สำ�แดง สำ�เข�ยว สำ�น� าเง�น ติามล�าด�บ

Page 50: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

สำ�หล�กๆ(255,0,0) (0,255,0)

(0,0,255)

(255,255,0)

(255,0,255) (0,255,255)

(255,255,255)

(0,0,0)

Page 51: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Color

• คลาสำที่��ใช่+เก.บสำ�• เราสำามารถสำร+างสำ�ด+วยการก�าหนดค&า RGB ได+

Color color1 = new Color(128, 0, 255);

• หร-อก�าหนดด+วยที่ศน�ยมโดยที่�� 0 หมายถ,งไม&ม�ความเข+ม และ 1 หมายถ,งเข+มที่��สำ�ดColor color2 = new Color(0.5f, 0, 1);

• นอกจัากน� ย�งม� static field ที่��ม�ค&าเป6นสำ�ที่��เราใช่+บ&อยๆ เช่&นColor.Green, Color.Blue, Color.Lavender, ฯลฯ

Page 52: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมเล$�อนตำ"วการ�ตำ�นด�วย์คู�ย์�บอร�ด

Page 53: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมเล-�อนติ�วการ/ติ2นด+วย keyboard

Page 54: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Keyboard

• คลาสำสำ�าหร�บอ&านสำถานะของค�ย/บอร/ด• เมธอดสำ�าค�ญ: GetState()– ค-น object ประเภที่ KeyboardState

Page 55: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

KeyboardState

• เก.บสำถานะของป�:มติ&างๆ ของ keyboard เอาไว+• เมธอดสำ�าค�ญ:– IsKeyDown(Keys key)• ติรวจัว&าป�:มถ2กกดอย2&หร-อไม&

– IsKeyUp(Keys key)• ติรวจัว&าป�:มถ2กปล&อยอย2&หร-อไม&

Page 56: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Keys

• enum ที่��ใช่+แที่นป�:มบนค�ย/บอร/ด เช่&น– Keys.A ป�:ม A– Keys.Space ป�:ม space bar– Keys.Right ป�:มล2กศรขวา

Page 57: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เช่.คว&าป�:มถ2กกดหร-อไม&KeyboardState keyboardState = Keyboard.GetState();if (keyboardState.IsKeyDown(Keys.Left)){ ... Do something ...}

Page 58: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมเล-�อนติ�วการ/ติ2นด+วยค�ย/บอรด/

• ม�ฟ?ลด/ spritePosition แที่นติ�าแหน&งม�มบนซ้�าย์ของติ�วการ/ติ2นเหม-อนเด�ม

• ม�ฟ?ลด/– xVelocity แที่นความเร.วในการเคล-�อนที่��ติามแนวนอน– yVelocity แที่นความเร.วในการเคล-�อนที่��ติามแนวติ� ง– ที่� งค2&ม�ขนาดเที่&าก�บ 5 แติ&คนละที่�ศที่าง

Vector2 xVelocity = new Vector2(5, 0);

Vector2 yVelocity = new Vector2(0, 5);

Page 59: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

การเล-�อนติ�วการ/ติ2น• บวกความเร.วเข+าก�บติ�าแหน&งถ+าผ2+ใช่+กดป�:มล2กศรที่�ศที่าง

protected override void Update(GameTime gameTime){

เช่.คว&าผ2+ใช่+กดป�:ม “back ” เพ-�อเล�กการที่�างานหร-อไม& KeyboardState keyboardState = Keyboard.GetState();

if (keyboardState.IsKeyDown(Keys.Left)) spritePosition -= xVelocity; if (keyboardState.IsKeyDown(Keys.Right)) spritePosition += xVelocity; if (keyboardState.IsKeyDown(Keys.Down)) spritePosition += yVelocity; if (keyboardState.IsKeyDown(Keys.Up)) spritePosition -= yVelocity;

เช่.คว&าติ�วการ/ติ2นติกขอบหร-อไม& base.Update(gameTime);}

Page 60: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เช่.คว&าติ�วการ/ติ2นติกขอบหร-อไม&int screenWidth = graphics.PreferredBackBufferWidth;int screenHeight = graphics.PreferredBackBufferHeight;

if (spritePosition.X < 0) spritePosition.X = 0;if (spritePosition.X + sprite.Width > screenWidth) spritePosition.X = screenWidth - sprite.Width;if (spritePosition.Y < 0) spritePosition.Y = 0;if (spritePosition.Y + sprite.Height > screenHeight) spritePosition.Y = screenHeight - sprite.Height;

Page 61: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมลากตำ"วการ�ตำ�นด�วย์เมาสี�

Page 62: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมลากติ�วการ/ติ2นด+วยเมาสำ/

Page 63: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Mouse

• คลาสำสำ�าหร�บอ&านสำถานะของเมาสำ/• เมธอดสำ�าค�ญ: GetState()– ค-น object ประเภที่ MouseState

Page 64: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

MouseState

• สำถานะป5จัจั�บ�นของเมาสำ/• Property สำ�าค�ญ– LeftButton สำถานะของป�:มซั+าย– RightButton สำถานะของป�:มขวา– MiddleButton สำถานะของป�:มกลาง– X ติ�าแหน&งแนวติ� ง– Y ติ�าแหน&งแนวนอน

Page 65: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ButtonState

• Enum ที่��ใช่+แที่นสำถานะของป�:มเมาสำ/• ม�สำมาช่�กสำองติ�ว– Pressed ถ2กกดอย2&– Released ไม&ถ2กกดอย2&

Page 66: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ที่�าล2กศรเมาสำ/• ม�ฟ?ลด/สำ�าหร�บเก.บติ�าแหน&งล2กศรและภาพของล2กศร

Texture2D cursor;Vector2 cursorPosition;

• ใน Update() ให+เปล��ยนติ�าแหน&งล2กศรprotected override void Update(GameTime gameTime){

การประมวลผลอย&างอ-�น MouseState mouseState = Mouse.GetState(); cursorPosition = new Vector2(mouseState.X, mouseState.Y);

การประมวลผลอย&างอ-�น}

Page 67: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ที่�าล2กศรเมาสำ/• ใน Draw() ก.ให+วาดล2กศร• ติ+องวาดอย&างอ-�นให+เสำร.จัก&อน เพราะติ�วที่��วาดที่�หล�งจัะ

ที่�บติ�วที่��ถ2กวาดก&อน

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

// วาดอย&างอ-�นก&อน // spriteBatch.Draw(cursor, cursorPosition, Color.White); spriteBatch.End();

base.Draw(gameTime);}

Page 68: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมวาดข้�อคูวาม

Page 69: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โปรแกรมวาดข+อความ

Page 70: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

การวาดข+อความใน XNA

1 .สำร+าง Sprite Font ใน Content ของเกม2. Load Sprite Font ใน Load Content3. วาดข+อความด+วย SpriteBatch.DrawString

Page 71: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

สำร+าง Sprite Font ใน Content

• คล�กขวาที่��โฟลเดอร/ DisplayingTextContent Add New Item

Page 72: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

สำร+าง Sprite Font ใน Content

• เล-อก Sprite Font

Page 73: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

สำร+าง Sprite Font

• เป3ดไฟล/ sprite font ที่��สำร+างใหม&แล+วแก+ไข– ช่-�อฟอนติ/– ขนาด– ฯลฯ

Page 74: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Load Sprite Font ใน LoadContent()

• สำร+างฟ?ลด/ช่น�ด SpriteFont

SpriteFont font01;

• ใช่+ Content.Load<SpriteFont>(…) ในการโหลดม�น

protected override void LoadContent(){

// โหลดอย&างอ-�น // font01 = Content.Load<SpriteFont>("font01");}

Page 75: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

วาดข+อความด+วย SpriteBatch.DrawString

protected override void Draw(GameTime gameTime){ GraphicsDevice.Clear(Color.White); spriteBatch.Begin();

// Draw "Hello" at the center of the screen. Vector2 helloSize = font01.MeasureString("Hello"); float centerX = (graphics.PreferredBackBufferWidth - helloSize.X) / 2; float centerY = (graphics.PreferredBackBufferHeight - helloSize.Y) / 2; Vector2 centerPosition = new Vector2(centerX, centerY);

spriteBatch.DrawString( font01, "Hello", centerPosition, Color.Black);

spriteBatch.End();

base.Draw(gameTime);}

Page 76: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

โคูรงสีร�างข้องเกม

Page 77: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3
Page 78: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

แติ&ม�นไม&ง&ายอย&างน� น!

• เกมม�หน+าจัอหลายหน+าจัอ– ภาพยนติร/เป3ด– หน+าไติเติ� ล– หน+าเล&นเกม– หน+าติ&อสำ2+– หน+าแผนที่��– หน+าเกมโอเวอร/– หน+าสำ�าหร�บเซัฟเกม– ฯลฯ

Page 79: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

ที่�าไม• หน+าจัอแติ&ละหน+าม�ว�ธ�การ– วาดสำ��งที่��ม�นติ+องการแสำดงให+ผ2+ใช่+เห.นเอง– จั�ดการข+อม2ลของม�นเอง– จั�ดการปฏ�สำ�มพ�นธ/ก�บผ2+ใช่+เอง

Page 80: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

แล+วเราจัะจั�ดการก�บม�นอย&างไร?

• ไอเด�ยที่��ไม&ด�– สำร+างติ�วแปรติ�วหน,�งเพ-�อเก.บไว+ว&าติอนน� เราอย2&ที่�� หน+า“

จัอ ไหน”– ให+ติ�วแปรน� เป6นติ�วบอกว&าเราจัะ

• วาดร2ปอย&างไร• จั�ดการข+อม2ลภายในเกมอย&างไร และ • จั�ดการก�บปฏ�สำ�มพ�นธ/ก�บผ2+ใช่+อย&างไร

– ด�งน� น ในสำ&วนติ&างๆ ของเกมล2ป จัะม�ค�าสำ��ง if ขนาดใหญ&อย2&หน,�งค�าสำ��ง• อย&างน+อยม�ค�าสำ��ง if สำามค�าสำ��งในหน,�งโปรแกรม

Page 81: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

แล+วเราจัะจั�ดการก�บม�นอย&างไร?

• ที่�าไมม�นถ,งเป6นไอเด�ยที่��ไม&ด�– ค�าสำ��ง if ที่��ว&าจัะม�ขนาดใหญ&ถ+าโปรแกรมม�หลายๆ หน+า

จัอ– โค+ดที่��ก�าหนดการที่�างานของหน+าจัอเด�ยวก�นถ2กแยก

ออกไปอย2&ในค�าสำ��ง if หลายๆ ค�าสำ��ง– สำมมติ�ว&าติอนเพ��มหน+าจัอใหม& เราล-มเอาไปด2ค�าสำ��ง if

สำ�กหน,�งที่��ล&ะ? จัะเก�ดอะไรข, น?

Page 82: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Design Patterns

• “ค-อ บ�นที่,กว�ธ�การแก+ป5ญหาเก��ยวก�บการออกแบบในสำาขาว�ช่าใดว�ช่าหน,�ง” (Wikipedia)

• ในที่างการออกแบบซัอฟติ/แวร/ ม�นค-อว�ธ�การแก+ป5ญหาการออกแบบซัอฟติ/แวร/ที่��ได+ร�บการที่ดสำอบจันเป6นที่��ยอมร�บ

• ค�ณเคยเร�ยน pattern ไหนมาจัากว�ช่า Java หร-อ SA ก�นบ+าง?

Page 83: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

The Gang of Four

• หน�งสำ-อมาติรฐานเก��ยวก�บ Design Patterns• โปรแกรมเมอร/ที่�กคนควรอ&าน ไม&ง� นเสำ�ยช่าติ�เก�ด

Page 84: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

แล+วม�นเก��ยวอะไรก�นก�บการเข�ยนเกม?

• ป5ญหาการม� “หลายหน+าจัอ” ไม&ใช่&ป5ญหาใหม&• ว�ธ�การแก+ป5ญหาน� ถ2กรวมไว+เป6น design pattern

แล+ว• เร�ยกว&า “State” design pattern

Page 85: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

State Design Pattern

• “ม�ไว+ที่�าให+ออบเจักติ/เปล��ยนแปลงพฤติ�กรรมของติ�วเองเวลาสำถานะภายในของม�นเปล��ยน จันด2เหม-อนว&าคลาสำของออบเจักติ/น� นถ2กเปล��ยนกลางค�น”

• ฟ5งแล+วค�+นๆ ไหม?• ลองแที่นค�าว&า:– “ออบเจักติ/” ด+วย “เกม”– “สำถานะภายใน” ด+วย “หน+าจัอ”– “คลาสำ” with “ร2ปแบบการติ�ดติ&อก�บผ2+ใช่+”

Page 86: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

The State Design Pattern

Page 87: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

State Design Pattern

• Context (บร�บที่)– ผ2+ใช่+ที่�าการติ�ดติ&อก�บคลาสำน� – ภายในเก.บ instance ของ ConcreteState ซั,�งเป6นซั�บ

คลาสำของ State เอาไว+ เจั+าติ�ว instance น��แหละค-อสำถานะภายในที่��สำามารถเปล��ยนแปลงไปได+

• State– ม� interface ที่��ครอบคล�มพฤติ�กรรมที่��เปล��ยนแปลงไป

ติามสำถานะภายใน• ConcreteState– ม�โค+ดที่��ที่�าให+เก�ดพฤติ�กรรมที่��ติรงก�บสำถานะภายในหน,�งๆ

Page 88: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เอาม�นมาใช่+ก�บเกม• “Context” “Game”– สำ-บเช่- อสำายมาจัาก Microsoft.Xna.Framework.Game

• “State” “Screen”• ในคลาสำ Game ม�ฟ?ลด/ “currentScreen” สำ�าหร�บ

เก.บ screen ป5จัจั�บ�นของเกม• ถ+าติ+องการเปล��ยน screen ก.แค&เปล��ยนค&าติ�วแปร

currentScreen

Page 89: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Screen

• ม� method ที่��ติ&างๆ ที่��สำ�าค�ญของ Game– Initialize– Update(GameTime gameTime)– LoadContent– UnloadContent– Draw(GameTime gameTime)– Update(GameTime gameTime)

• Method เหล&าน� สำ&วนใหญ&เป6น abstract method เน-�องจัากเราติ+องการให+ผ2+ใช่+ Screen ไป subclass ม�น

Page 90: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Screen

• ม� field สำ�าหร�บเก.บข+อม2ลที่��จั�าเป6น– name สำ�าหร�บเก.บช่-�อ– game สำ�าหร�บเก.บ instance ของ Game ที่�� screen น�

เป6นสำมาช่�ก• ม� property สำ�าหร�บ field ที่� งสำองข+างติ+น– Name– Game– ที่� งสำอง property น� เป6นแบบ read-only (ม�แติ& get)

Page 91: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Screen

• ม� method อ�านวยความสำะดวกอ-�นๆ– void SwitchedIntoFrom(string sceneName)• ถ2กเร�ยกเม-�อ screen ถ2กเปล��ยนมาย�ง screen น� • ร�บช่-�อของ screen เด�มเป6น argument

– void Draw(GameTime gameTime, SpriteBatch spriteBatch)• วาดร2ปลงบนหน+าจัอด+วย SpriteBatch ที่��ได+ร�บ• เป6น abstract method ที่��ผ2+ใช่+ติ+อง override• ถ2กเร�ยกโดย Draw(GameTime gameTime) ซั,�งจัะเอา

SpriteBatch ของ Game ที่�� screen น� เป6นสำ&วนประกอบอย2&มาใช่+

Page 92: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Game

• สำ-บเช่- อสำายมาจัาก Microsoft.Xna.Framework.Game• เวลาเข�ยนเกมในว�ช่าน� เราจัะสำ-บเช่- อสำายเกมมาจัาก

คลาสำน� จัะไม&ใช่+ Microsoft.Xna.Frame.Game โดยติรงอ�ก

• ม� field – currentScreen สำ�าหร�บเก.บ screen ป5จัจั�บ�น– screens เป6น Dictionary ที่�� map ช่-�อ screen ไปย�ง screen

ติ&างๆ ในเกม

Page 93: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Gameprivate Screen currentScreen;public Screen CurrentScreen{ get { return currentScreen; }}

Dictionary<string, Screen> screens;

Page 94: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Game

• เวลาเพ��ม screen ใสำ&เกม ให+เร�ยก methodvoid AddScreen(Screen screen)

public void AddScreen(Screen screen){ screens[screen.Name] = screen;}

Page 95: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Game

• เวลาเปล��ยน screen ให+เร�ยก methodvoid SwitchScreen(string name)

public void SwitchScreen(string name){ var newScreen = GetScreenByName(name); var oldScreen = CurrentScreen; currentScreen = newScreen; if (oldScreen != null) currentScreen.SwitchedIntoFrom(oldScreen.Name); else currentScreen.SwitchedIntoFrom("null");}

Page 96: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Game

• Screen GetScreenByName(string name)ม�ไว+สำ�าหร�บด,ง screen ที่��ม�ช่-�อที่��ก�าหนดออกมา

public Screen GetScreenByName(string name){ if (screens.ContainsKey(name)) return screens[name]; else throw new InvalidOperationException( "Screen by name '" + name + "' not found.");}

Page 97: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Game

• override method ของ Xna.Framework.Gameโดยในเมธอดน� นจัะม�การเร�ยก method ที่��ติรงก�นของ Screen

protected override void Initialize(){ foreach (Screen screen in screens.Values) screen.Initialize(); base.Initialize();}

Page 98: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Game protected override void LoadContent() { base.LoadContent(); spriteBatch = new SpriteBatch(GraphicsDevice); foreach (Screen screen in screens.Values) screen.LoadContent(); }

protected override void UnloadContent() { foreach (Screen screen in screens.Values) screen.UnloadContent(); base.UnloadContent(); }

Page 99: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

คลาสำ Game protected override void Update(GameTime gameTime) { base.Update(gameTime); currentScreen.Update(gameTime); }

protected override void Draw(GameTime gameTime) { base.Draw(gameTime); currentScreen.Draw(gameTime); }

Page 100: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

กรณ�ศ,กษา: Tetris

• เกม Tetris อย&างง&ายอาจัม� screen อย2& 4 screen– Title Screen – หน+าจัอไติเติ� ล– Play Screen – เวลาเล&นเกมที่��ผ2+ใช่+สำามารถบ�งค�บเกมได+– Full Row Screen – แสำดงผลเวลาแถวแถวหน,�งเติ�ม ให+

ม�นกระพร�บแล+วหายไป– Game Over Screen – แสำดงข+อความ Game Over

Page 101: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

เกมในฐานะ State Machine• เกมม�หลาย “หน+าจัอ”• ในเวลาหน,�งๆ ม�เพ�ยงหน+าจัอเด�ยวเที่&าน� นที่��ถ2กแสำดงผล

(active)• ม�การเปล��ยนหน+าจัอหน,�งไปย�งอ�กหน+าจัอหน,�ง ซั,�งการ

เปล��ยนน� ถ2กควบค�มโดย ป5จัจั�ยภายนอก “ ” (ผ2+ใช่+และเวลาที่��ผ&านไป)

• เวลาเข�ยนเกมเราจัะสำร+าง subclass ของ Screen หน,�ง subclass สำ�าหร�บหน+าจัอแติ&ละแบบ

• เวลาม�การเปล��ยนแปลงหน+าจัอ เราก.จัะเร�ยก SwitchScreen

• เราสำามารถเข�ยนการเปล��ยนสำถานะของเกมด+วยแผนภาพที่��เร�ยกว&า “transition diagram”

Page 102: 418383  การโปรแกรมเกม การบรรยายครั้งที่  3

Transition Diagram ของเกม Tetris

Title

Play

Full Row

Game Over

“จับเกม”

“จับเกม”

“กล�บ title”

“เล&นใหม&”กระดาน

ล+น

แถวกระพร�บเสำร.จั

แถวเติ.ม

“เร� �มเกม”