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

66
418383: กกกกกกกกกกกกก กกกกกกกกกกกกกกกกก 4 กกกกกก กกกกกกก

description

418383: การโปรแกรมเกม การบรรยายครั้งที่ 4. ประมุข ขันเงิน. Tetris. สร้างโดย Alexey Pajinov โปรแกรมเมอร์ชาวรัสเซีย ในปี 1985. Tetris. กฎ ( จาก Wikipedia): มีเทโทรมิโนตกลงมาสู่พื้นของบอร์ดทีละอัน - PowerPoint PPT Presentation

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

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

418383: การโปรแกรมเกม การบรรยายครงท 4

ประมข ขนเงน

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

Tetris

• สรางโดย Alexey Pajinov โปรแกรมเมอรชาว รสเซย ในป 1985

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

Tetris

• กฎ ( จาก Wikipedia):– มเทโทรมโนตกลงมาสพนของบอรดทละอน– ผเลนตองควบคมเทโทรมโนในตกไปกองทพกนเปน

แถวเตมซงไมมชองวางอยภายใน โดยการเลอนไปทาง ซายขวา หรอหมน 90 องศา

– เมอเกดแถวเตม บลอกของเทโทรมโนในแถวนนทงหมดจะหายไป

– เกมจะจบลงเมอเทโทรมโนกองทบกนจนลนบอรดบนหนาจอ

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

เทโทรมโน• รปทรงทเกดจากการเอาบลอกสอนมาตอกน• เรยกชอวา I, J, L, O, S, T, และ Z.

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

Screen ตางๆ ในเกม• Title Screen– ฉากไตเตล– คลาส TitleScreen

• Play Screen– ฉากเลนเกม– คลาส PlayScreen

• Game Over Screen– ฉากเกมจบ– คลาส GameOverScreen

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

