วันนี้จะเป็นอีกวันที่จะพูดร่ายยาวโดยที่ไม่มีโค๊ด 😛

เมื่อก่อน สัก 7-8 ปีที่แล้ว ในขณะนั้นจอ CRT ยังคงได้รับความนิยม เวลาเล่นเกม 2D เวลาเข้าโหมด Full Screen เกมจะทำการเปลี่ยนความละเอียดของหน่วยแสดงผลให้เป็นความละเอียดที่เกมเราใช้ ซึ่งจอ CRT นั้นสามารถรองรับความละเอียดของหน่วยแสดงผลได้หลากหลาย (อันเนื่องมาจากกลไกการแสดงผล)

มาในวันนี้ วันที่พวกเราใช้จอ LCD สุดหรู คนเขียนเกม 2D จะประสพปัญหาปวดหัวมากมาย ดังนี้

  1. ความละเอียดของจอ LCD ที่จะตายตัวเสมอ ถึงแม้ว่าเกมเราจะเปลี่ยนความละเอียดให้ต่ำกว่าได้ แต่ Output ที่ได้จะไม่สามารถคาดเดาได้ (และมักจะแย่เสมออย่างไม่ทราบสาเหตุ) เช่น อาจจะแสดงผลไม่เต็มจอ อาจจะแสดงผลเต็มจอแต่ภาพดูแย่ หรือแม้กระทั่งไม่สามารถให้ความละเอียดนี้ได้เลย
  2. Aspect Ratio ที่แตกต่างกันในแต่ละจอ ทุกวันนี้ นอกจาก 4:3 แล้ว เรามี 5:4, 16:9, 16:10, และอื่น ๆ อีก ... ถ้าเกิดความละเอียดที่เราใช้มันมี Ratio ที่แตกต่างกับจอ ภาพที่ได้ อาจะยืด อาจจะมีขอบดำ หรือไม่สามารถแสดงผลได้เลยก็ได้

ทีนี้เรารู้อยู่แล้วว่าการใช้จอ LCD นั้นสร้างปัญหาให้กับเรานักพัฒนา และ การบังคับให้กลับไปใช้จอ CRT นั้นเป็นเรื่องเป็นไปไม่ได้ เราก็ต้องเลือกที่จะอยู่กับมันโดยที่อย่างน้อยเราสามารถกำหนดพฤติกรรมของโปรแกรมเมื่อความละเอียดที่เราจะใช้แตกต่างจากความละเอียดของจอ

วิธีการจริง ๆ ก็ง่าย ๆ แต่บอกก่อนว่ากินแรงเครื่องระดับนึง ... ก็คือ ... ใช้ Feature ของ API 3D ที่เรียกว่า Render-To-Texture หรือ Render-To-Surface โดยสร้าง Surface ขนาดตายตัวเท่ากับ Resolution ของเกมเรา เวลาเราจะวาดอะไรเราก็จะวาดลงบน Surface อันนี้ แล้วจากนั้นก็วาด Surface นี้ขึ้นบนจออีกต่อนึง ...

เวลาที่วาด Surface นี้ขึ้นบนจอ เราสามารถกำหนดพฤติกรรมบางอย่างได้ เช่น กำหนดให้ขนาดของ Surface บนจอนั้นถูกยืดให้พอดีกับขอบจอโดยไม่ให้เสีย Aspect Ratio กำหนดวิธีการยืดภาพ (เช่น Bilinear, Trilinear) เป็นต้น เพื่อที่เราจะสามารถควบคุมว่าคุณภาพของภาพจะดีหรือแย่อย่างไร แทนที่จปล่อยให้ตัวจอเป็นตัวจัดการ

ข้อเสียหลัก ๆ คือ Performance น่ะล่ะครับ ...

ลองเล่นดูนะ

ทดสอบ Vocaloid 2 สองตัว (มิกุ กับ ริน) ดูว่าตัวไหนน่าจะเวิร์คกว่ากันสำหรับเพลงนี้ Yuuki no Kamisama (เป็น OP เกม Tokimeki Memorial 2 ... สิบปีแล้วเนอะ ??)

ลองดู!
มิกุ
test1

ริน
test2

4

โปรแกรมนี้เป็นโปรแกรมตีกลอง เขียนด้วย SDL เป็นตัวจัดการด้านกราฟิคและส่วนประกอบอื่น ๆ (เนื่องจากผมขี้เกียจเปิดหนังสือ Win32 นั่นเอง) และส่วนที่เกี่ยวกับเสียงทั้งหมดจะเป็น OpenAL ครับ ผมเขียนขึ้นมาเป็น Concept Prove ดูว่าถ้าทำขึ้นมาจริง ๆ มันจะเล่นได้มั้ย

