418587 ภาคปลาย 2552/การบ้าน 2

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

ให้ไว้ ณ วันอาทิตย์ที่ 31 ม.ค. 2553 ส่งวันพุธที่ 17 ก.พ. 2553 เวลา 23.59 น. โดย zip ไฟล์ในไดเรกทอรี Breakout ส่งมาที่ pramook at gmail dot com

เริ่มต้น

งานของคุณ

1. เพิ่มไอเทมที่เก็บแล้วมีลูกบอลเพิ่มขึ้นสองลูก

ในตอนนี้เกม Breakout ในโค้ดตั้งต้นมีไอเทมเพียงสองชนิด คือ ไอเทมที่เก็บแล้วแป้นสามารถจับและปล่อยลูกบอลได้ (ไิอเทม A) กับไอเทมที่เก็บแล้วแป้นมีความยาวมากขึ้น (ไอเทม B)

ในข้อนี้ให้คุณสร้างไอเทมชนิดใหม่ ซึ่ีงเมื่อเก็บแล้วแป้นจะปล่อยลูกบอลออกมาสองลูก ลูกหนึ่งพุ่งออกทางด้านซ้าน อีกลูกพุ่งออกทางด้านขวา ลูกบอลนี้จะต้องมีสมบัติเหมือนลูกบอลที่มีอยู่แล้วทุกประการ และเมื่อแป้นยิงลูกบอลใหม่มาแล้ว ลูกบอลเดิมสามารถที่จะหล่นออกจากฉากไปได้โดยที่ผู้เล่นจะยังไม่ตาย (กล่าวคือผู้เล่นจะตายก็ต่อเมื่อไม่มีลูกบอลเหลือในฉากแล้วเท่านั้น)

วิธีการที่ง่ายที่สุดในการทำโจทย์ข้อนี้คือการเขียน subclass ของ BreakoutLib.Item แล้ว implement เมธอด CollideWithBar ของมันให้เพิ่มลูกบอลเข้าไปสองลูกใส่ GameState

อนิเมชันของไอเทม

เ้ราได้สร้างอนิเมชันของไอเทมชนิดนี้เอาไว้ให้คุณแล้ว มันอยู่ในไฟล์ extra_balls_item.anim ใน Content ของโปรเจค BreakoutLib

แก้ไข Content Pipeline ให้อ่านไอเทมชนิดที่สามได้

Map ที่ให้ไปในเกม (ไฟล์ map-01.txt, map-02.txt, และ map-03.txt ใน Content ของโปรเจค Breakout) สามารถใส่ไอเทมได้ 4 ชนิด (แทนด้วยตัวอักษร 1, 2, 3, 4 ตามลำดับ) แต่ในตอนนี้เกมสามารถอ่านไอเทมได้แค่ชนิด 1 กับ 2 เท่านั้น เนื่องจากใน BreakoutMapReader.cs ในโปรเจค BreakoutMapContentPipeline มีการกำหนดเงื่อนไขดังต่ีอไปนี้

<geshi lang="csharp"> Item item = null; if (brickFromFile.itemType != 0) //This brick come with its item. load it. {

 switch (brickFromFile.itemType)
 {
   case 1: item = new LongBarItem(); break;
   case 2: item = new MagnetBarItem();  break;                        
 }

} </geshi>

เมื่อคุณสร้างคลาสสำหรับไอเทมชนิดนี้เสร็จแล้ว ให้ไปเพิ่ม case 3 หรือ case 4 ในคำสั่ง switch ข้างบน แล้วเกมก็จะอ่านไอเทมที่คุณสร้างขึ้นมาใหม่ได้

2. เพิ่มไอเทมที่เก็บแล้วผู้เล่นสามารถยิงลูกกระสุนปืนออกจากแป้นได้

จงสร้างไอเทมชนิดใหม่ ซึ่ีงเมื่อเก็บแล้วลูกแป้นจะเปลี่ยนรูปร่างให้ปลายทั้งสองข้างเป็นสีเขียว เมื่อแป้นอยู่ในสภาพนี้ หากผู้ใช้กดปุ่ม spacebar แล้วแป้นจะยิงลูกกระสุนสีแดงสองลูกออกทางข้างแป้น เมื่อลูกกระสุนกระทบบล็อก "เลือด" (HP) ของบล็อกจะลดลงหนึ่ง เหมือนกับโดนลูกบอลกระทบหนึ่งครั้ง (กล่าวคือถ้าเลือกเหลือ 0 แป้นก็จะถูกทำลายได้) และเมื่อเป็นอยู่ในสถานะนี้ไปสักระยะหนึ่งมันจะกลับคือสู่สภาพเดิม