โคดของเกมpublic class Tetris : GameLib.Game{ public Tetris() : base() { Content.RootDirectory = "Content"; Graphics.PreferredBackBufferWidth = 800; Graphics.PreferredBackBufferHeight = 600;

AddScreen(new Screens.TitleScreen(this)); AddScreen(new Screens.GameOverScreen(this)); AddScreen(new Screens.PlayScreen(this)); SwitchScreen(“Title");

Tetromino.InitializePrototypes(); }}

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

Transition Diagram ของเกม

Title

Play

Game Over

“ ”จบเกม

“ ”จบเกม

กลบ title”

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

“”

เรมเกม

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

TITLE และ GAME OVER SCREEN

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

เราตองการ

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

มองวาสวนนเปนเกมเกมหนงเลย• สถานะของเกม– ตวเลอกทผเลนเลอกอยตอนน

• การจดการปฏสมพนธกบผใช– ปม ขน/ ลง เปลยนตวเลอกทผเลนเลอก (title)– ปม Enter ควรจะเปลยนหนาจอเปนหนาจออน (choices)

• การวาดภาพบนหนาจอ– เขยนชอเกม– เขยนตวเลอก และเขยนวงเลบกามปลอมรอบตวเลอกปจจบน

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

จรงๆ แลว...

• Game Over Screen กมลกษณะคลายๆ กน

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

ระบบเมน• หนาจอทงสองทำาหนาทเปนเมน– อำานวยความสะดวกใหผใชเลอกตวเลอกจากหลายตวเลอก

– ตวเลอกแตละตวนำาไปสหนาจออน• ทงสองหนาจอมหนาตาคลายๆ กน– ขอความขนาดใหญอยขางบน– ขอความแสดงตวเลอกขนาดเลกลงอยขางลาง

• เราควรจะเขยนคลาสทเกบพฤตกรรมทเหมอนๆกนของระบบเมนไว

• แลวจงซบคลาสมน เพอสรางหนาจอทงสอง

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

คลาส MenuScreen

• มขอมลทนยามตวเมน และสถานะภายในของมน– Title– Choices– ตวเลอกปจจบน

• จดการขอมลเขาทผใชปอน– เปลยนตวเลอกเมอผใชกดขนลง

• แตไมระบพฤตกรรมเมอผใชเลอกตวเลอก– ตรงนใหซบคลาสไประบเอาเอง

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

ฟลดทสำาคญในคลาส MenuScreen

• string title;– ขอความไตเตล

• string[] choices;– อะเรยของตวเลอกตางๆ

• int currentChoice;– หมายเลขของตวเลอกปจจบน

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

เมธอดสำาคญในคลาส MenuScreen

• public MenuScreen(GameLib.Game game, string name, string title, string titleFontName, string[] choices, string choiceFontName)– game = เกมทม screen นอย– name = ชอของ screen– title = ไตเตล– titleFontName = asset name ของ font ทใชพมพ title– choices = ตวเลอกตางๆ– choiceFontName = assert name ของ font ทใชพมพ choice

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

เมธอดสำาคญในคลาส MenuScreen

• public abstract void ChoiceSelected( int index, GameTime gameTime);– ถกเรยกเมอผใชกดปม Enter– index = หมายเลขของ choice ทถกเลอกอยในปจจบน– เปน abstract เพอใหซบคลาสมาเตมพฤตกรรมเพมเตม

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

Title Screenpublic class TitleScreen : MenuScreen { public TitleScreen(GameLib.Game game) : base( game, "title_menu", "Tetris", "Vera64", new string[] { "Play", "Quit" }, "Vera32") { } : :}

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

Title Screenpublic override void ChoiceSelected(

int index, GameTime gameTime){ switch (index) { case 0: Game.SwitchScreen(“Play"); break; case 1: Game.Exit(); break; default: break; }}

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

Game Over Screenpublic class GameOverScreen : MenuScreen{ public GameOverScreen(GameLib.Game game) : base( game, "GameOver", "Game Over", "Vera64", new string[] { "Play Again", "Return to Title", "Quit" },

"Vera32") { }

: :}

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

Game Over Screenpublic override void ChoiceSelected(int index, GameTime gameTime){ switch (index) { case 0: Game.SwitchScreen("Play"); break; case 1: Game.SwitchScreen("Title"); break; case 2: Game.Exit(); break; default: break; }}

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

ฟอนต• เกมใชฟอนต Bitstream Vera• ดาวนโหลดไดจาก http://www.gnome.org/fonts/• ใน TetrisContent ม Sprite Font ทสรางจาก

Bitstream Vera อยสองตว– Vera64

• Bitstream Vera Sans Mono ขนาด 64p• ใชเขยน title

– Vera32• Bitstream Vera Sans Mono ขนาด 32p• ใชเขยน choice

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

การจดการกบอนพตจาก KEYBOARD

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

จดการอนพตจากคยบอรด• กดลกศรขน ตวเลอกเลอนขน• กดลกศรลง ตวเลอกเลอนลง• เราจะจดการกบการกดปมอยางไร?

• อาจใช KeyboardState.IsKeyDown(Keys.Down) เพอตรวจวาปมลกศรลงถกกดหรอไม

• ถาจรงกเลอนตวเลอกลง• ทำาทำานองเดยวกนไดกบปมลกศรขน

• ปญหา: ตวเลอกถกเปลยนอยตลอดเวลาเวลากดคาง จนคนมองไมเหนความเปลยนแปลง

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

จดการอนพตจากคยบอรด• อกวธหนง: เชควาผใชเพงจะกดปมในเฟรมนหรอเปลา

• กลาวคอจำาไววาในเฟรมกอนกดหรอไม• ถาเฟรมกอนไมกด แตเฟรมนกด แสดงวาเพงจะกด

• ปญหา: ตวเลอกไมเปลยนถาผใชกดปมคาง

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

จดการอนพตจากคยบอรด• สงทเราตองการ: พฤตกรรมเวลาเราพมพขอความใน

text editor ทวๆ ไป• สมมตวาเราใช Notepad จะเกดอะไรขนถาคณกดปม a คางไว?– ‘ตวอกษร a’ ตวแรกจะปรากฏทนททกดปม– ‘หลงจากนน ไมมตวอกษร a’ ปรากฏขนเลยเปนเวลาสกครงวนาท

– ‘หลงจากนน ตวอกษร a’ ปรากฏขนหลายตวอยางรวดเรวดวยความถสง

– ‘เมอปลอยปม จะไมมตวอกษร a’ ปรากฏขนอก

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

คลาส KeySensor

• โคดทใชสรางพฤตกรรมดงกลาวคอนขางซบซอน• เราจะรวมมนเปนคลาสชอวา KeySensor• เราจะใช KeySensor ในการจดการอนพตจากคยบอรดไปตลอด

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

วธใช KeySensor

• ประกาศ KeySensor ไวเปนฟลดในคลาสทเปนScreen– สมมตประกาศชอวา keySensor

• ในฟงกชน Update ของคลาสทเปน Screen ใหเรยกkeySensor.Update(gameTime)

เพอให keySensor ประมวลผลสถานะของปมตางๆ

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

วธใช KeySensor

• ตวอยาง: (MenuScreen)

private GameLib.KeySensor keySensor;

public override void Update(GameTime gameTime){

// Update key sensor's internal information. keySensor.Update(gameTime);

: :

}

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

วธใช KeySensor

• ลงทะเบยนให KeySensor “ ” เฝามอง ปมทเราสนใจ

ดวยคำาสง Watch• โดยมากจะทำาใน constructor ของ Screen

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

วธใช KeySensor

• ตวอยาง: (MenuScreen)

public MenuScreen(...) : base(game, name){ : : // Create the key sensor. this.keySensor = new KeySensor(); // We will watch three keys: this.keySensor.Watch(Keys.Up); this.keySensor.Watch(Keys.Down); this.keySensor.Watch(Keys.Enter);

: :}

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

วธใช KeySensor

• ในฟงกชน Update ของ Screen ใหใชฟงกชนเหลานของKeySensor ในการตรวจสถานะของปม– public bool IsKeyPressed(Keys key)

• ตรวจสอบวาคยทใหมาเพงจะถกกดในเฟรมนนหรอไม (เฟรมกอนไมกด)

– public bool IsKeyReleased(Keys key)• ตรวจสอบวาคยทใหมาเพงจะถกปลอยในเฟรมนนหรอไม (เฟรมกอนกดอย)

– public bool IsKeyDown(Keys key)• ตรวจสอบวาคยทใหมาถกกดอยในเฟรมนนหรอไม (เชคกดคาง)

– public bool IsKeyTyped(Keys key)• “ ” ตรวจสอบวาคยทใหมาถก พมพ ในเฟรมนนหรอไม• เมธอดนทำาใหเกดพฤตกรรมเหมอนตอนพมพใน text editor

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

การใช KeySensor ใน MenuScenepublic override void Update(GameTime gameTime){ // Update key sensor's internal information. keySensor.Update(gameTime);

// If the user types the up arrow, // move the choice upward. if (keySensor.IsKeyTyped(Keys.Up)) { currentChoice -= 1; if (currentChoice < 0) currentChoice = choices.Length - 1; } // If the user types the down arrow, // move the choice downward. else if (keySensor.IsKeyTyped(Keys.Down)) { currentChoice += 1; if (currentChoice >= choices.Length) currentChoice = 0; } // If the user pressed enter, // the choice is selected. else if (keySensor.IsKeyTyped(Keys.Enter)) ChoiceSelected(currentChoice, gameTime);}

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

การมารกเวลา

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

จดการเวลา• ในการเขยน KeySensor เราตองสามารถ– มารกเวลาทปมปมหนงถกกดเปนครงแรก– คำานวณวาเวลาผานไปเทาไหรแลวหลงจากปมถกกดครงแรก

• เราตองสามารถใหชอกบมารกเวลาทเราทำาไวดวยเนองจาก– มปมหลายๆ ปมทเราตองตรวจสอบ– แตละปมจะมมารกเหตการณสองแบบ• แบบแรกสำาหรบเวลาทมนถกกดเปนครงแรก• “ ” แบบทสองสำาหรบเวลาทตวอกษรถก พมพ เปนครงสดทาย

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

คลาส TimeMarker

• public void Mark(string eventName, GameTime now)– มารกเวลาปจจบน (now) ดวยชอทกำาหนด

(eventName) ให• public TimeSpan GetTimeSinceLastMarked(

string eventName, GameTime now)– คนเวลาตงแตเหตการณทมชอทกำาหนดใหถกมารก– คนชวงเวลา 0 ถาไมมเหตการณทกำาหนดให

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

คลาส TimeMarkerpublic class TimeMarker{ private Dictionary<string, double> markedTimes;

public TimeMarker() { markedTimes = new Dictionary<string, double>(); }

: :}

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

คลาส TimeMarkerpublic void Mark(string eventName, GameTime now){ markedTimes[eventName] =

now.TotalGameTime.TotalMilliseconds;}

public TimeSpan GetTimeSinceLastMarked(string eventName, GameTime now)

{ if (markedTimes.ContainsKey(eventName)) return TimeSpan.FromMilliseconds( now.TotalGameTime.TotalMilliseconds – markedTimes[eventName]); else return new TimeSpan(365, 0, 0, 0);}

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

GAME LOGIC

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

คลาสทเกยวกบเททรส• Tetromino– แทนตวเทโทรมโนหนงตว

• Block– แทนบลอกหนงบลอกจากตวเทโทรมโน

• TetrisBoard– แทนบอรดทใชเลนเททรส

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

คลาส Block

• แทนบลอกหนงบลอกทมาจากตว Tetromino• ฟลด– x = ตำาแหนงตามแกน X– y = ตำาแหนงตามแกน Y– shape = ชนดของเทโทรมโนตนกำาหนด (I, J, L, O, S, T,

หรอ Z)

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

TetrominoShape• ชนดขอมลแบบ enum ทเกบชนดของตวเทโทรมโนไวทงหมด

public enum TetrominoShape{ I, J, L, O, S, T, Z}

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

เขารหสเทโทรมโน• “ ” เทโทรมโนแตละตวม จดหมน ซงเปนบลอกทเวลาหมนเทโทรมโนแลวบลอกอนจะหมนรอบบลอกนน.

• ยกตวอยางเชน เทโทรมโน L จะมบลอกดงเหนขางลางนเปนจดหมน

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

เขารหสเทโทรมโน• สำาหรบเทโทรมโนแตละตว เราจะสรางระบบพกดของมน

• ใหจดหมนมพกด (0,0).• พกดของบลอกอนๆ คดเทยบตามบลอกนน• ตวอยาง

(0,0)

(0,-1)

(0,1) (1,1)

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

เขารหสเทโทรมโน• เทโทรมโน L ถกหมนได 4 แบบ ดงนนสามารถแทนได

ดวยบลอกตางๆ ดงจะเหนไดขางลางน {(0,0),(-1,0),(1,0),(-1,1)} {(0,0),(0,-1),(0,1),(1,1)}

{(0,0),(-1,0),(1,0),(1,-1)}

{(0,0),(0,-1),(0,1),(-1,-1)}

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

เขารหสเทโทรมโน• เพอทำาใหการหมนเทโทรมโนงาย เราจะเกบลสต

ของบลอกทหมนแลว ในลสตซงเรยงตามการหมนทวนเขมนาฬกา

[[(0,0),(-1,0),(1,0),(-1,1)], [(0,0),(0,-1),(0,1),(1,1)], [(0,0),(-1,0),(1,0),(1,-1)] , [(0,0),(0,-1),(0,1),(-1,-1)]]

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

เขารหสเทโทรมโน• เราทำาเชนนกบเทโทรมโนทกแบบ แลวเกบขอมลไวในดก

ชนนารชอ prototypes ซงเปน static field ของคลาสTetromino

private static Dictionary<TetrominoShape, List<List<Block>>> prototypes = null;

• การสรางดกชนนารนและการเตมมนใหเตม จะถกทำาใน static method ชอ InitializePrototypes

ซงถกเรยกใน constructor ของเกม

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

คลาส Tetromino

• แทนตวเทโทรมโนหนงตว• มฟลดสฟลด– shape = รปรางของเทโทรมโน ( ชนด TetrominoShape)– rotation = จำานวนเตมทบอกวาตอนนเทโทรมโนอยในการ

หมนทเทาไหร โดยหมายเลขการหมนนอางจากตำาแหนงของการหมนใน

prototypes– x = ตำาแหนงตามแกน X ของจดหมนในบอรด– y = ตำาแหนงตามแกน Y ของจดหมนในบอรด

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

คลาส Tetromino

• public void RotateClockwise()• public void RotateCounterClockwise()– หมนบลอกตามเขมและทวนเขมนาฬกา– ทำาโดยการเพมหรอลดคา rotation ทละ 1

• public IEnumerable<Block> GetBlocks()– คนบลอกทงหมดในเทโทรมโนมา– บลอกทคนมาจะมตำาแหนง xy อยในระบบพกดของบอรด

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

คลาส TetrisBoard

• แทนบอรด (กระดาน) ทเราใชเลนเททรส• มฟลดสามฟลด– blocks = ลสตของบลอกในบอรดทตกถงพนแลว (ไมรวมทผเลนบงคบ)

– width = ความกวาง– height = ความสง

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

การตรวจการชนกนของเทโทรมโนกบบอรด

• public bool CheckSideCollision( Tetromino tetromino)– เชควาเทโทรมโนทใหชนกบขอบดานขางของบอรดหรอไม

– ชน = มบลอกหนงบลอกเลยขอบดานขางไป• public bool CheckBottomCollision(

Tetromino tetromino)– เชควาเทโทรมโนทใหชนกบขอบดานลางบอรดหรอไม– ชน = มบลอกหนงบลอกเลยขอบดานลางไป

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

การตรวจการชนกนของเทโทรมโนกบบอรด

• public bool CheckBlockCollision( Tetromino tetromino)– เชควาเทโทรมโนทใหชนกบบลอกใดบลอกหนงทอยในบอรดแลวหรอไม

– ชน = มบลอกของเทโทรมโนซอนทบกบบลอกทมอยในบอรดแลวพอด

• public bool CheckCollision( Tetromino tetromino)– เชควาเทโทรมโนทใหชนกบอะไรในบอรดหรอไม– ทำาการเชคสามอยางทแลวทงหมด

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

เมธอดสำาคญอนๆ• public void Freeze(Tetromino tetromino)– ยอยเทโทรมโนทกำาหนดใหเปนบลอก แลวนำาบลอกไปใสในบอรด

– ใชเวลาเทโทรมโนตกถงพน• public List<int> GetFullRows()– คนลสตของหมายเลขของแถวทเตมแลว

• public void RemoveFullRows()– ลบบลอกในแถวทเตมแลวออกจากบอรด

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

PLAY SCREEN

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

Play Screen

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

Play Screen

• ฟลดทสำาคญ– board = บอรด (instance ของ TetrisBoard)– playerPiece = เทโทรมโนทผใชควบคม– nextPiece = เทโทรมโนอนตอไป (แสดงอยดานขาง)– descendDelay = เวลาจนกวาเทโทรมโนจะเลอนลงขาง

ลางเอง (1 ว)– fullRowsCreated = แถวเตมททำาไดแลว– score = คะแนนททำาได

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

“ ” โหมด ของ Play Screen

• การควบคมของผใชใน Play Screen แบงออกไดเปน2 โหมดใหญ– Play Mode = ผเลนเลนธรรมดา– Full Row Mode = ผเลนทำาอะไรไมไดเลยระหวางทเกมแสดงวามแถวเตมและมนกำาลงจะหายไป

• ฟลดทชวยจดการสองโหมดน– mode = โหมดปจจบน จะมคาเปน

PlayScreenMode.Play หรอ PlayScreenMode.FullRow– blinkDelay = เวลาในการกระพรบครงรอบของแถวเตม– blinkCounter = แถวเตมกระพรบไปกครงรอบแลว

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

เมธอดทสำาคญ• public void ResetGame()– เรมเกมใหม– เคลยรบอรด คะแนน ฯลฯ

• private void PrepareNextPiece()– เอา nextPiece ไปใส playerPiece– สรางเทโทรมโนอนใหมแลวเอาไปใส nextPiece

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

Update

• การเปลยนแปลงสถานภายในของเกมขนอยกบโหมด– Play Mode• รบอนพตจากคยบอรด• ควบคมเทโทรมโน• เชคแถวเตมและเกมโอเวอร

– Full Row Mode• รอใหเวลาผานไปเฉยๆ• ถาเวลาผานไปเกน blinkDelay ใหเพม blinkCounter

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

Play Mode

• การ update สถานะขนอยกบการเคลอนทของเทโทรมโน– หมน– ไปทางซาย– ไปทางขวา– เลอนลง

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

หมนเทโทรมโน• เชคปมลกศรขน• ถาหมนแลวไมไปชนอะไรกหมนได

• ใน Updateif (keySensor.IsKeyTyped(Keys.Up)) RotateIfOkay();

• เมธอด RotateIfOkayprivate void RotateIfOkay(){ playerPiece.RotateCounterClockwise(); if (board.CheckCollision(playerPiece)) playerPiece.RotateClockwise();}

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

เลอนไปทางซายหรอขวา// Move left if the user types the left arrows.if (keySensor.IsKeyTyped(Keys.Left)){ playerPiece.X -= 1; if (board.CheckCollision(playerPiece)) playerPiece.X += 1;}// Move right if the user types the right arrows.else if (keySensor.IsKeyTyped(Keys.Right)){ playerPiece.X += 1; if (board.CheckCollision(playerPiece)) playerPiece.X -= 1;}

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

เลอนลง• มสองกรณ– “ ”กรณทผใช พมพ ลกศรลง– กรณทเทโทรมโนมนเลอนลงมาเองเมอเวลาผานไป

descendDelay• กรณแรกเชคงาย• กรณทสองตองใช TimeMarker ชวย• ใช TimeMarker จำาเวลาครงทแลวทเทโทรมโนเลอนลง

• ถาเวลาผานจากนนไปเกน descendDelay ใหเลอนลง• เลอนลงใหมารกเวลาเลอนลงใหมทนท

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

เลอนลงif (keySensor.IsKeyTyped(Keys.Down) || timeMarker.GetTimeSinceLastMarked( LastDescentEventName, gameTime) > descendDelay){ timeMarker.Mark(LastDescentEventName, gameTime); playerPiece.Y += 1; : : }

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

เลอนลง• เมอเทโทรมโนเลอนลงแลวตองเชค– มนชนกบอะไรหรอไม?– ถาชน• ตอง Freeze มน• เชความแถวเตมหรอไม

– ถาใชใหเปลยนเปน Full Row Mode• เชควา Game Over หรอไม

– ถาใชใหเปลยนเปน Game Over Screen

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

เลอนลงif (board.CheckCollision(playerPiece)){ playerPiece.Y -= 1; board.Freeze(playerPiece); PrepareNextPiece(); score += PieceScore();

var fullRows = board.GetFullRows(); if (fullRows.Count > 0) { mode = PlayScreenMode.FullRow; ResetFullRowMode(gameTime); }

if (board.CheckCollision(playerPiece)) Game.SwitchScreen("GameOver");}

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

Full Row Modeif (timeMarker.GetTimeSinceLastMarked( LastBlinkEventName, gameTime) > blinkDelay){ timeMarker.Mark(LastBlinkEventName, gameTime); blinkCounter++;}

if (blinkCounter >= 4){ int fullRowCount = board.GetFullRows().Count; fullRowsCreated += fullRowCount; score += FullRowScore(fullRowCount); board.RemoveFullRows(); mode = PlayScreenMode.Play; timeMarker.Mark(LastDescentEventName, gameTime);}