OpenAL ก็คล้าย ๆ กับ OpenGL แต่เป็นเรื่องเสียงครับ ประวัติศาสตร์ของมันเป็นไงก็ไปหาอ่านเองนะ (ฮา) ที่แน่ๆ คือวิธีใช้มันใกล้เคียงกับ OpenGL มาก ๆ แต่มีเรื่อง Device กับ Device Context เพิ่มขึ้นมา OpenAL เป็นระบบเสียงสามมิติโดยกำเนิด ดังนั้นโปรแกรมนี้ก็จะเป็นระเบบเสียงสามมิติเช่นกันครับ จะฟังออกเลยว่าเสียงไหนอยู่ตรงไหน ถ้าใช้หูฟังดี ๆ นะ

ผมเพิ่มความน่าสนใจเข้าไปอีกหน่อยโดยการใส่เอฟเฟค Reverb เข้าไป ซึ่งตัว OpenAL Effect Extension นั้นจะเป็นรูปแบบ Send/Return เหมือนกับพวกโปรแกรมทำเพลงอยู่แล้ว และ Reverb ตัวนี้เสียงเข้าท่าทีเดียว (ขอเตือนก่อนว่า ท่านใดที่เครื่องไม่รองรับ Effect Extension จะรันไม่ขึ้นนะครับ ... คือผมขี้เกียจเช็คเงื่อนไขน่ะ 555 แหมเอาแค่ทดลองเฉย ๆ เอง)

โปรแกรมนี้ทำงานง่าย ๆ ก็คือ พอมี Event กดคีย์บอร์ดปุ๊บ ก็ไปเล่นเสียงปั๊บ ง่ายมาก ๆ ใช่มั้ยครับ โดยโปรแกรมนี้ปัจจุบันจะใช้ทั้งหมด 8 เสียง คือ เบสดรัม แสนร์ดรัม ทอมทอม ฟลอร์ทอม ไฮแฮทปิด-เปิด ไรด์ แล้วก็ แครช ครับ อิอิ (ขี้เกียจเปลี่ยนภาษาอีกแล้ว) มีจุดสำคัญตรงที่ ไฮแฮทปิดกับเปิดนั้น ต้องไม่เล่นพร้อม ๆ กัน ต้องหยุดเสียงใดเสียงนึงก่อนที่จะเล่นอีกเสียง ไม่งั้นมันจะฟังประหลาดครับ

หน้าตามันตอนนี้ไม่มีอะไรเลย (เนื่องจากขี้เกียจอีกแล้ว) เป็นหน้าต่างดำ ๆ ก็ปล่อยมันไว้งั้นแหละ

ปุ่มที่ใช้มีดังนี้ครับ
Bass Drum - Space Bar
Snare Drum - f หรือ j
Closed Hi-Hat - g หรือ h
Opened Hi-Hat - t หรือ y
Tom Tom - d หรือ k
Floor Tom - s หรือ l
Ride Cym - r หรือ u
Crash Cym - e หรือ i

ลองเล่น ๆ ดูนะครับ ก่อนจะเล่นคุณจะต้องลง OpenAL Runtime ก่อนนะครับ แล้วก็ต้องมี Microsoft Visual C++ 2008 Redistributable Package (เพราะผมเขียนด้วย VC 2008 ครับ) สำหรับคนที่เล่นเกม ส่วนใหญ่น่าจะมีทั้งสองตัวนี้อยู่แล้วครับ (มันมากับหลายเกมมาก ๆ ) ส่วนอีกสองไฟล์ที่ต้องใช้ (SDL.dll กับ alut.dll) ผมติดมาให้แล้ว เผื่อว่าไม่มีครับ

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

สิ่งที่ผมทดลองตรงนี้ มีดังนี้ครับ

  • ทดสอบว่า การวางปุ่มแบบนี้มันเล่นถนัดมั้ย ?
  • เช็คเรื่อง Latency ของ OpenAL ว่ามันเยอะขนาดเล่นไม่ได้เลยหรือไม่
  • ระบบเสียง 3มิติ และ เอฟเฟค reverb ว่าเป็นยังไง

ซึ่งกับเครื่องผมนี่ ให้ผลที่น่าพอใจมาก ๆ ครับ สำหรับท่านที่โหลดไปลอง จะให้คอมเม้นท์ในสามเรื่องนี้ด้วยก็ดีนะครับ 😀

ปล. อันนี้ไม่มีโค๊ดให้ อย่าเอาไปเลย ยังเละอยู่ ...