16 ขั้นตอนในการพัฒนาเกม
ระดับความยาก: เหมาะสำหรับผู้เริ่มต้น
ความรู้พื้นฐาน: เข้าใจพื้นฐานการพัฒนาซอฟต์แวร์แบบเป็นทีม
คุยกันก่อน
การพัฒนาเกมให้สำเร็จสัก 1 เกมนั้นไม่ใช่เรื่องง่ายๆ เลยครับ ยิ่งเป็นการพัฒนาเกมแบบเป็นทีมในระดับมืออาชีพแล้ว ยิ่งเป็นงานที่ยากเย็นแสนเข็ญและหนักหน่วงมากขึ้นไปอีก หลายๆ คนอาจจะสงสัยว่าทีมงานพัฒนาเกมมืออาชีพนั้น เขามีขั้นตอนในการพัฒนาเกมอย่างไรบ้าง ลองมาดู 16 ขั้นตอนต่อไปนี้สิครับ อาจจะช่วยให้คุณเห็นภาพของการพัฒนาเกมแบบเป็นทีมชัดเจนมากยิ่งขึ้น ซึ่งน่าจะมีประโยชน์ในการพัฒนาเกมของเราเองในอนาคต
1. ออกแบบเกมไว้ในใจ
2. เขียนเกมที่ออกแบบไว้ให้เป็นเอกสารการออกแบบ (Design Document)
3. ส่งเอกสารการออกแบบไปให้กับทุกคนในทีม เพื่อทำการแก้ไข, หาข้อผิดพลาด, และเพิ่มเติมรายละเอียดอื่นๆ แล้วส่งกลับมา
4. ออกแบบขั้นสุดท้าย ก่อนที่จะส่งไปเสนอกับนายทุน พยายามรวมเอาโค้ด, ภาพวาดที่ได้จากการออกแบบ, ตัวอย่างเกม, และอื่นๆ เอาไว้ด้วย
5. นั่งเล่น, นอนเล่น, เขียนโค้ดเล่น, หรือทำอะไรก็ได้ระหว่างที่รอคำตอบจากนายทุน
6. ถ้านายทุนส่งเอกสารการออกแบบกลับมาเพื่อให้ทำการปรับปรุง ให้กลับไปที่ข้อ 2
7. หากเกมที่ออกแบบไว้ผ่านการเห็นชอบเบื้องต้นแล้ว สิ่งที่ต้องทำต่อไปก็คือ แผนงานสำหรับค่าใช้จ่ายต่างๆ (ซึ่งจริงๆ แล้วน่าจะทำให้เสร็จเรียบร้อยก่อนจะมาถึงขั้นตอนนี้) เมื่อทำแผนงานสำหรับค่าใช้จ่ายเรียบร้อยแล้ว ให้ส่งข้อมูลทั้งหมดกลับไปให้กับนายทุนอีกครั้ง โดยต้องมีรายชื่อของทีมงาน และน่าจะมีประวัติของทุกคนประกอบไปด้วย มันจะช่วยให้ฝ่ายบริหารสามารถรู้ได้ว่าใครเป็นใครบ้าง
8. รอจนกว่าจะได้รับการเห็นชอบครั้งสุดท้าย ถ้าหากได้รับการปฏิเสธ ก็กลับไปเริ่มที่ข้อ 1 ใหม่อีกครั้ง
9. เมื่อได้รับเงินทุนแล้วก็เริ่มต้นทำงานได้เลย เริ่มจากการออกแบบโค้ดและวางแผนกำหนดตารางการทำงาน กำหนดหน้าที่ความรับผิดชอบของแต่ละคนในทีม และกำหนดเส้นตายสำหรับแต่ละงาน เพื่อให้โครงการสามารถดำเนินไปได้ตามที่กำหนดไว้ในตารางการทำงาน
10. กำหนดให้มีการประชุมอย่างน้อยเดือนละหนึ่งครั้ง และเพิ่มเติมได้อีกตามความจำเป็น การประชุมจะทำให้ทุกคนเข้าใจและมีแนวคิดที่ตรงกัน อย่าคิดว่าทุกคนจะคิดเหมือนกันเสมอ เพราะทุกคนจะมีความคิดที่แตกต่างกันออกไป ถึงแม้ว่าจะคิดเรื่องเดียวกันอยู่ก็ตาม
11. วางแผนสำหรับการสร้างโค้ดไว้ล่วงหน้า และต้องยอมรับความจริงว่าการออกแบบอาจจะเปลี่ยนแปลงได้ วางแผนล่วงหน้าไว้สำหรับการเปลี่ยนแปลง และพยายามทำให้ทุกสิ่งทุกอย่างสามารถยืดหยุ่นได้ มันจะช่วยประหยัดเวลาไปได้มากในระยะยาว แต่จะมีค่าใช้จ่ายเพิ่มขึ้นเล็กน้อยในระยะแรก
12. ทำงานไปเรื่อยๆ จนกระทั่งเข้าสู่ขั้นตอนอัลฟา ในขั้นตอนนี้จะได้ตัวอย่างเกมเบื้องต้นที่สามารถเล่นได้แล้ว สิ่งต่างๆ ที่เป็นพื้นฐานของเกมนั้นถูกตั้งไว้เรียบร้อยแล้ว ถึงแม้ว่าอาจจะไม่ครบจำนวนหรือชนิดตามที่ต้องการ บางที AI ของเกมอาจจะดูโง่ไปสักหน่อย อินเตอร์เฟซส่วนต่างๆ อาจจะเป็นแค่กล่องดำๆ ที่มีตัวหนังสือเขียนทับบอกเอาไว้ให้รู้ว่าอะไรคืออะไร และอาจจะยังไม่มีเสียงประกอบ อย่างไรก็ตาม ในขั้นตอนอัลฟานี้ จะบอกให้รู้ว่าอะไรเป็นอะไร และอย่างน้อยที่สุดมันต้องแสดงให้เห็นถึงพื้นฐานทั้งหมดของเกมได้
13. ทำงานต่อไป โดยที่มุ่งไปยังโครงสร้างของเกม (ไม่ใช่ที่รายละเอียดของเกม) ช่วงนี้น่าจะเป็นงานที่หนักที่สุด ถึงแม้ว่าจะทำมาถูกต้องตั้งแต่เริ่มแรกแล้วก็ตาม แต่อย่าลืมว่าอัลฟานั้น ยังห่างไกลจากเป้าหมายจริงๆ มากนัก ให้สร้างเค้าโครงอย่างหยาบๆ ของเกมขึ้นมา แต่มันต้องมีเสถียรภาพ และสามารถเพิ่มเติมรายละเอียดต่างๆ เช่น ภาพประกอบ เข้าไปได้ในภายหลัง มันจะทำให้งานสามารถดำเนินต่อไปได้ ระหว่างที่รอภาพประกอบจากฝ่ายศิลป์ เพราะอย่างน้อยที่สุด ก็ยังมีตัวอย่างเกมให้ดูและทดสอบ ระหว่างที่กำลังรองานจากฝ่ายศิลป์
14. เมื่อใกล้จะถึงกำหนดเส้นตายของขั้นตอนอัลฟาแล้ว เกมจะต้องทำงานได้ดีและมีเสถียรภาพพอสมควร ในขั้นตอนนี้ ให้ทำการจัดเก็บงานทั้งหมด เพื่อทำการแบ็กอัพเอาไว้ มาถึงขั้นตอนนี้ ก็น่าจะมีความภูมิใจในตัวเองได้ในระดับหนึ่งแล้ว คราวนี้ก็มาวางแผนงานล่วงหน้ากันต่อ เกมในขั้นตอนอัลฟานี้ จะต้องถูกส่งไปให้ใครสักคน (แต่มีจำนวนหลายๆ คน) เพื่อทำการทดสอบ ดังนั้น ให้วางแผนสำหรับการจัดส่งเกมไปยังบุคคลเหล่านี้ด้วย เช่น ต้องมีไฟล์ Readme แนบไปกับอัลฟานี้หรือเปล่า? หรือจะรวมเอาไว้ในไฟล์แบบ Executable ดี? แล้วจะจัดส่งพวกภาพประกอบยังไง? จะส่งเป็นแผ่นซีดีรอมหรือจะส่งเป็นแผ่นดิสก์แบบอื่นดี? แล้วจะบีบข้อมูลไว้ดีไหม? สิ่งต่างๆ เหล่านี้นี่แหละคือสิ่งที่ต้องวางแผนสำหรับการจัดส่ง
15. ผลการทดสอบจากข้อที่แล้วจะถูกนำมาประยุกต์เข้ากับการพัฒนาเกม ให้ทำการแยกแยะส่วนต่างๆ ของเกม แล้วมุ่งเป้าไปที่ส่วนสำคัญของเกม มุ่งเป้าไปยังส่วนที่ผู้เล่นสนใจ หรือได้เห็น บางครั้งก็ต้องตัดบางอย่างที่ต้องการจะทำทิ้งไป หากโดยรวมแล้วมันทำให้เกมดีขึ้น เพราะสุดท้ายผู้เล่นก็จะให้อภัย และลืมในส่วนที่ขาดไปเอง หากนายทุนต้องการที่จะเห็นเกมในช่วงนี้ ก็ใช้เวลาประมาณ 2 สัปดาห์ในการปรับปรุงเกมก่อน แล้วโทรบอกพวกเขาให้มาดู พร้อมกับบอกให้พวกเขารู้ด้วยว่า มีการตัดอะไรออกจากเกม มีอะไรที่เปลี่ยนแปลงไปจากขั้นตอนการออกแบบบ้าง และมีอะไรที่จะปรับปรุงเพิ่มเติมก่อนที่จะเป็นเกมจริงๆ อีกบ้าง อ้อ อย่าลืมถามด้วยว่า พวกเขาต้องการอะไรเพิ่มเติมเป็นพิเศษหรือเปล่า
16. หนึ่งสัปดาห์ก่อนสิ้นสุดขั้นตอนอัลฟา ให้ปิดงานของฝ่ายศิลป์ เว้นแต่ว่ากำลังรองานสำคัญจากฝ่ายศิลป์ การปิดงานฝ่ายศิลป์ ก็เพื่อไม่ให้มีการเปลี่ยนแปลงใดๆ เกิดขึ้นอีก
ส่งท้าย
คงพอจะเห็นภาพรวมๆ ของการพัฒนาเกมกันบ้างนะครับ ทั้ง 16 ขั้นตอนนี้ เป็นการพัฒนาเกมจนถึงขั้นอัลฟา (Alpha) เท่านั้น จริงๆ แล้วยังมีขั้นตอนต่อไปอีกหลายอย่างกว่าจะมาเป็นเบต้า (Beta) รวมทั้งต้องมีการทดสอบแก้ไขอะไรอีกมากมาย กว่าจะออกมาเป็นเกมให้เราได้เล่นกัน หวังว่าบทความนี้คงจะมีประโยชน์กับผู้ที่สนใจจะพัฒนาเกมบ้างนะครับ และหวังว่าเราจะได้เห็น (และได้เล่น) เกมของคนไทยที่มีคุณภาพทัดเทียมกับเกมของต่างประเทศในไม่ช้านี้ สวัสดีครับ
ขอขอบคุณ คุณ FEW
Bitmaps
Bitmap คือคำที่ใช้เรียกข้อมูลภาพที่เก็บอยู่ในหน่วยความจำ
Bitmaps นั้นเป็นภาพที่เก็บในลักษณะ pixel ต่อ pixel โดยเก็บข้อมูลสีของแต่ละ pixel เรียงกันไปในหน่วยความจำ ข้อมูลสีของ pixel จะมีขนาดที่ใช้ในการเก็บขึ้นอยู่กับความละเอียดสีที่ใช้ เช่นถ้าเป็น Bitmap แบบ 256 สี 1 pixel จะมีขนาด 8 bits (8 bits per pixel) (2 กำลัง 8 เป็น 256 สี) ดังนั้น 1 pixel ของ Bitmap 256 สี จะมีขนาด 1 bytes โดยลักษณะของ bitmap 256 สีก็เป็น array ของข้อมูลขนาด 1 byte (char) - ในลักษณะเดียวกัน ถ้าเป็น 32 bits per pixel จะได้ว่า1 pixel มีขนาด 4 byte ต่อ pixel และจะเก็บได้ 2 ยกกำลัง 32 สี
เนื้อที่ที่จะต้องใช้ในการเก็บ Bitmap ในหน่วยความจำ จะเป็นผลคูณของ bytes per pixel, width และ height ของ Bitmap ยกตัวอย่างเช่น Bitmap แบบ 256 สี กว้าง 640 สูง 480 จะมีขนาดประมาณ 640*480*1 bytes
เนื่องจาก Bitmap ที่เก็บอยู่ในหน่วยความจำนั้น จะเป็นข้อมูล pixel เรียงกันไปเรื่อยๆ จนหมดภาพ ดังนั้นจึงต้องมีการกำหนดความกว้างและความยาวของ Bitmap ด้วย เพื่อให้โปรแกรมส่วนที่นำ Bitmap นั้นไปใช้ ทราบว่า Bitmap มีความกว้าง-ยาวเท่าไหร่
Bitmap 256 สี ที่กว้าง 20 pixels สูง 20 pixels นั้น จะได้ว่า byte ที่ 1 ถึง 20 แทนเส้นบนสุดของภาพ, byte ที่ 21 ถึง 30 แทนเส้นที่ 2 ของภาพ ไปเรื่อยๆ
Display Cards
ในการเขียนเกมนั้น เราควรจะเข้าใจการทำงานของการ์ดจอ มาดูกันในมุมมองของเกมโปรแกรมเมอร์นะครับ .. การ์ดจอนั้น จะมีหน่วยความจำของมันอยู่ บางรุ่นอาจจะมี 2 MB, 4 MB หรือ 16 MB หริอมากกว่านั้นก็มี แล้วรู้ไหม ว่าการ์ดจอทำไมต้องมีหน่วยความจำด้วย มันเอาไว้ทำอะไร ?? จริงๆ แล้วเหตุผลหลักที่ต้องมีหน่วยความจำในการ์ดจอ ก็เพื่อให้มันเป็น Display Buffer นั่นคือเป็นที่สำหรับเก็บภาพที่แสดงอยู่บนหน้าจอในเวลานั้นๆ โดยมันจะเก็บในลักษณะ bitmap (อย่างที่อธิบายไปแล้วข้างบน) ไว้ การเขียนบนหน้าจอ จริงๆ แล้วก็คือการเข้าไปเปลี่ยนแปลงค่าในหน่วยความจำส่วน Display Buffer นั่นเอง เมื่อข้อมูลใน Display Buffer เปลี่ยนแปลง ภาพบนหน้าจอก็จะเปลี่ยนตามทันที เหตุผลที่การ์ดจอที่มีหน่วยความจำมากๆ สามารถแสดงผลที่ความละเอียด และจำนวนสีสูงๆ ก็เพราะมีเนื้อที่สำหรับ Display Buffer ขนาดใหญ่กว่า
สำหรับโปรแกรมบางประเภทนั้น จะเขียนภาพโดยการเขียนลงไปที่ Display Buffer ทันที แต่เนื่องจากการเขียนก็คือการ Copy ข้อมูลจากหน่วยความจำที่หนึ่ง (อาจจะเป็นหน่วยความจำเครื่อง หรือหน่วยความจำการ์ดจอ) ไปยังหน่วยความจำส่วนที่เป็น Display Buffer ซึ่งต้องใข้เวลา ดังนั้นบางครั้งการทำงานในส่วนนี้อาจจะช้าจนผู้ใช้สามารถสังเกตุเห็นได้ โดยจะเห็นภาพปรากฎขึ้นบนจอภาพไล่จากบนลงล่างแทนที่จะปรากฎขึ้นมาทันที - ในเกม หรือโปรแกรม multimedia อื่นๆ ที่ต้องการให้การ update หน้าจอเกิดขึ้นอย่างทันทีทันใดนั้น เราไม่ต้องการให้อาการแบบนี้เกิดขึ้น เพราะจะทำให้เห็นว่าการ update หน้าจอช้า จึงใช้วิธีที่เรียกว่า Page Flipping เข้ามาช่วย โดยเขียนข้อมูลภาพลงในหน่วยความจำของการ์ดจออีกส่วนหนึ่งของการ์ดจอ ที่ไม่ใช่ Display Buffer แต่มีขนาดเท่ากับ Display Buffer ก่อน เรียกหน่วยความจำส่วนนี้ว่า Back Buffer พอเขียนข้อมูลที่ Back Buffer เสร็จแล้วจึงสั่งให้การ์ดจอเปลี่ยน Address ของ Display Buffer ใหม่ โดยให้ใช้ Back Buffer เป็น Display Buffer แทน - ดังนั้นข้อมูลที่การ์ดจอใช้เป็น Display Buffer จะเปลี่ยนแบบทันทีทันใด ภาพบนหน้าจอก็จะเปลี่ยนแบบทันทีทันใดเช่นกัน เรียกการกระทำอย่างนี้ว่าการ Flip Page - เมื่อ Flip Page ไปแล้ว Display Buffer อันแรกก็จะใช้เป็น Back Buffer แทน และจะเขียนข้อมูลภาพครั้งต่อไปที่นี่ จากนั้นก็ Flip Page อีกทีนึง วนไปอย่างนี้เรื่อยๆ -
นอกจากการนำหน่วยความจำการ์ดจอมาใช้เป็น Display Buffer และ Back Buffer แล้ว หน่วยความจำของการ์ดจอที่เหลือ จะใช้เป็นที่สำหรับเก็บภาพ bitmap ต่างๆ ที่ใช้ในเกม ที่ใช้หน่วยความจำการ์ดจอในการเก็บ bitmap ที่ใช้ในเกมก็เพราะว่าการ copy ข้อมูล bitmap จากหน่วยความจำในการ์ดจอ ไปไว้ใน Back Buffer ซึ่งอยู่ในหน่วยความจำการ์ดจอเฃ่นกัน ย่อมเร็วกว่าการ copy จากหน่วยความจำหลักของเครื่อง สำหรับเกมที่ใข้ภาพ bitmap เยอะๆ ย่อมต้องการหน่วยความจำมากขึ้น ดังนั้นถ้าการ์ดจอมี RAM มากกว่าก็ย่อมได้เปรียบ โดยปกติสำหรับข้อมูล bitmap ซึ่งใช้เยอะๆ ในเกม จึงต้องใส่ไว้ในหน่วยความจำของการ์ดจอ - เทคโนโลยี AGP เป็นสิ่งที่พยายามเข้ามาแก้ไขปัญหาตรงจุดนี้ โดยเพิ่มความเร็วการขนส่งข้อมูลระหว่างหน่วยความจำหลักของเครื่อง และหน่วยความจำของการ์ดจอ เพื่อให้เกมสามารถเก็บข้อมูล bitmap ไว้ในหน่วยความจำหลักของเครื่องโดยไม่ทำให้เกมช้าลงมาก
Clipping, Color Keying, Alpha Keying, Pallettes
ทั้ง 3 ตัวนี้เป็นศัพท์เกี่ยวกับการใช้ Bitmap ในเกม
Clipping - คือการตัดขอบของภาพเมื่อขอบของมันเลยออกจากหน้าจอ ลองดูจากรูปข้างล่างนี้ โดยปกติถ้าไม่มี clipping แล้ว เราจะไม่สามารถแสดงภาพให้มีส่วนใดส่วนหนึ่งเกินจากขอบของหน้าจอได้เลย โดยอาจจะเกิดอาการแปลกๆ แล้วแต่ระบบที่ใช้อยู่ เช่นถ้าจุด x,y ของภาพติดลบ (น้อยกว่า (0,0) ) ส่วนใหญ่แล้วภาพจะไม่ปรากฎ (เช่นใน DirectX) ในบางครั้งถ้าขอบขวาของภาพอยู่เลยจากขอบขวาของจอ ภาพที่เลยออกมาอาจจะมาโผล่ที่ด้านซ้ายก็ได้ และเหตุผลที่จำเป็นอีกอย่างก็คือ เมื่อต้องการให้มี window ย่อยๆ ในเกม จะให้ภาพที่อยู่ใน window หนึ่ง เลยออกมาในอีก window หนึ่ง ก็คงไม่ได้ สำหรับการทำ clipping นั้นมีหลายวิธี แต่โดยสรุปก็คือการกันไม่ให้มีการเขียน pixel ที่ตำแหน่งเกินจากบริเวณที่ต้องการ
Color Keying - เนื่องจากภาพ bitmap จะเป็นสี่เหลี่ยมเสมอ ดังนั้นถ้าเกิดเราต้องการแสดงรูปที่ไม่ใช่ 4 เหลี่ยมแล้วจะทำยังไง โดยปกติก็จะกำหนดให้สี สีหนึ่งในภาพนั้น เป็นสีที่เราจะไม่เขียน ตัวเขียน bitmap ของเราก็จะคอยตรวจสอบว่าถ้าเจอสีนั้นในภาพ มันก็จะไม่เขียนสีนั้น
Alpha Keying - เป็นวิธีแก้ปัญหาให้แสดงภาพที่ไม่ใช่ 4 เหลี่ยมเหมือน Color Keying แต่บางทีถ้าเราใช้ Color Keying เราต้องเปลืองสีไป 1 สีในภาพนั้น และบางทีการหลีกเลี่ยงสีตอนสร้างรูปภาพมันอาจจะลำบาก ดังนั้นจึงใช้ Alpha Keying โดยเป็นอีกรูปหนึ่ง ที่ใช้แทนว่าใน bitmap นั้นๆ เราต้องการแสดงส่วนไหนออกมาบ้าง
Pallettes - โดยปกติแล้วการใช้ความละเอียดสีแบบ 16 bit,24 bit หรือ 32 bit สีนั้น เราจะแทนค่าสีด้วยค่า RGB ของมัน แต่สำหรับภาพแบบ 256 สีนั้น เนื่องจากจำนวนสีนี้น้อยมาก การแทนด้วยค่า RGB อาจจะทำให้ภาพที่ได้สีเพี้ยนมาก จึงมีการใช้ Pallette สีแทน ซึ่ง Palette สีนั้นจะเก็บตารางของค่าของสีต่างๆ ที่มีการใช้ในภาพนั้น โดยค่าที่เก็บใน Bitmap จะเป็นตัวชี้มายังสีจริงซึ่งอยู่ใน Palette
Input
เกมจะรับคำสั่งของผู้เล่นได้ ก็ต้องใช้ Input สำหรับ Input ของเกมโดยทั่วๆ ไปก็ได้แก่ Mouse, Keyboard และ Joystick หรือ Gamepad การรับข้อมูลจาก Input Device เหล่านี้ในเกม มีหลายวิธี อาจจะใชการ check state ของ Input ว่าขณะนั้นมีการกดปุ่มหรือมีตำแหน่งเป็นเท่าไหร่ ถ้าเป็น DirectX อาจจะใช้ Input Buffer ซึ่งจะคอยบันทึกการเปลี่ยนแปลงของ Input ทุกๆ ครั้ง หรือใน Windows อาจจะใช้ Message ที่ส่งมาให้กับ Window ของเกม คอยตรวจดูว่ามี Message เกี่ยวกับ Input อะไรบ้าง ถ้าใช้ Dos เราอาจจะใช้การทำ Keyboard Interrupt ใหม่เลยก็ได้ จะเห็นได้ว่ามันมีหลายวิธีมาก การเลือกมาใช้ก็แล้วแต่ความเหมาะสมกับเกมนั้นๆ รวมถึง System ที่เกมใช สำหรับรายละเอียดนั้น ผมไม่ขอกล่าวในที่นี้ เพราะจะซ้ำกับบทความที่เกี่ยวกับ DirectInput
ขอขอบคุณ คุณ ปลาดาบ
ระดับความยาก: เหมาะสำหรับผู้เริ่มต้น
ความรู้พื้นฐาน: เข้าใจพื้นฐานการพัฒนาซอฟต์แวร์แบบเป็นทีม
คุยกันก่อน
การพัฒนาเกมให้สำเร็จสัก 1 เกมนั้นไม่ใช่เรื่องง่ายๆ เลยครับ ยิ่งเป็นการพัฒนาเกมแบบเป็นทีมในระดับมืออาชีพแล้ว ยิ่งเป็นงานที่ยากเย็นแสนเข็ญและหนักหน่วงมากขึ้นไปอีก หลายๆ คนอาจจะสงสัยว่าทีมงานพัฒนาเกมมืออาชีพนั้น เขามีขั้นตอนในการพัฒนาเกมอย่างไรบ้าง ลองมาดู 16 ขั้นตอนต่อไปนี้สิครับ อาจจะช่วยให้คุณเห็นภาพของการพัฒนาเกมแบบเป็นทีมชัดเจนมากยิ่งขึ้น ซึ่งน่าจะมีประโยชน์ในการพัฒนาเกมของเราเองในอนาคต
1. ออกแบบเกมไว้ในใจ
2. เขียนเกมที่ออกแบบไว้ให้เป็นเอกสารการออกแบบ (Design Document)
3. ส่งเอกสารการออกแบบไปให้กับทุกคนในทีม เพื่อทำการแก้ไข, หาข้อผิดพลาด, และเพิ่มเติมรายละเอียดอื่นๆ แล้วส่งกลับมา
4. ออกแบบขั้นสุดท้าย ก่อนที่จะส่งไปเสนอกับนายทุน พยายามรวมเอาโค้ด, ภาพวาดที่ได้จากการออกแบบ, ตัวอย่างเกม, และอื่นๆ เอาไว้ด้วย
5. นั่งเล่น, นอนเล่น, เขียนโค้ดเล่น, หรือทำอะไรก็ได้ระหว่างที่รอคำตอบจากนายทุน
6. ถ้านายทุนส่งเอกสารการออกแบบกลับมาเพื่อให้ทำการปรับปรุง ให้กลับไปที่ข้อ 2
7. หากเกมที่ออกแบบไว้ผ่านการเห็นชอบเบื้องต้นแล้ว สิ่งที่ต้องทำต่อไปก็คือ แผนงานสำหรับค่าใช้จ่ายต่างๆ (ซึ่งจริงๆ แล้วน่าจะทำให้เสร็จเรียบร้อยก่อนจะมาถึงขั้นตอนนี้) เมื่อทำแผนงานสำหรับค่าใช้จ่ายเรียบร้อยแล้ว ให้ส่งข้อมูลทั้งหมดกลับไปให้กับนายทุนอีกครั้ง โดยต้องมีรายชื่อของทีมงาน และน่าจะมีประวัติของทุกคนประกอบไปด้วย มันจะช่วยให้ฝ่ายบริหารสามารถรู้ได้ว่าใครเป็นใครบ้าง
8. รอจนกว่าจะได้รับการเห็นชอบครั้งสุดท้าย ถ้าหากได้รับการปฏิเสธ ก็กลับไปเริ่มที่ข้อ 1 ใหม่อีกครั้ง
9. เมื่อได้รับเงินทุนแล้วก็เริ่มต้นทำงานได้เลย เริ่มจากการออกแบบโค้ดและวางแผนกำหนดตารางการทำงาน กำหนดหน้าที่ความรับผิดชอบของแต่ละคนในทีม และกำหนดเส้นตายสำหรับแต่ละงาน เพื่อให้โครงการสามารถดำเนินไปได้ตามที่กำหนดไว้ในตารางการทำงาน
10. กำหนดให้มีการประชุมอย่างน้อยเดือนละหนึ่งครั้ง และเพิ่มเติมได้อีกตามความจำเป็น การประชุมจะทำให้ทุกคนเข้าใจและมีแนวคิดที่ตรงกัน อย่าคิดว่าทุกคนจะคิดเหมือนกันเสมอ เพราะทุกคนจะมีความคิดที่แตกต่างกันออกไป ถึงแม้ว่าจะคิดเรื่องเดียวกันอยู่ก็ตาม
11. วางแผนสำหรับการสร้างโค้ดไว้ล่วงหน้า และต้องยอมรับความจริงว่าการออกแบบอาจจะเปลี่ยนแปลงได้ วางแผนล่วงหน้าไว้สำหรับการเปลี่ยนแปลง และพยายามทำให้ทุกสิ่งทุกอย่างสามารถยืดหยุ่นได้ มันจะช่วยประหยัดเวลาไปได้มากในระยะยาว แต่จะมีค่าใช้จ่ายเพิ่มขึ้นเล็กน้อยในระยะแรก
12. ทำงานไปเรื่อยๆ จนกระทั่งเข้าสู่ขั้นตอนอัลฟา ในขั้นตอนนี้จะได้ตัวอย่างเกมเบื้องต้นที่สามารถเล่นได้แล้ว สิ่งต่างๆ ที่เป็นพื้นฐานของเกมนั้นถูกตั้งไว้เรียบร้อยแล้ว ถึงแม้ว่าอาจจะไม่ครบจำนวนหรือชนิดตามที่ต้องการ บางที AI ของเกมอาจจะดูโง่ไปสักหน่อย อินเตอร์เฟซส่วนต่างๆ อาจจะเป็นแค่กล่องดำๆ ที่มีตัวหนังสือเขียนทับบอกเอาไว้ให้รู้ว่าอะไรคืออะไร และอาจจะยังไม่มีเสียงประกอบ อย่างไรก็ตาม ในขั้นตอนอัลฟานี้ จะบอกให้รู้ว่าอะไรเป็นอะไร และอย่างน้อยที่สุดมันต้องแสดงให้เห็นถึงพื้นฐานทั้งหมดของเกมได้
13. ทำงานต่อไป โดยที่มุ่งไปยังโครงสร้างของเกม (ไม่ใช่ที่รายละเอียดของเกม) ช่วงนี้น่าจะเป็นงานที่หนักที่สุด ถึงแม้ว่าจะทำมาถูกต้องตั้งแต่เริ่มแรกแล้วก็ตาม แต่อย่าลืมว่าอัลฟานั้น ยังห่างไกลจากเป้าหมายจริงๆ มากนัก ให้สร้างเค้าโครงอย่างหยาบๆ ของเกมขึ้นมา แต่มันต้องมีเสถียรภาพ และสามารถเพิ่มเติมรายละเอียดต่างๆ เช่น ภาพประกอบ เข้าไปได้ในภายหลัง มันจะทำให้งานสามารถดำเนินต่อไปได้ ระหว่างที่รอภาพประกอบจากฝ่ายศิลป์ เพราะอย่างน้อยที่สุด ก็ยังมีตัวอย่างเกมให้ดูและทดสอบ ระหว่างที่กำลังรองานจากฝ่ายศิลป์
14. เมื่อใกล้จะถึงกำหนดเส้นตายของขั้นตอนอัลฟาแล้ว เกมจะต้องทำงานได้ดีและมีเสถียรภาพพอสมควร ในขั้นตอนนี้ ให้ทำการจัดเก็บงานทั้งหมด เพื่อทำการแบ็กอัพเอาไว้ มาถึงขั้นตอนนี้ ก็น่าจะมีความภูมิใจในตัวเองได้ในระดับหนึ่งแล้ว คราวนี้ก็มาวางแผนงานล่วงหน้ากันต่อ เกมในขั้นตอนอัลฟานี้ จะต้องถูกส่งไปให้ใครสักคน (แต่มีจำนวนหลายๆ คน) เพื่อทำการทดสอบ ดังนั้น ให้วางแผนสำหรับการจัดส่งเกมไปยังบุคคลเหล่านี้ด้วย เช่น ต้องมีไฟล์ Readme แนบไปกับอัลฟานี้หรือเปล่า? หรือจะรวมเอาไว้ในไฟล์แบบ Executable ดี? แล้วจะจัดส่งพวกภาพประกอบยังไง? จะส่งเป็นแผ่นซีดีรอมหรือจะส่งเป็นแผ่นดิสก์แบบอื่นดี? แล้วจะบีบข้อมูลไว้ดีไหม? สิ่งต่างๆ เหล่านี้นี่แหละคือสิ่งที่ต้องวางแผนสำหรับการจัดส่ง
15. ผลการทดสอบจากข้อที่แล้วจะถูกนำมาประยุกต์เข้ากับการพัฒนาเกม ให้ทำการแยกแยะส่วนต่างๆ ของเกม แล้วมุ่งเป้าไปที่ส่วนสำคัญของเกม มุ่งเป้าไปยังส่วนที่ผู้เล่นสนใจ หรือได้เห็น บางครั้งก็ต้องตัดบางอย่างที่ต้องการจะทำทิ้งไป หากโดยรวมแล้วมันทำให้เกมดีขึ้น เพราะสุดท้ายผู้เล่นก็จะให้อภัย และลืมในส่วนที่ขาดไปเอง หากนายทุนต้องการที่จะเห็นเกมในช่วงนี้ ก็ใช้เวลาประมาณ 2 สัปดาห์ในการปรับปรุงเกมก่อน แล้วโทรบอกพวกเขาให้มาดู พร้อมกับบอกให้พวกเขารู้ด้วยว่า มีการตัดอะไรออกจากเกม มีอะไรที่เปลี่ยนแปลงไปจากขั้นตอนการออกแบบบ้าง และมีอะไรที่จะปรับปรุงเพิ่มเติมก่อนที่จะเป็นเกมจริงๆ อีกบ้าง อ้อ อย่าลืมถามด้วยว่า พวกเขาต้องการอะไรเพิ่มเติมเป็นพิเศษหรือเปล่า
16. หนึ่งสัปดาห์ก่อนสิ้นสุดขั้นตอนอัลฟา ให้ปิดงานของฝ่ายศิลป์ เว้นแต่ว่ากำลังรองานสำคัญจากฝ่ายศิลป์ การปิดงานฝ่ายศิลป์ ก็เพื่อไม่ให้มีการเปลี่ยนแปลงใดๆ เกิดขึ้นอีก
ส่งท้าย
คงพอจะเห็นภาพรวมๆ ของการพัฒนาเกมกันบ้างนะครับ ทั้ง 16 ขั้นตอนนี้ เป็นการพัฒนาเกมจนถึงขั้นอัลฟา (Alpha) เท่านั้น จริงๆ แล้วยังมีขั้นตอนต่อไปอีกหลายอย่างกว่าจะมาเป็นเบต้า (Beta) รวมทั้งต้องมีการทดสอบแก้ไขอะไรอีกมากมาย กว่าจะออกมาเป็นเกมให้เราได้เล่นกัน หวังว่าบทความนี้คงจะมีประโยชน์กับผู้ที่สนใจจะพัฒนาเกมบ้างนะครับ และหวังว่าเราจะได้เห็น (และได้เล่น) เกมของคนไทยที่มีคุณภาพทัดเทียมกับเกมของต่างประเทศในไม่ช้านี้ สวัสดีครับ
ขอขอบคุณ คุณ FEW
Bitmaps
Bitmap คือคำที่ใช้เรียกข้อมูลภาพที่เก็บอยู่ในหน่วยความจำ
Bitmaps นั้นเป็นภาพที่เก็บในลักษณะ pixel ต่อ pixel โดยเก็บข้อมูลสีของแต่ละ pixel เรียงกันไปในหน่วยความจำ ข้อมูลสีของ pixel จะมีขนาดที่ใช้ในการเก็บขึ้นอยู่กับความละเอียดสีที่ใช้ เช่นถ้าเป็น Bitmap แบบ 256 สี 1 pixel จะมีขนาด 8 bits (8 bits per pixel) (2 กำลัง 8 เป็น 256 สี) ดังนั้น 1 pixel ของ Bitmap 256 สี จะมีขนาด 1 bytes โดยลักษณะของ bitmap 256 สีก็เป็น array ของข้อมูลขนาด 1 byte (char) - ในลักษณะเดียวกัน ถ้าเป็น 32 bits per pixel จะได้ว่า1 pixel มีขนาด 4 byte ต่อ pixel และจะเก็บได้ 2 ยกกำลัง 32 สี
เนื้อที่ที่จะต้องใช้ในการเก็บ Bitmap ในหน่วยความจำ จะเป็นผลคูณของ bytes per pixel, width และ height ของ Bitmap ยกตัวอย่างเช่น Bitmap แบบ 256 สี กว้าง 640 สูง 480 จะมีขนาดประมาณ 640*480*1 bytes
เนื่องจาก Bitmap ที่เก็บอยู่ในหน่วยความจำนั้น จะเป็นข้อมูล pixel เรียงกันไปเรื่อยๆ จนหมดภาพ ดังนั้นจึงต้องมีการกำหนดความกว้างและความยาวของ Bitmap ด้วย เพื่อให้โปรแกรมส่วนที่นำ Bitmap นั้นไปใช้ ทราบว่า Bitmap มีความกว้าง-ยาวเท่าไหร่
Bitmap 256 สี ที่กว้าง 20 pixels สูง 20 pixels นั้น จะได้ว่า byte ที่ 1 ถึง 20 แทนเส้นบนสุดของภาพ, byte ที่ 21 ถึง 30 แทนเส้นที่ 2 ของภาพ ไปเรื่อยๆ
Display Cards
ในการเขียนเกมนั้น เราควรจะเข้าใจการทำงานของการ์ดจอ มาดูกันในมุมมองของเกมโปรแกรมเมอร์นะครับ .. การ์ดจอนั้น จะมีหน่วยความจำของมันอยู่ บางรุ่นอาจจะมี 2 MB, 4 MB หรือ 16 MB หริอมากกว่านั้นก็มี แล้วรู้ไหม ว่าการ์ดจอทำไมต้องมีหน่วยความจำด้วย มันเอาไว้ทำอะไร ?? จริงๆ แล้วเหตุผลหลักที่ต้องมีหน่วยความจำในการ์ดจอ ก็เพื่อให้มันเป็น Display Buffer นั่นคือเป็นที่สำหรับเก็บภาพที่แสดงอยู่บนหน้าจอในเวลานั้นๆ โดยมันจะเก็บในลักษณะ bitmap (อย่างที่อธิบายไปแล้วข้างบน) ไว้ การเขียนบนหน้าจอ จริงๆ แล้วก็คือการเข้าไปเปลี่ยนแปลงค่าในหน่วยความจำส่วน Display Buffer นั่นเอง เมื่อข้อมูลใน Display Buffer เปลี่ยนแปลง ภาพบนหน้าจอก็จะเปลี่ยนตามทันที เหตุผลที่การ์ดจอที่มีหน่วยความจำมากๆ สามารถแสดงผลที่ความละเอียด และจำนวนสีสูงๆ ก็เพราะมีเนื้อที่สำหรับ Display Buffer ขนาดใหญ่กว่า
สำหรับโปรแกรมบางประเภทนั้น จะเขียนภาพโดยการเขียนลงไปที่ Display Buffer ทันที แต่เนื่องจากการเขียนก็คือการ Copy ข้อมูลจากหน่วยความจำที่หนึ่ง (อาจจะเป็นหน่วยความจำเครื่อง หรือหน่วยความจำการ์ดจอ) ไปยังหน่วยความจำส่วนที่เป็น Display Buffer ซึ่งต้องใข้เวลา ดังนั้นบางครั้งการทำงานในส่วนนี้อาจจะช้าจนผู้ใช้สามารถสังเกตุเห็นได้ โดยจะเห็นภาพปรากฎขึ้นบนจอภาพไล่จากบนลงล่างแทนที่จะปรากฎขึ้นมาทันที - ในเกม หรือโปรแกรม multimedia อื่นๆ ที่ต้องการให้การ update หน้าจอเกิดขึ้นอย่างทันทีทันใดนั้น เราไม่ต้องการให้อาการแบบนี้เกิดขึ้น เพราะจะทำให้เห็นว่าการ update หน้าจอช้า จึงใช้วิธีที่เรียกว่า Page Flipping เข้ามาช่วย โดยเขียนข้อมูลภาพลงในหน่วยความจำของการ์ดจออีกส่วนหนึ่งของการ์ดจอ ที่ไม่ใช่ Display Buffer แต่มีขนาดเท่ากับ Display Buffer ก่อน เรียกหน่วยความจำส่วนนี้ว่า Back Buffer พอเขียนข้อมูลที่ Back Buffer เสร็จแล้วจึงสั่งให้การ์ดจอเปลี่ยน Address ของ Display Buffer ใหม่ โดยให้ใช้ Back Buffer เป็น Display Buffer แทน - ดังนั้นข้อมูลที่การ์ดจอใช้เป็น Display Buffer จะเปลี่ยนแบบทันทีทันใด ภาพบนหน้าจอก็จะเปลี่ยนแบบทันทีทันใดเช่นกัน เรียกการกระทำอย่างนี้ว่าการ Flip Page - เมื่อ Flip Page ไปแล้ว Display Buffer อันแรกก็จะใช้เป็น Back Buffer แทน และจะเขียนข้อมูลภาพครั้งต่อไปที่นี่ จากนั้นก็ Flip Page อีกทีนึง วนไปอย่างนี้เรื่อยๆ -
นอกจากการนำหน่วยความจำการ์ดจอมาใช้เป็น Display Buffer และ Back Buffer แล้ว หน่วยความจำของการ์ดจอที่เหลือ จะใช้เป็นที่สำหรับเก็บภาพ bitmap ต่างๆ ที่ใช้ในเกม ที่ใช้หน่วยความจำการ์ดจอในการเก็บ bitmap ที่ใช้ในเกมก็เพราะว่าการ copy ข้อมูล bitmap จากหน่วยความจำในการ์ดจอ ไปไว้ใน Back Buffer ซึ่งอยู่ในหน่วยความจำการ์ดจอเฃ่นกัน ย่อมเร็วกว่าการ copy จากหน่วยความจำหลักของเครื่อง สำหรับเกมที่ใข้ภาพ bitmap เยอะๆ ย่อมต้องการหน่วยความจำมากขึ้น ดังนั้นถ้าการ์ดจอมี RAM มากกว่าก็ย่อมได้เปรียบ โดยปกติสำหรับข้อมูล bitmap ซึ่งใช้เยอะๆ ในเกม จึงต้องใส่ไว้ในหน่วยความจำของการ์ดจอ - เทคโนโลยี AGP เป็นสิ่งที่พยายามเข้ามาแก้ไขปัญหาตรงจุดนี้ โดยเพิ่มความเร็วการขนส่งข้อมูลระหว่างหน่วยความจำหลักของเครื่อง และหน่วยความจำของการ์ดจอ เพื่อให้เกมสามารถเก็บข้อมูล bitmap ไว้ในหน่วยความจำหลักของเครื่องโดยไม่ทำให้เกมช้าลงมาก
Clipping, Color Keying, Alpha Keying, Pallettes
ทั้ง 3 ตัวนี้เป็นศัพท์เกี่ยวกับการใช้ Bitmap ในเกม
Clipping - คือการตัดขอบของภาพเมื่อขอบของมันเลยออกจากหน้าจอ ลองดูจากรูปข้างล่างนี้ โดยปกติถ้าไม่มี clipping แล้ว เราจะไม่สามารถแสดงภาพให้มีส่วนใดส่วนหนึ่งเกินจากขอบของหน้าจอได้เลย โดยอาจจะเกิดอาการแปลกๆ แล้วแต่ระบบที่ใช้อยู่ เช่นถ้าจุด x,y ของภาพติดลบ (น้อยกว่า (0,0) ) ส่วนใหญ่แล้วภาพจะไม่ปรากฎ (เช่นใน DirectX) ในบางครั้งถ้าขอบขวาของภาพอยู่เลยจากขอบขวาของจอ ภาพที่เลยออกมาอาจจะมาโผล่ที่ด้านซ้ายก็ได้ และเหตุผลที่จำเป็นอีกอย่างก็คือ เมื่อต้องการให้มี window ย่อยๆ ในเกม จะให้ภาพที่อยู่ใน window หนึ่ง เลยออกมาในอีก window หนึ่ง ก็คงไม่ได้ สำหรับการทำ clipping นั้นมีหลายวิธี แต่โดยสรุปก็คือการกันไม่ให้มีการเขียน pixel ที่ตำแหน่งเกินจากบริเวณที่ต้องการ
Color Keying - เนื่องจากภาพ bitmap จะเป็นสี่เหลี่ยมเสมอ ดังนั้นถ้าเกิดเราต้องการแสดงรูปที่ไม่ใช่ 4 เหลี่ยมแล้วจะทำยังไง โดยปกติก็จะกำหนดให้สี สีหนึ่งในภาพนั้น เป็นสีที่เราจะไม่เขียน ตัวเขียน bitmap ของเราก็จะคอยตรวจสอบว่าถ้าเจอสีนั้นในภาพ มันก็จะไม่เขียนสีนั้น
Alpha Keying - เป็นวิธีแก้ปัญหาให้แสดงภาพที่ไม่ใช่ 4 เหลี่ยมเหมือน Color Keying แต่บางทีถ้าเราใช้ Color Keying เราต้องเปลืองสีไป 1 สีในภาพนั้น และบางทีการหลีกเลี่ยงสีตอนสร้างรูปภาพมันอาจจะลำบาก ดังนั้นจึงใช้ Alpha Keying โดยเป็นอีกรูปหนึ่ง ที่ใช้แทนว่าใน bitmap นั้นๆ เราต้องการแสดงส่วนไหนออกมาบ้าง
Pallettes - โดยปกติแล้วการใช้ความละเอียดสีแบบ 16 bit,24 bit หรือ 32 bit สีนั้น เราจะแทนค่าสีด้วยค่า RGB ของมัน แต่สำหรับภาพแบบ 256 สีนั้น เนื่องจากจำนวนสีนี้น้อยมาก การแทนด้วยค่า RGB อาจจะทำให้ภาพที่ได้สีเพี้ยนมาก จึงมีการใช้ Pallette สีแทน ซึ่ง Palette สีนั้นจะเก็บตารางของค่าของสีต่างๆ ที่มีการใช้ในภาพนั้น โดยค่าที่เก็บใน Bitmap จะเป็นตัวชี้มายังสีจริงซึ่งอยู่ใน Palette
Input
เกมจะรับคำสั่งของผู้เล่นได้ ก็ต้องใช้ Input สำหรับ Input ของเกมโดยทั่วๆ ไปก็ได้แก่ Mouse, Keyboard และ Joystick หรือ Gamepad การรับข้อมูลจาก Input Device เหล่านี้ในเกม มีหลายวิธี อาจจะใชการ check state ของ Input ว่าขณะนั้นมีการกดปุ่มหรือมีตำแหน่งเป็นเท่าไหร่ ถ้าเป็น DirectX อาจจะใช้ Input Buffer ซึ่งจะคอยบันทึกการเปลี่ยนแปลงของ Input ทุกๆ ครั้ง หรือใน Windows อาจจะใช้ Message ที่ส่งมาให้กับ Window ของเกม คอยตรวจดูว่ามี Message เกี่ยวกับ Input อะไรบ้าง ถ้าใช้ Dos เราอาจจะใช้การทำ Keyboard Interrupt ใหม่เลยก็ได้ จะเห็นได้ว่ามันมีหลายวิธีมาก การเลือกมาใช้ก็แล้วแต่ความเหมาะสมกับเกมนั้นๆ รวมถึง System ที่เกมใช สำหรับรายละเอียดนั้น ผมไม่ขอกล่าวในที่นี้ เพราะจะซ้ำกับบทความที่เกี่ยวกับ DirectInput
ขอขอบคุณ คุณ ปลาดาบ