ในการทำโจทย์ข้อนี้เราแนะนำให้คุณแบ่งการทำงานเป็นสามขั้นตอน ดังนี้

  1. สร้าง GameObject สำหรับแทนลูกกระสูน
    • สร้าง subclass ของ GameObject ขึ้นมาใหม่ ชื่อ Bullet สำหรับแทนลูกกระสุน
    • เพิ่มเมธอด void CheckCollisionWithBullet(Bullet bullet) เข้่าใน GameObject แล้ว implement เมธอดนี้ให้ subclass ของ GameObject ทุกคลาส
    • สร้าง event ชื่อ BrickHitBullet เพื่อแทนเหตุการณ์ลูกกระสุนกระทบบล็อก
    • สร้างเมธอด void Visit(BrickHitBullet ev) ใน EventVisitor แล้วเขียนเมธอดนี้ให้ subclass ทุกตัวของ EventVisitor (ในตอนนี้มีสองตัวคือ GameState และ ScoreManager)
  2. สร้าง BarType ใหม่
    • BarType เป็นคลาสที่ใช้กำหนดพฤติกรรมของแป้นเมื่อมันได้รับไอเทมแบบต่างๆ
    • ให้สร้าง BarType ใหม่ที่ใช้แทนแป้นเมื่อมันสามารถยิงลูกกระสุนได้
    • เขียนเมธอด void Control (KeySensor keySensor, GameState gameState) ซึ่งรับข้อมูลเข้าทางคีย์บอร์ดจาก KeySensor แล้วควบคุมแป้นตามนั้น ในการเขียนเมธอดนี้คุณจะต้องทำให้
      • ถ้ามีลูกบอลติดอยู่กับแป้นอยู่ เมื่อกด spacebar (KeyMapping.LaunchKey ให้ยิงลูกบอลออกไปก่อน ให้ดูตัวอย่างวิธีการยิงลูกบอลจากคลาส MagnetBarType
      • ถ้าไม่มีลูกบอลติดอยู่กับแป้นเลย ให้ยิงลูกกระสุนออกสองลูก
  3. สร้าง Item ชนิดใหม่
    • สร้าง subclass ของ Item สำหรับแทนไอเทมชนิดใหม่ แล้วเขียนเมธอด PutPowerupEffectToBar เพื่อเปลี่ยนรูปแบบของแป้นไปเป็นรูปแบบที่ียิงกระสนุได้ แล้วจึงเขียนเมธอด CancelPowerupEffectToBar เพื่อคืน BarType ใ้ห้เป็น NormalBarType เมื่อหมดเวลา (ดูวิธีจับเวลาได้ที่ MagnetBarType)

อนิเมชันของส่วนประกอบต่างๆ

  • ลูกกระสุน อยู่ที่ไฟล์ BreakoutLib/Content/bullet.anim
  • แป้นเมื่อยิงปืนได้ อยู่ืที่ไฟล์ BreakoutLib/Content/gun_bar_type.anim
  • ไอเทม อยู่ที่ไฟล์ BreakoutLib/Content/gun_item.anim

3. เพิ่มด่าน

สร้างด่านเพิ่มขึ้นอีกสองด่าน โดยทำการสร้าง map ตามรูปแบบที่กำหนดไว้ใน BreakoutMapContentPipeline

แก้ไข PlayScene และส่วนประกอบอื่นๆ ของเกมตามที่จำเป็น เพื่อให้หลังจากจบด่านแรกในเกมแล้ว เกมจะไปเริ่มต้นที่ด่านที่สองโดยอัตโนมัติ และทำเช่นเดียวกันกับด่านที่สาม และเมื่อผู้เล่นผ่านด่านที่สามแล้ว ให้แสดงฉากว่าผู้เล่นได้เคลียร์เกมแล้ว

4. เพิ่มเสียง

5. ทำให้เกมสวยงาม

เปลี่ยนหน้า Title, หน้า Game Over, หน้าจอระหว่างเล่นเกม, ฯลฯ