เรื่องวุ่น ๆ กับตัวหนังสือ – ตอนที่ 5 – วาดตัวหนังสือแบบ Tile-Base

สมัยนี้หลาย ๆ คนอาจจะคิดว่าเราคงไม่ได้เขียนเกมแบบ Tile Base แท้ ๆ กันแล้ว ซึ่งก็คงจะจริงเพราะว่าส่วนใหญ่เราจะใช้การวาดกราฟิคแบบ 3D กันหมดแล้ว (ผ่าน OpenGL หรือ API อะไรก็แล้วแต่) แต่ผมว่าเรื่อง Tile Base เนี่ยมันน่าสนใจนะครับ แล้วมันก็คลาสสิคด้วย image ภาพข้างบนผมจับมาจากเกมที่ชื่อว่า Lufia II : Sin of Sinistral ซึ่งเป็นภาคแปลจากเกมที่ชื่อว่า Espolis Biography II … เกมนี้เป็นเกมที่ผมชอบมากเมื่อสมัยเด็ก ๆ เพราะเป็นเกมที่ต้องใช้ความคิดในการแก้ปริศนาเยอะมาก (ยากด้วย) ปัจจุบันมีการ Remake เกมนี้ขึ้นมาใหม่ กลายเป็น Lufia ภาคแรกไป (เพราะเนื้อเรื่องภาคนี้จะอยู่ก่อนหน้าอีกภาคนึง) ซึ่งไม่สนุกเหมือนตัวเก่า แต่ก็ออกมาแล้วหายคิดถึงไปเยอะเลย นอกเรื่องมาไกล อยากให้สังเกตความเป็น Tile ของเกมน่ะครับ สำหรับเครื่องเกมในอดีต ถ้าเป็นของ Nintendo ก็นับตั้งแต่ Famicom ขึ้นมา ยันเครื่อง DS จะเป็นเครื่องที่รองรับการทำ Tile ในระดับฮาร์ดแวร์ ซึ่งทางนินเทนโดเองจะเรียกว่า Character ที่เรียกแบบนี้ก็เพราะจริง ๆ แล้วเรากำลังเขียนเกมอยู่บน Text Mode ที่สวยขึ้นมาอีกหน่อยเท่านั้นเอง ที่ว่าเป็น Tile Base System ตั้งแต่ระดับ Hardware ก็คือตัว Hardware จะมีหน่วยความจำพิเศษสำหรับเก็บข้อมูล Tile และหน่วยความจำพิเศษอีกส่วนนึงที่เก็บข้อมูลกราฟิคบนจอ โดยจะเก็บเป็น aray ของ index ของ Tile ดังนั้นเราจะไม่มีทางที่จะวาดภาพบนจอภาพแบบระบุพิกัดเป็น Pixel ได้ นั่นคือที่มาว่าทำไมเกมสมัยก่อนจึงเป็นตารางครับ กลับมาเข้าเรื่องของเรากัน จากภาพข้างบนเราจะเห็นว่ามีการแสดงผลข้อความที่เขียนว่า “Ta-daaa! It’s fish pot pie made of ‘navaroa’, the phantom fish!” นะครับ ผมคิดว่าคุณอาจจะคิดว่าข้อความนี้เก็บข้อมูลเป็นระหัส ASCII ซึ่งผมยืนยันได้เลยว่า “ไม่ใช่” ในระบบแบบ Tile-base เนี่ย เราจะมองว่า ช่องไหนใช้ tile index ที่เท่าไหร่ การที่จะต้องเสียพื้นที่เก็บข้อมูลสำหรับ Tile โดยใช้ ASCII Code เนี่ย ไม่ Efficient เพราะว่า ASCII Code มีโค๊ดบางส่วนที่ไม่มีการแสดงผล การที่จะต้องเก็บข้อมูลว่าง ๆ ลงไปใน Tileset นั้นทำให้เสียพื้นที่ที่น้อยนิดไปอย่างฟรี ๆ ดังนั้น Encoding ที่ใช้นั้นจะเป็น Encoding ที่สร้างขึ้นมาใหม่ครับ (ผมเข้าใจว่ามี Tool ที่มาช่วยตรงนี้อยู่แล้ว) อีกอย่างนึง อยากให้ดูโครงสร้างการเก็บข้อมูลหน้าจอของอุปกรณ์ประเภทนี้ สมมติว่า บัฟเฟอร์การแสดงผลของเรานั้นสามารถแสดงผลได้ 6464 tile บนหน้าจอ มันจะเก็บข้อมูลแบบนี้ครับ BYTE dispBuffer[6464]; // 4096 tile

image นั่นก็คือ ถ้าเราต้องการจะวาดตัวหนังสือให้อยู่ตรงกลาง เราจำเป็นจะต้องใส่รหัสพิเศษระหว่างตัวอักษรเพื่อจัดตำแหน่งให้ตัวหนังสือมันมาอยู่ตรงกลาง ในตำแหน่งที่เราต้องการด้วย และสุดท้ายสังเกตตัวอักษรให้ดี ๆ นะครับ image สังเกตมั้ยว่าด้านสูงกับด้านกว้างของตัวอักษรไม่เท่ากัน จริง ๆ แล้วในแต่ละตัวอักษรมันเป็นสอง Tile ประกบกันบนล่างครับ image วิธีการใช้การประกบบนล่างแบบนี้จริง ๆ ก็มีข้อดีอย่างนึงคือ บาง Tile ก็ประหยัดได้ อย่าง ตัว i กับตัว j เนี่ย มันจะต่างกันแค่ด้านล่างใช่มั้ยครับ ถ้าด้านบนใช้ tile เดียวกัน ก็ประหยัดไปได้ 1 tile (ตัว h กับ n ก็ได้อีกคู่นะ) และถ้าจะทำจริง ๆ เราสามารถทำให้บางตัวอักษรกว้างสองช่องก็ทำได้ครับ แต่พอดีผมหาตัวอย่างไม่เจอน่ะ วันนี้พูดแค่ผ่าน ๆ ก็คงพอ เพราะว่าเราคงไม่ได้ใช้ tile-base แท้ ๆ กันสักเท่าไหร่แล้ว คราวต่อไปจะพูดถึงการวาดตัวอักษรแบบที่เป็น raster จริง ๆ แล้วครับ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

This site uses Akismet to reduce spam. Learn how your comment data is processed.