<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Playground-Soft.Com</title>
	<atom:link href="http://playground-soft.com/wordpress/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://playground-soft.com/wordpress</link>
	<description>My Digital Playground</description>
	<lastBuildDate>Tue, 07 Feb 2012 06:07:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Debug โปรแกรมของ Android บน x86 VM (VirtualBox)</title>
		<link>http://playground-soft.com/wordpress/?p=383</link>
		<comments>http://playground-soft.com/wordpress/?p=383#comments</comments>
		<pubDate>Tue, 07 Feb 2012 05:47:48 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[Android Dev]]></category>
		<category><![CDATA[จิปาถะ]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=383</guid>
		<description><![CDATA[โดยปรกติแล้ว เวลาที่จะ debug โปรแกรมของ Android เราจะมีสองทางเลือก ระหว่าง 1.    Deploy บนเครื่องจริง 2.    กับ ใช้ Android Virtual Device ซึ่งทั้งสองทางเลือกนั้นต่างก็มีข้อเสีย ในขณะที่เครื่องจริงนั้นเราอาจจะไม่ได้อยากพกไปด้วย (เกะกะ) แถมต้องต่อสายมากมาย ส่วน AVD นั้นก็อืดอภิมหาอืด หลังจากที่หาวิธี Debug ที่สะดวกกว่าการใช้อุปกรณ์จริง แต่ก็ทำได้งานได้เร็วพอที่จะใช้งานได้จริง (เพราะโน๊ตบุ๊คผมนั้นมันอืดเป็นปรกติอยู่แล้ว พอรัน AVD เข้าไปก็จะยิ่งอืดเข้าไปอีก) ก็พบว่ามีอีกวิธีนึงก็คือการรัน Android บน x86-based Virtual Machine โดยอาจจะเป็น VMWare หรือ Oracle VirtualBox &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=383">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: 10pt;">โดยปรกติแล้ว เวลาที่จะ </span>debug <span style="font-size: 10pt;">โปรแกรมของ </span>Android <span style="font-size: 10pt;">เราจะมีสองทางเลือก ระหว่าง</span></p>
<p>1.    Deploy <span style="font-size: 10pt;">บนเครื่องจริง</span></p>
<p>2.    <span style="font-size: 10pt;">กับ ใช้ </span>Android Virtual Device</p>
<p><span style="font-size: 10pt;">ซึ่งทั้งสองทางเลือกนั้นต่างก็มีข้อเสีย ในขณะที่เครื่องจริงนั้นเราอาจจะไม่ได้อยากพกไปด้วย (เกะกะ) แถมต้องต่อสายมากมาย ส่วน </span>AVD <span style="font-size: 10pt;">นั้นก็อืดอภิมหาอืด</span></p>
<p><span style="font-size: 10pt;">หลังจากที่หาวิธี </span>Debug <span style="font-size: 10pt;">ที่สะดวกกว่าการใช้อุปกรณ์จริง แต่ก็ทำได้งานได้เร็วพอที่จะใช้งานได้จริง (เพราะโน๊ตบุ๊คผมนั้นมันอืดเป็นปรกติอยู่แล้ว พอรัน </span>AVD <span style="font-size: 10pt;">เข้าไปก็จะยิ่งอืดเข้าไปอีก) ก็พบว่ามีอีกวิธีนึงก็คือการรัน </span>Android <span style="font-size: 10pt;">บน </span>x86-based Virtual Machine <span style="font-size: 10pt;">โดยอาจจะเป็น </span>VMWare <span style="font-size: 10pt;">หรือ </span>Oracle VirtualBox <span style="font-size: 10pt;">หรืออื่น ๆ ก็ได้</span></p>
<p><span style="font-size: 10pt;">ตัว </span>AndroidOS <span style="font-size: 10pt;">นั้น จริง ๆ แล้วถูกออกแบบมาให้รันโดยไม่อ้างอิงกับสถาปัตยกรรมของระบบที่รันอยู่อยู่แล้ว แต่เนื่องจากว่าอุปกรณ์ที่เป็น </span>Android <span style="font-size: 10pt;">ส่วนใหญ่นั้นจะทำงานอยู่บนสถาปัตยกรรมของ </span>ARM <span style="font-size: 10pt;">ดังนั้นการที่จะเอามาทำงานบน </span>x86<span style="font-size: 10pt;"> ก็มีความท้าทายอยู่ในระดับนึง โชคดีที่เรามีคนที่กำลังทำงานอยู่กับมันอยู่แล้ว นั่นก็คือโครงการ </span>Android-x86</p>
<p><span style="font-size: 10pt;">เราสามารถเอา </span>iso <span style="font-size: 10pt;">จากเวปไซท์ </span>Android-x86<span style="font-size: 10pt;"> มาติดตั้งลงบน </span>Virtual Machine <span style="font-size: 10pt;">ได้เลย แต่ว่า ปัญหาคือ </span>Android <span style="font-size: 10pt;">นั้นออกแบบมาสำหรับโทรศัพท์มือถือ/แท๊บเบล็ต และ โทรศัพท์มือถือเกือบทั้งหมดไม่มีพอร์ท </span>Ethernet <span style="font-size: 10pt;">ซึ่ง </span>VM <span style="font-size: 10pt;">ส่วนใหญ่จะใช้พอร์ทนี้ในการเชื่อมต่อกับเครื่อง </span>Host <span style="font-size: 10pt;">ดังนั้นเราจึง </span>Debug <span style="font-size: 10pt;">ไม่ได้&#8230; สำหรับ </span>Android-x86<span style="font-size: 10pt;"> นั้นมีการเพิ่มส่วนการรองรับ </span>Ethernet <span style="font-size: 10pt;">เข้ามาก็จริง แต่ก็ยังไม่รองรับ </span>Android 3 (Honeycomb) <span style="font-size: 10pt;">และ </span>Android 4.0 (Ice Cream Sandwich)</p>
<p><span style="font-size: 10pt;">แต่เรายังมีความหวังอีกทาง เมื่อมีอีกหน่อนึงพยายามที่จะทำให้ </span>Android AOSP <span style="font-size: 10pt;">นั้นทำงานได้บน </span>Oracle VirtualBox <span style="font-size: 10pt;">หนุ่มรายนี้ชื่อนาย </span>Dan <span style="font-size: 10pt;">แห่งเวป </span>BuilDroid<span style="font-size: 10pt;"> ซึ่งเจ้าหนุ่มคนนี้นั้นสามารถทำให้ </span>Android 4 AOSP <span style="font-size: 10pt;">นั้นสามารถรันบน </span>VirtualBox <span style="font-size: 10pt;">ได้แล้ว <a href="file:///C:\Users\Noom\AppData\Roaming\Microsoft\Word\(แต่ยังไม่สมบูรณ์)">(แต่ยังไม่สมบูรณ์)</a> ส่วนตัวผมยังคงโชคร้าย หลังจากที่ลองดาวน์โหลดมาใช้แล้วก็พบว่าเกิด </span>Kernel Panic <span style="font-size: 10pt;">ระหว่างการบูท สันนิษฐานว่าผมใช้ เครื่องที่ใช้ </span>CPU AMD <span style="font-size: 10pt;">ซึ่งไม่เหมือนชาวบ้านเขา</span></p>
<p><span style="font-size: 10pt;">เหมือนความหวังทั้งสองด้านจะมืดไป แต่เดี๋ยวก่อน นาย </span>Dan <span style="font-size: 10pt;">ได้สร้างของอีกอย่างขึ้นมา นั่นคือ เขานำเอา </span>Android-x86<span style="font-size: 10pt;"> มารวมกับ </span>Patch <span style="font-size: 10pt;">ที่เขาเขียนขึ้นมา และ ไอ้ </span>Patch <span style="font-size: 10pt;">ตัวนี้นั้นมันสามารถใช้งานบนเครื่องผมได้ล่ะ !! คุณสามารถเอามาลองได้จาก<a href="http://www.buildroid.org/blog/?p=86">หน้านี้ครับ</a></span></p>
<h1><span style="font-size: 18pt;">ติดตั้ง </span>Android 4.0<span style="font-size: 18pt;"> บน </span>VirtualBox</h1>
<p><span style="font-size: 10pt;">ก็เริ่มจาก ดาวน์โหลดไฟล์ </span>iso <span style="font-size: 10pt;">จากลิงค์ข้างบนมาก่อนนะครับ</span></p>
<p><span style="font-size: 10pt;">ต่อจากนั้นก็เปิด </span>Oracle VirtualBox <span style="font-size: 10pt;">ขึ้นมา เลือก </span>New <span style="font-size: 10pt;">ที่ทูลบาร์ด้านบนเพื่อที่จะสร้าง </span>VM <span style="font-size: 10pt;">ใหม่ครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug1.png" alt="" /></p>
<p><span style="font-size: 10pt;">ก็จะขึ้น </span>Wizard <span style="font-size: 10pt;">ดังรูป คลิ๊ก </span>Next <span style="font-size: 10pt;">ไป</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug2.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไป ใส่ชื่อ ตามด้วย เลือก </span>OS Type <span style="font-size: 10pt;">เป็น </span>Linux <span style="font-size: 10pt;">และ </span>Version Other Linux <span style="font-size: 10pt;">ครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug3.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไปก็ กำหนดขนาดของหน่วยความจำหลัก เครื่องโน๊ตบุ๊คผมมันแรมน้อยครับ ดังนั้นก็เลยต้องเลือกน้อยหน่อย ผมคิดว่าขั้นต่ำควรจะ </span>512MB <span style="font-size: 10pt;">แต่อันนี้ไม่เคยลองต่ำกว่านี้เหมือนกัน</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug4.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไปก็คือ </span>Hard Disk <span style="font-size: 10pt;">อันนี้แล้วแต่สะดวกเหมือนกัน ผมเลือกที่จะสร้างใหม่ โดยจะใช้ขนาด </span>8GB <span style="font-size: 10pt;">ครับ (เอาเข้าจริง ๆ ใช้ไม่ถึงหรอกครับ อันนี้แค่เผื่อเฉย ๆ)</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug5.png" alt="" /></p>
<p><span style="font-size: 10pt;">พอเลือกที่จะสร้างจะขึ้น </span>Wizard <span style="font-size: 10pt;">สำหรับสร้าง </span>Disk <span style="font-size: 10pt;">ใหม่ ตรงนี้ตามสะดวกครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug6.png" alt="" /></p>
<p><span style="font-size: 10pt;">เลือกเป็น </span>Dynamic Allocation <span style="font-size: 10pt;">จะได้ประหยัดพื้นที่ </span>HDD <span style="font-size: 10pt;">ครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug7.png" alt="" /></p>
<p><span style="font-size: 10pt;">ใส่ชื่อและเลือกขนาด ผมเลือกเป็น </span>8GB <span style="font-size: 10pt;">แต่จริง ๆ แล้วตัว </span>Android X86<span style="font-size: 10pt;"> เองจริง ๆ น่าจะกินที่ไม่เกิน </span>1GB <span style="font-size: 10pt;">ครับ อันนี้เผื่อไว้เฉย ๆ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug8.png" alt="" /></p>
<p><span style="font-size: 10pt;">ถึงตรงนี้ </span>Disk <span style="font-size: 10pt;">ก็จะถูกสร้างละ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug9.png" alt="" /></p>
<p><span style="font-size: 10pt;">สุดท้าย </span>VM <span style="font-size: 10pt;">ก็จะถูกสร้างครับ คลิ๊ก </span>Create <span style="font-size: 10pt;">ไปเลย</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug10.png" alt="" /></p>
<p><span style="font-size: 10pt;">ทีนี้ก็จะเห็น </span>VM <span style="font-size: 10pt;">ตัวใหม่ขึ้นมาแล้ว (ผมให้ชื่อว่า </span>Android 4 x86) <span style="font-size: 10pt;">แต่ยังครับ อย่าเพิ่งกด </span>Start <span style="font-size: 10pt;">กดไปตอนนี้ก็ไม่ได้อะไรขึ้นมาครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug11.png" alt="" /></p>
<p><span style="font-size: 10pt;">ขั้นต่อไปจะเริ่มการตั้งค่า </span>VM <span style="font-size: 10pt;">ล่ะครับ เลือก </span>Settings <span style="font-size: 10pt;">เลยครับ จะขึ้นหน้าจอแบบนี้</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug12.png" alt="" /></p>
<p><span style="font-size: 10pt;">เลือก </span>System <span style="font-size: 10pt;">จะเห็นว่า หน้า </span>Enable absolute point device <span style="font-size: 10pt;">จะถูกติ๊กอยู่ ตรงนี้ต้องเอาออกครับ ไม่เช่นนั้นพอเปิด </span>Android <span style="font-size: 10pt;">ขึ้นมา ตัว </span>Pointer <span style="font-size: 10pt;">จะไม่แสดงขึ้นมา ทีนี้จะหาไม่เจอครับว่าเมาส์อยู่ตรงไหน </span>555</p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug13.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไป เลือก </span>Storage <span style="font-size: 10pt;">คลิ๊กตรงไอคอนรูป </span>CD <span style="font-size: 10pt;">ที่เขียนว่า </span>Empty <span style="font-size: 10pt;">แล้วกดปุ่มรูป </span>CD <span style="font-size: 10pt;">ด้านขวา</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug14.png" alt="" /></p>
<p><span style="font-size: 10pt;">แล้วเลือก </span>iso <span style="font-size: 10pt;">ไฟล์ที่ดาวน์โหลดมาครับ (ไม่มีรูปเพราะไม่ได้ลงโปรแกรม </span>capture <span style="font-size: 10pt;">ดีๆ ไว้ </span>555) <span style="font-size: 10pt;">ก็จะออกมาแบบนี้ครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug15.png" alt="" /></p>
<p><span style="font-size: 10pt;">สุดท้าย ตรงหน้า </span>Network <span style="font-size: 10pt;">เลือก </span>Attached to : Host-only Adapter <span style="font-size: 10pt;">ตรงนี้จริง ๆ สามารถเลือกเป็นแบบอื่นก็ได้ ขอแค่ให้เครื่องเราเห็น </span>VM <span style="font-size: 10pt;">และตัว </span>VM <span style="font-size: 10pt;">จะต้องถูกแจก </span>IP <span style="font-size: 10pt;">ด้วย </span>DHCP (<span style="font-size: 10pt;">ซึ่งในโหมด </span>Host-Only <span style="font-size: 10pt;">จะแจก </span>IP <span style="font-size: 10pt;">ให้ครับ) แต่ในตอนนี้เอาเป็นอันนี้ก่อนครับเพื่อความสะดวก</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug16.png" alt="" /></p>
<p><span style="font-size: 10pt;">เสร็จก็กด </span>OK <span style="font-size: 10pt;">ปิดได้เลยครับ</span></p>
<p><span style="font-size: 10pt;">ทีนี้เราจะเริ่มติดตั้ง </span>VM <span style="font-size: 10pt;">จริง ๆ กันละ กด </span>Start <span style="font-size: 10pt;">ได้เลย</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug17.png" alt="" /></p>
<p><span style="font-size: 10pt;">พอเริ่มแล้ว ก็รอนิดนึง มันจะบูทครับ ก็จะเข้าหน้า </span>Boot Loader <span style="font-size: 10pt;">ก็เลือก </span>Installation</p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug18.png" alt="" /></p>
<p><span style="font-size: 10pt;">รออีกนิด มันจะมีตัวหนังสือมากมาย แล้วจะเข้ามาหน้านี้ เป็นการสร้าง </span>Partition <span style="font-size: 10pt;">บน </span>Disk <span style="font-size: 10pt;">ครับ เลือก </span>Create/Modify partitions</p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug19.png" alt="" /></p>
<p><span style="font-size: 10pt;">ก็เข้าหน้าสร้าง </span>Partition <span style="font-size: 10pt;">เลือก </span>New <span style="font-size: 10pt;">เลยครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug20.png" alt="" /></p>
<p><span style="font-size: 10pt;">เลือกเป็น </span>Primary Partition <span style="font-size: 10pt;">นะครับ (จริง ๆ คิดว่าไม่เกี่ยว แต่เลือกไปเถอะ)</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug21.png" alt="" /></p>
<p><span style="font-size: 10pt;">ใส่ขนาด ผมก็ใส่เต็มไปเลยนี่ล่ะ ง่ายดี</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug22.png" alt="" /></p>
<p><span style="font-size: 10pt;">ถึงตรงนี้ เราเลือกที่จะสร้าง </span>partition <span style="font-size: 10pt;">แล้ว (แต่ถึงขั้นนี้ยังไม่ได้สร้างจริง ๆ ครับ) ต่อไปเลือก </span>Boot <span style="font-size: 10pt;">เพื่อให้ </span>partition <span style="font-size: 10pt;">นี้มันบูทได้ (อันนีก็คิดว่าไม่เกี่ยว แต่ใส่ไปเถอะ)</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug23.png" alt="" /></p>
<p><span style="font-size: 10pt;">เลือกพาร์ทิชั่น (ซึ่งมีอันเดียว)</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug24.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไปเลือก </span>Write <span style="font-size: 10pt;">เพื่อที่จะบันทึกสิ่งที่เราทำมาทั้งหมดลงไป ถ้าเราไม่กด </span>Write <span style="font-size: 10pt;">ก่อนออกจากหน้านี้ ก็จะไม่มีอะไรเกิดขึ้นครับ (ที่ทำมาหมดก็หายหมด)</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug25.png" alt="" /></p>
<p><span style="font-size: 10pt;">ยืนยันเสียหน่อย พิมพ์ </span>yes <span style="font-size: 10pt;">แล้วกด </span>enter</p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug26.png" alt="" /></p>
<p><span style="font-size: 10pt;">สุดท้ายเลือก </span>quit <span style="font-size: 10pt;">เพื่อออก</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug27.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไปก็เลือก </span>partition <span style="font-size: 10pt;">ที่เราเพิ่งสร้างเสร็จครับ เราจะติดตั้ง </span>android <span style="font-size: 10pt;">ลง </span>partition <span style="font-size: 10pt;">นี้แหละ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug28.png" alt="" /></p>
<p><span style="font-size: 10pt;">ตัวติดตั้งจะฟอร์แมท </span>partition <span style="font-size: 10pt;">ของเรา ก็เลือกเป็นอันไหนก็ได้ครับแล้วแต่ชอบ แต่ผมเลือก </span>ext3<span style="font-size: 10pt;"> นะ (อันอื่นไม่เคยลอง)</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug29.png" alt="" /></p>
<p><span style="font-size: 10pt;">ยืนยันอีกสักที</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug30.png" alt="" /></p>
<p><span style="font-size: 10pt;">เริ่มฟอร์แมทละ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug31.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไปจะติดตั้งตัว </span>Boot Loader (<span style="font-size: 10pt;">ถ้าไม่มีจะบูทไม่ได้) ตอบ </span>Yes <span style="font-size: 10pt;">ไปเลย</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug32.png" alt="" /></p>
<p><span style="font-size: 10pt;">อันนี้จะถามว่า จะทำให้ /</span>system <span style="font-size: 10pt;">นั้นเขียนได้มั้ย ผมคิดว่าเราไม่จำเป็นต้องไปปกป้องอะไรมัน (ถ้าพังก็ลงใหม่) ดังนั้นทำให้มันเขียนได้จะมีประโยชน์มากกว่าครับ (โดยเฉพาะตอนที่พยายามจะติดตั้ง </span>GAPP)</p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug33.png" alt="" /></p>
<p><span style="font-size: 10pt;">ติดตั้ง </span>Android 4<span style="font-size: 10pt;"> อย่างรวดเร็ว</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug34.png" alt="" /></p>
<p><span style="font-size: 10pt;">อันนี้จริง ๆ คือติดตั้งเสร็จละ แต่ว่า &#8230; สร้างตัว </span>Fake SD Card <span style="font-size: 10pt;">ไปเลยดีกว่า เจ้านี่จะทำตัวเหมือนเป็น </span>SD Card <span style="font-size: 10pt;">ครับ ถ้าโปรแกรมที่เราจะดีบั๊กใช้ </span>SD Card <span style="font-size: 10pt;">เราก็ควรจะ </span>Enable <span style="font-size: 10pt;">ไว้ จะทำให้ชีวิตง่ายขึ้นครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug35.png" alt="" /></p>
<p><span style="font-size: 10pt;">ค่าที่ให้มาคือขนาดที่ใหญ่ที่สุดที่สร้างได้ (</span>2GB) <span style="font-size: 10pt;">ก็ </span>Enter <span style="font-size: 10pt;">ไปเลย</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug36.png" alt="" /></p>
<p><span style="font-size: 10pt;">เริ่มสร้างละครับ ตรงนี้รอนานหน่อย</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug37.png" alt="" /></p>
<p><span style="font-size: 10pt;">เมื่อสร้างเสร็จแล้วมันจะบังคับให้รีบูทครับ ก็กด </span>Enter <span style="font-size: 10pt;">ไป</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug38.png" alt="" /></p>
<p><span style="font-size: 10pt;">แต่เอ่อ ถ้าเรารีบูททั้งอย่างนี้ &#8230; มันจะบูทกลับไปที่ </span>DVD <span style="font-size: 10pt;">ตัวติดตั้งน่ะครับ &#8230; ดังนั้นเราต้อง </span>Reject <span style="font-size: 10pt;">ตัว </span>DVD <span style="font-size: 10pt;">ออกก่อน</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug39.png" alt="" /></p>
<p><span style="font-size: 10pt;">จากนั้นก็ </span>reboot <span style="font-size: 10pt;">ใหม่</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug40.png" alt="" /></p>
<p><span style="font-size: 10pt;">ของจริงมาแล้ว เลือกอันบนโลดครับ (ถ้าไม่เลือกภายใน </span>5<span style="font-size: 10pt;"> วินาทีมันก็จะเลือกอันบนสุดให้อยู่ดี)</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug41.png" alt="" /></p>
<p><span style="font-size: 10pt;">เข้า </span>Android Boot Loader <span style="font-size: 10pt;">ละครับ เย้</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug42.png" alt="" /></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug43.png" alt="" /></p>
<p><span style="font-size: 10pt;">ก็เป็นอันเข้าได้เรียบร้อยแล้วครับ </span> <img src='http://playground-soft.com/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  <span style="font-size: 10pt;">เป็น </span>Android 4.0.3<span style="font-size: 10pt;"> นะครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug44.png" alt="" /></p>
<h1><span style="font-size: 18pt;">เริ่มใช้ </span>Eclipse <span style="font-size: 18pt;">กับ </span>VM <span style="font-size: 18pt;">ที่เพิ่งสร้างเสร็จ</span></h1>
<p><span style="font-size: 10pt;">ต่อไปก็เริ่มดีบั๊กกันจริงจังละครับ </span> <img src='http://playground-soft.com/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  <span style="font-size: 10pt;">เริ่มจากเลือก </span>Terminal <span style="font-size: 10pt;">ขึ้นมาก่อน</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug45.png" alt="" /></p>
<p><span style="font-size: 10pt;">ที่ </span>Terminal <span style="font-size: 10pt;">พิมพ์คำสั่ง </span>netcfg <span style="font-size: 10pt;">จะเห็นว่ามี </span>interface <span style="font-size: 10pt;">ที่ </span>UP <span style="font-size: 10pt;">อยู่สองตัว ตัวแรกคือ </span>lo <span style="font-size: 10pt;">หรือ </span>loop back <span style="font-size: 10pt;">ซึ่งเราไม่ใช้ อีกตัวก็คือ </span>eth0<span style="font-size: 10pt;"> จดเลข </span>IP <span style="font-size: 10pt;">เอาไว้นะครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug46.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไป กลับไปที่ </span>host <span style="font-size: 10pt;">เปิด </span>command prompt <span style="font-size: 10pt;">ขึ้นมา (บน </span>Windows <span style="font-size: 10pt;">ก็เปิด </span>Command Prompt <span style="font-size: 10pt;">บน </span>Mac/Linux <span style="font-size: 10pt;">ใช้ </span>Terminal) <span style="font-size: 10pt;">เข้าไปยัง </span>Folder <span style="font-size: 10pt;">ที่เก็บตัว </span>Android SDK <span style="font-size: 10pt;">ไว้นะครับ</span></p>
<p>&nbsp;</p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug47.png" alt="" /></p>
<p><span style="font-size: 10pt;">แล้วเข้า </span>folder <span style="font-size: 10pt;">ที่ชื่อว่า </span>platform-tools</p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug48.png" alt="" /></p>
<p><span style="font-size: 10pt;">พิมพ์คำสั่ง </span>adb connect &lt;<span style="font-size: 10pt;">เลขไอพีที่จดไว้</span>&gt; <span style="font-size: 10pt;">ดังนี้ครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug49.png" alt="" /></p>
<p><span style="font-size: 10pt;">เมื่อต่อได้สำเร็จจะขึ้นข้อความข้างล่าง ถือว่าประสพความสำเร็จเรียบร้อย ปิด </span>command prompt/terminal <span style="font-size: 10pt;">ได้เลยครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug50.png" alt="" /></p>
<p><span style="font-size: 10pt;">ต่อไปก็ไปที่ </span>Eclipse <span style="font-size: 10pt;">ใครที่ยังไม่เปิดก็เปิดซะนะครับ ตอนรันโปรแกรม ที่หน้าจอ </span>Android Device Chooser <span style="font-size: 10pt;">จะปรากฎของเครื่อง </span>VM <span style="font-size: 10pt;">ที่เราเพิ่ง </span>connect <span style="font-size: 10pt;">เข้าไป แบบนี้ครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug51.png" alt="" /></p>
<p><span style="font-size: 10pt;">ก็เลือกซะแล้วกด </span>OK <span style="font-size: 10pt;">แล้วโปรแกรมเราก็จะรันขึ้นมาได้แบบนี้ครับ</span></p>
<p><img src="http://playground-soft.com/wordpress/wp-content/uploads/2012/02/020712_0545_Debug52.png" alt="" /></p>
<p><span style="font-size: 10pt;">แค่นี้ก็รันได้ </span>Debug <span style="font-size: 10pt;">ได้แล้วล่ะครับ <img src='http://playground-soft.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </span></p>
<p>อ้างอิง : <a href="http://dev.blogs.nuxeo.com/2011/10/speeding-up-the-android-emulator.html">Nuxeo Developers Blog</a>, <a href="http://www.android-x86.org/">Android-x86</a>, <a href="http://www.buildroid.org/blog/">Buildroid</a></p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=383</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Digital ดิจิทัล ดิจิตอล &#8230; เว้ยอะไรก็ช่างแ_งเหอะ !</title>
		<link>http://playground-soft.com/wordpress/?p=241</link>
		<comments>http://playground-soft.com/wordpress/?p=241#comments</comments>
		<pubDate>Thu, 07 Jul 2011 17:44:47 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[จิปาถะ]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=241</guid>
		<description><![CDATA[เมื่อสองวันที่แล้ว ก็อ่าน Blognone ตามปรกติ  เห็นมีข่าวนึงเขียนว่า รัฐบาลเกาหลีเตรียมแปลงสื่อการสอนให้เป็นดิจิตอลให้หมด ก็มีคนมาท้วงว่า เฮ้ย คำนี้มันควรเขียนว่า ดิจิทัล ตามที่ Glossary เขียนไว้สิ เท่านั้นแหละก็มีคนมาสาธยายความยาวว่า ไอ้คำว่า ดิจิทัลเนี่ย มันไม่ถูกนะ อย่างโง้นอย่างงี้ แล้วทำไมเราต้องไปใช้คำนี้ตามที่ &#8220;ราชบัณฑิต&#8221; บัญญัติเอาไว้ด้วย แล้วก็เริ่มลากไปไหนก็ไม่รู้ ไปเรื่องกฎหมายบ้าง เค้าบอกว่า &#8220;คนอื่นก็เรียกว่า &#8216;ดิจิตอล&#8217; ทั่วบ้านทั่วเมือง ทำไมราชบัณฑิตถึงบัญญัติคำนี้ว่า &#8216;ดิจิทัล&#8217; มันไม่ถูกนะ&#8221; ก็ว่าไปเรื่อย แล้วก็บอกว่า ฝรั่งเองก็ออกเสียงคำนี้ว่า &#8216;ดิจิตอล&#8217; เหมือนกัน มันผิดตั้งแต่ ต้อน แล้วคุณ ภาษาอังกฤษมันมีเสียง ต ที่ไหน &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=241">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>เมื่อสองวันที่แล้ว ก็อ่าน <a href="http://www.blognone.com/">Blognone</a> ตามปรกติ  เห็นมีข่าวนึงเขียนว่า รัฐบาลเกาหลีเตรียมแปลงสื่อการสอนให้เป็นดิจิตอลให้หมด</p>
<p>ก็มีคนมาท้วงว่า เฮ้ย คำนี้มันควรเขียนว่า ดิจิทัล ตามที่ Glossary เขียนไว้สิ</p>
<p>เท่านั้นแหละก็มีคนมาสาธยายความยาวว่า ไอ้คำว่า ดิจิทัลเนี่ย มันไม่ถูกนะ อย่างโง้นอย่างงี้ แล้วทำไมเราต้องไปใช้คำนี้ตามที่ &#8220;ราชบัณฑิต&#8221; บัญญัติเอาไว้ด้วย แล้วก็เริ่มลากไปไหนก็ไม่รู้ ไปเรื่องกฎหมายบ้าง</p>
<p>เค้าบอกว่า &#8220;คนอื่นก็เรียกว่า &#8216;ดิจิตอล&#8217; ทั่วบ้านทั่วเมือง ทำไมราชบัณฑิตถึงบัญญัติคำนี้ว่า &#8216;ดิจิทัล&#8217; มันไม่ถูกนะ&#8221; ก็ว่าไปเรื่อย แล้วก็บอกว่า ฝรั่งเองก็ออกเสียงคำนี้ว่า &#8216;ดิจิตอล&#8217; เหมือนกัน</p>
<p>มันผิดตั้งแต่ ต้อน แล้วคุณ ภาษาอังกฤษมันมีเสียง ต ที่ไหน ?</p>
<p>ถ้าลองไปค้นหาคำนี้ในพจนานุกรมภาษาอังกฤษที่เป็นแบบ Advanced Learner มันจะระบุวิธีการออกเสียงของแต่ละคำเอาไว้ด้วยสัญลักษณ์ที่เรียกว่า <a href="http://th.wikipedia.org/wiki/%E0%B8%AA%E0%B8%B1%E0%B8%97%E0%B8%AD%E0%B8%B1%E0%B8%81%E0%B8%A9%E0%B8%A3%E0%B8%AA%E0%B8%B2%E0%B8%81%E0%B8%A5">Phonetic</a> ซึ่งสำหรับคำว่า Digital เนี่ยมันจะเขียนว่า ˈdɪdʒɪtl (<a href="http://www.oxfordadvancedlearnersdictionary.com/dictionary/digital">อ้างอิงจาก Oxford Advanced Learners Dictionary</a>) สำหรับคุณ ๆ ที่อ่านไม่ออก ไม่ต้องตกใจ ผมก็ลืมหมดแล้ว (เคยเรียนคอร์สการออกเสียงอยู่ครั้งหนึ่ง ซึ่งเป็นเรื่องของ Phonetic ล้วน ๆ มันเป็นอะไรที่ถ้าเรียนแล้วไม่ค่อยได้ใช้ก็ลืมเกลี้ยง) แต่จะเทียบเคียงจากเสียง ดิจิตอล ก็แล้วกัน</p>
<p>เอาคำที่ออกเสียงชัด ๆ ว่า ทอล (ตอลนี่ ไม่มีแน่ ๆ ) นะครับ คำว่า <a href="http://www.oxfordadvancedlearnersdictionary.com/dictionary/tall">Tall </a>มี Phonetic คือ tɔːl ลองสังเกตว่ามันเขียนไม่เหมือนคำข้างบนนะครับ</p>
<p>คือไอ้ตัว tal มันไม่ได้ออกเสียงยาว ๆ แต่เป็นการรวบเสียงให้สั้น การที่ใช้ไม้หันอากาศซึ่งแสดงว่าเป็นการออกเสียงสั้น ผมว่ามันก็เหมาะสมดีแล้ว (แล้วอย่าลืม Stress ตัวหน้าสุดนะ)</p>
<p>แต่ประเด็นมันไม่ได้อยู่ที่ความถูกต้อง หลักภาษามันเป็นเรื่องของความนิยม ถ้ามันนิยมมันก็ใช้ได้ ไม่ค่อยมีกฎตายตัวเท่าไหร่ ไอ้ที่ทำให้ผมเซ็งเนี่ยมันคือการที่บอกว่า มันมีอันนึงถูก อันนึงผิด</p>
<p>ความเห็นผม มันก็ถูกทั้งคู่แหละ อันนึงถูกเพราะว่าเป็นหลักภาษา (คำทับศัพท์ภาษาไทยจะใช้การสร้างคำจากเสียงของคำจากภาษาต้นฉบับ) อีกอันมันก็ถูก เพราะคนใช้เยอะ (แปลได้อีกอย่างว่า พวกมากลากไป) เรียกได้ว่านิยม ว่างั้นแหละ</p>
<p>เรื่องภาษาผมไม่ซีเรียส มีปราชญ์ท่านนึงว่าไว้ว่า ภาษามันเหมือนสิ่งมีชิวิต มันมีการคัดเลือกทางธรรมชาติ คำที่ไม่มีคนใช้มันก็หายไปทุกวัน ๆ และก็มีคำใหม่เกิดขึ้นทุกวัน ผมมองว่าการใช้สิ่งที่ถูกต้องในชีวิตประจำวันก็เป็นการรักษาให้มันคงอยู่ แต่สำหรับไอ้ที่ผิดแต่นิยมก็ใช้ไปไม่ได้ซีเรียสอะไร ไม่งั้นก็โดนว่าว่าพูดไม่รู้เรื่อง (หรืออย่างกรณีคำนี้ก็อาจจะโดนว่าว่ากระแดะ พูดภาษาไทยคำ อังกฤษคำ ได้เหมือนกัน)</p>
<p>แต่เพราะไอ้ความคิดว่า เพราะมีคนทำเยอะ มันก็เลยถูกนี่ล่ะ มันเลยทำให้บ้านเมืองเดือดร้อนมาจนถึงทุกวันนี้ ทุกวันนี้เรามีคนที่ขายของบนทางเท้า มีแท๊กซี่ที่ไม่รับผู้โดยสาร มีมอไซค์วิ่งบน<span style="text-decoration: underline;">ฟุตบาท</span> (&lt;- คำนี้ก็ผิดแต่ใช้กันเพราะนิยม คำต้นฉบับคือ Foot Path ฟุตพาธ น่ะล่ะ) แล้วพอมีคนโวยวายว่ามันไม่ถูกก็จะโดนตอกกลับไปว่ามันจะไม่ถูกได้ยังไงเพราะเขาทำกันทั่วบ้านทั่วเมือง ไอ้คนที่ไม่ทำนี่แหละผิด &#8230;</p>
<p>ถ้าคิดแบบนี้ไม่ต้องไปเลือกตั้งหรอกครับ เลือกคนเข้าไปตรากฎหมายทำไม มีกฎหมายไปท่านก็ไม่ทำอยู่ดี อ้างว่า เพราะทำกันมาทั่วบ้านทั่วเมืองแล้วมันจะผิดได้ยังไง ใช่หรือไม่ !</p>
<p>หงุดหงิดจริง &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=241</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>เรื่องวุ่น ๆ กับตัวหนังสือ &#8211; ตอนที่ 5 &#8211; วาดตัวหนังสือแบบ Tile-Base</title>
		<link>http://playground-soft.com/wordpress/?p=240</link>
		<comments>http://playground-soft.com/wordpress/?p=240#comments</comments>
		<pubDate>Fri, 01 Jul 2011 20:02:25 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[เขียนโปรแกรม]]></category>
		<category><![CDATA[Text Rendering]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=240</guid>
		<description><![CDATA[สมัยนี้หลาย ๆ คนอาจจะคิดว่าเราคงไม่ได้เขียนเกมแบบ Tile Base แท้ ๆ กันแล้ว ซึ่งก็คงจะจริงเพราะว่าส่วนใหญ่เราจะใช้การวาดกราฟิคแบบ 3D กันหมดแล้ว (ผ่าน OpenGL หรือ API อะไรก็แล้วแต่) แต่ผมว่าเรื่อง Tile Base เนี่ยมันน่าสนใจนะครับ แล้วมันก็คลาสสิคด้วย ภาพข้างบนผมจับมาจากเกมที่ชื่อว่า Lufia II : Sin of Sinistral ซึ่งเป็นภาคแปลจากเกมที่ชื่อว่า Espolis Biography II … เกมนี้เป็นเกมที่ผมชอบมากเมื่อสมัยเด็ก ๆ เพราะเป็นเกมที่ต้องใช้ความคิดในการแก้ปริศนาเยอะมาก (ยากด้วย) ปัจจุบันมีการ Remake เกมนี้ขึ้นมาใหม่ &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=240">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>สมัยนี้หลาย ๆ คนอาจจะคิดว่าเราคงไม่ได้เขียนเกมแบบ Tile Base แท้ ๆ กันแล้ว ซึ่งก็คงจะจริงเพราะว่าส่วนใหญ่เราจะใช้การวาดกราฟิคแบบ 3D กันหมดแล้ว (ผ่าน OpenGL หรือ API อะไรก็แล้วแต่) แต่ผมว่าเรื่อง Tile Base เนี่ยมันน่าสนใจนะครับ แล้วมันก็คลาสสิคด้วย</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/07/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/07/image_thumb.png" width="244" height="214" /></a></p>
<p>ภาพข้างบนผมจับมาจากเกมที่ชื่อว่า Lufia II : Sin of Sinistral ซึ่งเป็นภาคแปลจากเกมที่ชื่อว่า Espolis Biography II … เกมนี้เป็นเกมที่ผมชอบมากเมื่อสมัยเด็ก ๆ เพราะเป็นเกมที่ต้องใช้ความคิดในการแก้ปริศนาเยอะมาก (ยากด้วย) ปัจจุบันมีการ Remake เกมนี้ขึ้นมาใหม่ กลายเป็น Lufia ภาคแรกไป (เพราะเนื้อเรื่องภาคนี้จะอยู่ก่อนหน้าอีกภาคนึง) ซึ่งไม่สนุกเหมือนตัวเก่า แต่ก็ออกมาแล้วหายคิดถึงไปเยอะเลย</p>
<p>นอกเรื่องมาไกล อยากให้สังเกตความเป็น Tile ของเกมน่ะครับ สำหรับเครื่องเกมในอดีต ถ้าเป็นของ Nintendo ก็นับตั้งแต่ Famicom ขึ้นมา ยันเครื่อง DS จะเป็นเครื่องที่รองรับการทำ Tile ในระดับฮาร์ดแวร์ ซึ่งทางนินเทนโดเองจะเรียกว่า Character ที่เรียกแบบนี้ก็เพราะจริง ๆ แล้วเรากำลังเขียนเกมอยู่บน Text Mode ที่สวยขึ้นมาอีกหน่อยเท่านั้นเอง</p>
<p>ที่ว่าเป็น Tile Base System ตั้งแต่ระดับ Hardware ก็คือตัว Hardware จะมีหน่วยความจำพิเศษสำหรับเก็บข้อมูล Tile และหน่วยความจำพิเศษอีกส่วนนึงที่เก็บข้อมูลกราฟิคบนจอ โดยจะเก็บเป็น aray ของ index ของ Tile ดังนั้นเราจะไม่มีทางที่จะวาดภาพบนจอภาพแบบระบุพิกัดเป็น Pixel ได้ นั่นคือที่มาว่าทำไมเกมสมัยก่อนจึงเป็นตารางครับ</p>
<p>กลับมาเข้าเรื่องของเรากัน จากภาพข้างบนเราจะเห็นว่ามีการแสดงผลข้อความที่เขียนว่า “Ta-daaa! It’s fish pot pie made of ‘navaroa’, the phantom fish!” นะครับ ผมคิดว่าคุณอาจจะคิดว่าข้อความนี้เก็บข้อมูลเป็นระหัส ASCII ซึ่งผมยืนยันได้เลยว่า “ไม่ใช่”</p>
<p>ในระบบแบบ Tile-base เนี่ย เราจะมองว่า ช่องไหนใช้ tile index ที่เท่าไหร่ การที่จะต้องเสียพื้นที่เก็บข้อมูลสำหรับ Tile โดยใช้ ASCII Code เนี่ย ไม่ Efficient เพราะว่า ASCII Code มีโค๊ดบางส่วนที่ไม่มีการแสดงผล การที่จะต้องเก็บข้อมูลว่าง ๆ ลงไปใน Tileset นั้นทำให้เสียพื้นที่ที่น้อยนิดไปอย่างฟรี ๆ ดังนั้น Encoding ที่ใช้นั้นจะเป็น Encoding ที่สร้างขึ้นมาใหม่ครับ (ผมเข้าใจว่ามี Tool ที่มาช่วยตรงนี้อยู่แล้ว)</p>
<p>อีกอย่างนึง อยากให้ดูโครงสร้างการเก็บข้อมูลหน้าจอของอุปกรณ์ประเภทนี้ สมมติว่า บัฟเฟอร์การแสดงผลของเรานั้นสามารถแสดงผลได้ 64*64 tile บนหน้าจอ มันจะเก็บข้อมูลแบบนี้ครับ</p>
<p>BYTE dispBuffer[64*64]; // 4096 tile</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/07/image1.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/07/image_thumb1.png" width="244" height="244" /></a></p>
<p>นั่นก็คือ ถ้าเราต้องการจะวาดตัวหนังสือให้อยู่ตรงกลาง เราจำเป็นจะต้องใส่รหัสพิเศษระหว่างตัวอักษรเพื่อจัดตำแหน่งให้ตัวหนังสือมันมาอยู่ตรงกลาง ในตำแหน่งที่เราต้องการด้วย</p>
<p>และสุดท้ายสังเกตตัวอักษรให้ดี ๆ นะครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/07/image2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/07/image_thumb2.png" width="244" height="157" /></a></p>
<p>สังเกตมั้ยว่าด้านสูงกับด้านกว้างของตัวอักษรไม่เท่ากัน จริง ๆ แล้วในแต่ละตัวอักษรมันเป็นสอง Tile ประกบกันบนล่างครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/07/image3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/07/image_thumb3.png" width="244" height="157" /></a></p>
<p>วิธีการใช้การประกบบนล่างแบบนี้จริง ๆ ก็มีข้อดีอย่างนึงคือ บาง Tile ก็ประหยัดได้ อย่าง ตัว i กับตัว j เนี่ย มันจะต่างกันแค่ด้านล่างใช่มั้ยครับ ถ้าด้านบนใช้ tile เดียวกัน ก็ประหยัดไปได้ 1 tile (ตัว h กับ n ก็ได้อีกคู่นะ)</p>
<p>และถ้าจะทำจริง ๆ เราสามารถทำให้บางตัวอักษรกว้างสองช่องก็ทำได้ครับ แต่พอดีผมหาตัวอย่างไม่เจอน่ะ</p>
<p>วันนี้พูดแค่ผ่าน ๆ ก็คงพอ เพราะว่าเราคงไม่ได้ใช้ tile-base แท้ ๆ กันสักเท่าไหร่แล้ว คราวต่อไปจะพูดถึงการวาดตัวอักษรแบบที่เป็น raster จริง ๆ แล้วครับ</p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=240</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>เรื่องวุ่น ๆ กับตัวหนังสือ &#8211; ตอนที่ 4 &#8211; ประเภทของ Font</title>
		<link>http://playground-soft.com/wordpress/?p=231</link>
		<comments>http://playground-soft.com/wordpress/?p=231#comments</comments>
		<pubDate>Mon, 16 May 2011 20:13:45 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[เขียนโปรแกรม]]></category>
		<category><![CDATA[Text Rendering]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=231</guid>
		<description><![CDATA[อย่างที่เคยบอกว่า Font คือ ชุดของตัวอักษร ถ้าจะให้อธิบายให้ละเอียดยิ่งขึ้น Font ก็คือ ชุดของภาพตัวอักษร (Glyph) ครับ เราสามารถแบ่งประเภทของ Font ได้จากลักษณะของ Glyph ที่มันเก็บเอาไว้ได้สองลักษณะ ดังนี้ 1. Raster Font Raster Font ก็คือ Font ที่เก็บ Glyph ในลักษณะของ Raster … ก็คือ … Bitmap น่ะล่ะครับ Font ในยุคต้น ๆ จะเป็น Raster ทั้งหมด เพราะว่าเครื่อง PC &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=231">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>อย่างที่เคยบอกว่า Font คือ ชุดของตัวอักษร ถ้าจะให้อธิบายให้ละเอียดยิ่งขึ้น Font ก็คือ ชุดของภาพตัวอักษร (Glyph) ครับ </p>
<p>เราสามารถแบ่งประเภทของ Font ได้จากลักษณะของ Glyph ที่มันเก็บเอาไว้ได้สองลักษณะ ดังนี้</p>
<h1>1. Raster Font</h1>
<p>Raster Font ก็คือ Font ที่เก็บ Glyph ในลักษณะของ Raster … ก็คือ … Bitmap น่ะล่ะครับ </p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/image2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/image_thumb2.png" width="239" height="244" /></a></p>
<p>Font ในยุคต้น ๆ จะเป็น Raster ทั้งหมด เพราะว่าเครื่อง PC ในสมัยนั้นมีความสามารถต่ำ และ คนที่สร้างฟอนท์เองก็ไม่ได้เก่งอะไร (อย่าลืมว่าคอมพิวเตอร์ในยุคแรก ๆ นั้นผู้ใช้เป็นคนที่อยู่ในวงการคอมพิวเตอร์ และคณิตศาสตร์ เสียส่วนใหญ่นะครับ) การวาดฟอนท์ด้วยภาพ Bitmap นั้นไม่ได้ยากมาก แต่อาจจะดูไม่สวยอยู่สักหน่อย</p>
<h1>2. Vector Font</h1>
<p>Vector Font ก็คือ Font ที่เก็บข้อมูล Glyph ในแบบ Vector (กำปั้นทุบดินจริง ๆ ) เหมือนภาพใน Illustrator หรือ Corel Draw นั่นล่ะครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/image3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/image_thumb3.png" width="184" height="244" /></a></p>
<p>ในยุคหลัง ๆ มีความพยายามจากทางวงการสิ่งพิมพ์ว่า เขาอยากได้ฟอนท์ที่สามารถย่อ-ขยายได้ โดยที่ตัวหนังสือยังคงดูคมชัดเหมือนเดิม ก็เลยมีคนสร้างฟอนท์ที่ใช้ภาพ Vector ขึ้นมา เพราะสามารถยืดขยายได้ตามใจชอบ เรียกได้ว่าเป็นฟอนท์ที่มีความยืดหยุ่นสูงนั่นเอง</p>
<h1></h1>
<h1>Raster vs Vector</h1>
<p>มาดูข้อดีข้อเสียของฟอนท์แต่ละประเภทกันดีกว่า</p>
<h2>1. ความยืดหยุ่น</h2>
<ul>
<li>Vector Font จะได้เปรียบในข้อที่ว่า ตัว Glyph สามารถยืดขยายได้โดยที่ไม่เสียคุณภาพภาพมากนัก </li>
<li>ในขณะที่ถ้าเป็น Raster Font พอยืดขยายแล้วในบางครั้ง Glyph อาจจะเละจนอ่านไม่ออกไปเลยก็มี</li>
</ul>
<h2>2. ความยากง่ายในการใช้งาน</h2>
<ul>
<li>Raster Font นั้น เก็บข้อมูลในรูปของภาพ Bitmap ซึ่ง การแสดงผลบนหน้าจอของคอมพิวเตอร์ในปัจจุบันก็เป็นภาพ Bitmap ทั้งหมด ดังนั้นเราจึงสามารถวาด Glyph ลงไปได้ตรง ๆ โดยที่ไม่ต้องมีการแปลงข้อมูล</li>
<li>Vector Font นั้น เก็บช้อมูลในรูปของชุดคำสั่งการวาดภาพ ดังนั้นเราต้องนำชุดคำสั่งนี้ไปประมวลผลก่อน (เรียกว่าการทำ Rasterization) เพื่อสร้างภาพ Bitmap ก่อนที่จะนำภาพนั้นขึ้นไปวาดบนจอ</li>
</ul>
<h1>แล้วเราจะใช้ Font แบบไหนดี ในเกมของเรา</h1>
<p>ในเกมคอนโซลยุคเก่า ๆ Font จะเป็น Raster Font ทั้งหมด เพราะว่าเกมคอนโซลนั้นจะทำงานอยู่บนอุปกรณ์ที่มีความละเอียดคงที่ เช่น 640&#215;480, 256&#215;198 เป็นต้น ดังนั้นจึงไม่จำเป็นที่จะต้องใช้ฟอนท์ที่ย่อ/ขยายขนาดได้ รวมทั้งการทำ Rasterization ก็เป็นกระบวนการที่มีความซับซ้อนสูง และกินเวลาในการคำนวนค่อนข้างนานอีกด้วย</p>
<p>สำหรับเกมคอนโซลในยุคใหม่ ๆ อย่าง XBox 360 หรือ Playstatin 3 และเกม PC มักจะใช้ Vector Font เพราะว่าตัวระบบปฎิบัติการณ์ของแต่ละเครื่องรองรับการวาดภาพตัวอักษรด้วยฟอนท์ประเภทนี้อยู่แล้ว </p>
<p>แต่โดยส่วนตัวผมยังคิดว่า การวาดตัวอักษรด้วยฟอนท์แบบ Raster นั้นเหมาะสมกับเกมมากกว่า เพราะผู้ใช้แทบไม่มีความจำเป็นจะต้องควบคุมขนาดของตัวอักษรเลย และในความเป็นจริงเกมของเราก็ยังคงทำงานอยู่บนหน้าจอที่มีความละเอียดคงที่ (อาจจะรองรับแค่ 480i + 720p ก็พอ) หรือแม้ว่าเราจะอนุญาตให้ผู้ใช้ปรับแต่งความละเอียดเองได้ เราก็ยังคงสามารถจะ scale ภาพ Glyph ให้เล็กหรือใหญ่ขึ้นตามความละเอียดของหน้าจอได้อยู่ดี (แน่นอนว่าต้องแลกกับคุณภาพของภาพที่ได้ครับ)</p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=231</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>เรื่องวุ่น ๆ กับตัวหนังสือ &#8211; ตอนที่ 3 &#8211; Character Encoding</title>
		<link>http://playground-soft.com/wordpress/?p=226</link>
		<comments>http://playground-soft.com/wordpress/?p=226#comments</comments>
		<pubDate>Sun, 08 May 2011 17:00:14 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[เขียนโปรแกรม]]></category>
		<category><![CDATA[Text Rendering]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=226</guid>
		<description><![CDATA[บทที่แล้วมีเกริ่นถึง Character Encoding ไปนิดหน่อย ก็อย่างที่บอกว่า Encoding ก็คือ วิธีเข้ารหัสตัวอักษรให้อยู่ในรูปของรหัสที่คอมพิวเตอร์แยกแยะและนำไปใช้ได้ บทนี้เราจะพูดถึงรายละเอียดลึกลงไปหน่อยว่า เทคนิคการ Encoding ทั่ว ๆ ไป ที่ใช้ ๆ กันในมาตรฐานต่าง ๆ นั้นมันเป็นยังไงบ้าง บทนี้จะพูดถึงเรื่อง Technical ล้วน ๆ ครับ ใครอยู่สายอื่นอาจจะไม่ต้องทำความเข่้าใจมันมากก็ได้ อันที่จริงมันไม่ค่อยมีประโยชน์ต่อคนในสาย Artist/Designer เท่าไหร่หรอก String ก่อนจะเข้าเรื่องการเข้ารหัส จะขอพูดถึง String ก่อน String ก็คือ สายอักขระ &#8230; สายของตัวอักษรนั่นล่ะ จริง ๆ &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=226">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>บทที่แล้วมีเกริ่นถึง Character Encoding ไปนิดหน่อย ก็อย่างที่บอกว่า Encoding ก็คือ วิธีเข้ารหัสตัวอักษรให้อยู่ในรูปของรหัสที่คอมพิวเตอร์แยกแยะและนำไปใช้ได้ บทนี้เราจะพูดถึงรายละเอียดลึกลงไปหน่อยว่า เทคนิคการ Encoding ทั่ว ๆ ไป ที่ใช้ ๆ กันในมาตรฐานต่าง ๆ นั้นมันเป็นยังไงบ้าง</p>
<p>บทนี้จะพูดถึงเรื่อง Technical ล้วน ๆ ครับ ใครอยู่สายอื่นอาจจะไม่ต้องทำความเข่้าใจมันมากก็ได้ อันที่จริงมันไม่ค่อยมีประโยชน์ต่อคนในสาย Artist/Designer เท่าไหร่หรอก</p>
<h2>String</h2>
<p>ก่อนจะเข้าเรื่องการเข้ารหัส จะขอพูดถึง String ก่อน String ก็คือ สายอักขระ &#8230; สายของตัวอักษรนั่นล่ะ จริง ๆ ก็คือ ชุดของตัวอักษรที่เรียงต่อกันเป็นแนวยาว</p>
<p>ผมเองก็ไม่รู้ว่าทำไมต้องคิดมากขนาดนั้น เพราะจริง ๆ เราก็เขียนหนังสือเป็นแนวเดียว (ไม่ขวางก็ตั้ง) และในทิศทางเดียว แต่ก็นั่นล่ะคำคำนี้เป็นสิ่งที่วิศวกร/นักวิทยาศาสตร์ในอดีตเป็นคนบัญญัติขึ้น จะไม่เอามาใช้ก็เห็นจะแปลกไปนิด</p>
<p>ลักษณะพิเศษของ String ก็คือ มันเป็นข้อมูลแบบ Stream ที่ไหลไปทางเดียวกันตลอด จะสังเกตได้ว่าเวลาเราอ่านตัวหนังสือเราจะไม่ค่อยมีการอ่านย้อนกลับมากนัก (การอ่านข้อมูลในทิศทางเดียวเป็นลักษณะเฉพาะของ Stream) ดังนั้นเราจะมองว่า String คือ Stream ของ Character ก็ได้เหมือนกัน</p>
<h2>Fixed-Length Character Encoding (การเข้ารหัสโดยใช้รหัสที่มีจำนวนหลักตายตัว)</h2>
<p>การเข้ารหัสในลักษณะนี้จะเป็นการแทนที่ตัวอักษรใด ๆ ด้วยตัวเลขที่มีจำนวนหลัก (digit) แบบคงที่ เช่น การเข้่ารหัสด้วยตัวเลข 8หลัก (8บิท) 16หลัก หรือ 32 หลัก</p>
<p>ที่ผมพูดถึง ตัวเลขในที่นี้ หมายถึงเลขฐานสองนะครับ เพราะคอมพิวเตอร์คำนวนโดยใช้เลขฐานสอง และจำนวนหลักที่ว่านี้ก็คือจำนวนหลักของเลขฐานสองนั่นเอง</p>
<h3>ASCII และ Extended ASCII</h3>
<p>ASCII เป็น การเข้ารหัสโดยใช้รหัสแบบ 8 บิท (หรือ 1ไบท์) โดยที่หลักสุดท้ายนั้นจะเป็น 0 เสมอ   <br />โดยเราจะนับหลักหน่วย (หลักขวาสุด) เป็นหลักแรกนะครับ ดังนั้นจะมีจำนวนรหัสที่เป็นไปได้ทั้งหมดที่ 128 รหัส (ก็คือ 0-127 นั่นเอง) ASCII เป็นมาตรฐานที่รวบรวมเอาตัวอักษรและสัญลักษณ์ในภาษาอังกฤษ ซึ่งรวมถึงรหัสอักขระพิเศษที่ไม่ได้ใช้แสดงผลเอาไว้ด้วย (รหัสอักขระพิเศษ คือรหัสอักขระที่มีหน้าที่พิเศษ เช่น ตัดบรรทัด ขึ้นย่อหน้าใหม่ เป็นต้น เป็นอักขระที่ไม่ได้ใช้ในการแสดงผลครับ) ASCII เป็นมาตรฐานแรก ๆ ในโลกที่ยังคงใช้จนถึงปัจจุบันนี้ครับ</p>
<p>Extended ASCII เป็นการเพิ่มเติมส่วนขยายให้แก่ ASCII โดยจะมีการใช้ 1 บิทสุดท้าย (ที่ไม่ได้ใช้ใน ASCII) เพื่อเพิ่มจำนวนรหัสให้มากขึ้นเป็น 256 รหัส เพื่อที่จะเพิ่มรหัสสำหรับตัวอักษรที่ไม่ได้ใช้ในภาษาอังกฤษนั่นเองครับ</p>
<p>ตัวอย่างสำหรับมาตรฐาน Extended ASCII ก็เช่น ISO8859-1 (ชุดตัวอักษรลาติน) TIS620 (ชุดตัวอักษรภาษาไทย) เป็นต้น</p>
<h3>UTF-16</h3>
<p>UTF-16 เป็นมาตรฐานการเข้ารหัสที่กำหนดโดย Unicode เป็นการเข้ารหัสโดยการใช้รหัสตัวเลขที่ยาวถึง 16 หลัก (16บิท หรือ 2 ไบท์) ทำให้สามารถรองรับจำนวนรหัสได้ถึง 65,532 รหัสครับ ที่ต้องมากถึงขนาดนี้เพราะว่า Unicode เป็นมาตรฐานที่รวมเอารหัสของตัวอักษรในภาษาหลัก ๆ ที่ใช้กันในโลกนี้เอาไว้นั่นเอง</p>
<p>UTF-16 สามารถแบ่งย่อย ๆ ได้ตาม Endian ของมัน ก็คือ Big Endian และ Little Endian UTF16 แบบ Little Endian จะเรียกว่า UTF-16le ครับ ท่านที่่ไม่รู้ว่า endian คืออะไร ก็ขอความกรุณาศึกษาเพิ่มเติมเอาเองนะครับ</p>
<h2>Variable-Length Character Encodeing (การเข้ารหัสโดยใช้รหัสที่มีจำนวนหลักไม่คงที่)</h2>
<p>อันนี้ก็จะตรงกันข้าม ก็คือ รหัสแต่ละตัวอาจจะสั้นยาวไม่เท่ากัน ตามแต่ผู้ออกแบบกำหนด โดยส่วนใหญ่จะใช้วิธีกำหนดช่วงเอาไว้ว่า รหัสในช่วงใดช่วงนึงจะมีความยาวที่ระดับนึง ในขณะที่ในอีกช่วงนึงก็จะมีความยาวที่อีกระดับนึง เช่น ตัวอักษร 128 ตัวแรก ใช้รหัสที่ยาว 8 หลัก (8บิท หรือ 1 ไบท์) ในขณะที่ตัวที่เหลือจะใช้ความยาวที่ 16 หลัก (16 บิท หรือ 2 ไบท์) เป็นต้น</p>
<p>การเข้ารหัสแบบนี้เกิดขึ้นในสมัยที่หน่วยความจำยังมีราคาแพง แต่ จำนวนตัวอักษรที่ Extended ASCII รองรับนั้นไม่เพียงพอต่อการใช้งานในบางภาษ เช่น ในภาษาจีนมีอักขระที่แตกต่างกันเป็นหมื่นตัว ภาษาญี่ปุ่นที่มีชุดอักขระมากถึงสามชุด เป็นต้น แต่การที่จะไปใช้การเข้ารหัสแบบ 16 บิทนั้นใช้หน่วยความจำมาถึง 2 เท่าของปรกติ และ ซอฟท์แวร์ที่ใช้จะเข้ากับซอฟท์ดั้งเดิมที่ใช้การเข้ารหัสแบบ 8 บิทไม่ได้ จึงมีการพัฒนาการเข้ารหัสแบบนี้ขึ้นมาครับ</p>
<p>สามภาษาที่เป็นต้นเหตุของการเข้ารหัสแบบนี้นั้น เป็นประเทศในเอเซียตะวันออกทั้งหมดเลย นั่นคือ จีน ญี่ปุ่น และเกาหลี เราจะเรียกกลุ่มเประเทศเรื่องมากพวกนี้ว่า กลุ่ม CJK ครับ</p>
<p>ตัวอย่างของการเข้ารหัสแบบนี้ก็คือ BIG5 (Chinese), Shift-JIS(Japanese), EUC-KR (Korean) เป็นต้น ผมจะไม่พูดถึงรายละเอียดนะครับ แต่ลองค้นคว้ากันดูก็ได้นะ</p>
<h3>UTF-8</h3>
<p>UTF-8 เป็นการเข้ารหัสที่กำหนดโดย UNICODE เช่นเดียวกับ UTF-16 โดยการเข้ารหัสแบบนี้จะใช้รหัสที่สั้นที่สุดที่ 8 บิท (1ไบท์) จนถึงยาวที่สุดที่ 4ไบท์ โดยตัวที่จะบอกว่ารหัสนั้นยาวแค่ไหนก็คือบิทสุดท้ายของไบท์แรกที่อ่านครับ</p>
<ul>
<li>ถ้าหลักสุดท้ายของไบท์แรก คือ 0 รหัสนี้จะยาว 8บิท </li>
<li>ถ้า 3 หลักสุดท้ายของไบท์แรก คือ 110 รหัสนี้จะยาว 16บิท </li>
<li>ถ้า 4 หลักสุดท้ายของไบท์แรก คือ 1110 รหัสนี้จะยาว 32บิท</li>
</ul>
<p>โดยเราจะนับหลักหน่วย (หลักขวาสุด) เป็นหลักแรกนะครับ</p>
<h2>แล้ว Encoding ประเภทไหนที่เราจะใช้ในเกมล่ะ ???</h2>
<p>ก่อนจะพูดถึงว่าเราจะใช้ประเภทไหน เราก็ต้องรู้ก่อนว่าข้อดีข้อเสียของแต่ละประเภทนั้นมันเป็นอะไรบ้างก่อนนะครับ</p>
<p>เมื่อนำทั้งสองตัวมาเปรียบเทียบกัน เราจะเห็นว่า</p>
<ul>
<li>Fixed-Length เนี่ย ข้อดีคือ มันง่ายที่จะ Implement ครับ เพราะรหัสทุกตัวจะยาวเท่ากันหมด ส่วนข้อเสียคือมันใช้พื้นที่เยอะกว่าอีกแบบ </li>
<li>Variable-Length นั้น จะใช้พื้นที่น้อยกว่าครับ โดยเฉพาะถ้าเราเอาตัวอักษรที่ใช้บ่อยมาอยู่ในส่วนที่ใช้รหัสสั้น ๆ ได้ แต่ข้อเสียคือมันค่อนข้างลำบากกว่าที่จะ Implement</li>
</ul>
<p>ดังนั้น ในเกม ซึ่งต้องการ Efficiency มาก ๆ เรามักจะใช้ Fixed-Length สำหรับการแสดงผล เพราะในระบบส่วนใหญ่จะมีหน่วยความจำมากเกินพอสำหรับการใช้งาน Encoding ประเภทนี้ครับ ในกรณีนี้การคำนวนที่เรียบง่ายนั้นเป็นสิ่งที่สำคัญกว่า และ Variable-Length จะใช้ในการส่งข้อมูลระหว่างเครื่องในเน็ทเวิร์ค เพราะขนาดของข้อมูลที่่รับส่งกันภายในเน็ทเวิร์คจะเล้กกว่า Fixed-length ทำให้รับส่งได้เร็วกว่าครับ</p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=226</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>เรื่องวุ่น ๆ กับตัวหนังสือ &#8211; ตอนที่ 2 &#8211; Character vs Glyph</title>
		<link>http://playground-soft.com/wordpress/?p=224</link>
		<comments>http://playground-soft.com/wordpress/?p=224#comments</comments>
		<pubDate>Sun, 08 May 2011 16:51:05 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[เขียนโปรแกรม]]></category>
		<category><![CDATA[Text Rendering]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=224</guid>
		<description><![CDATA[Character แปลตรง ๆ ตัว ก็คือ ตัวอักษร ส่วน Glyph ในความหมายของ Typography หมายถึง ภาพตัวอักษร ถึงตรงนี้หลาย ๆ คนคงเดาออกแล้วว่าอะไรคืออะไร แต่ถ้ายังไม่รู้ ก็อ่านต่อเลยครับ Character คราวนี้จะมีเทคนิคัลเข้ามานิด ๆ นะครับ ไม่ต้องกังวลนะ ยังไม่ลงไปรายละเอียดครับ สิ่งที่เราใช้แยกแยะตัวอักษรนั้นก็คือ ภาพของตัวอักษร (Glyph) และ เราเรียกตัวอักษรใด ๆ ด้วยชื่อ (Character Name) อย่างเช่น เราเรียก ก ว่า &#34;กอไก่&#34; หรือ A ว่า &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=224">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Character แปลตรง ๆ ตัว ก็คือ ตัวอักษร ส่วน Glyph ในความหมายของ Typography หมายถึง ภาพตัวอักษร</p>
<p>ถึงตรงนี้หลาย ๆ คนคงเดาออกแล้วว่าอะไรคืออะไร แต่ถ้ายังไม่รู้ ก็อ่านต่อเลยครับ</p>
<h2>Character</h2>
<p>คราวนี้จะมีเทคนิคัลเข้ามานิด ๆ นะครับ ไม่ต้องกังวลนะ ยังไม่ลงไปรายละเอียดครับ</p>
<p>สิ่งที่เราใช้แยกแยะตัวอักษรนั้นก็คือ ภาพของตัวอักษร (Glyph) และ เราเรียกตัวอักษรใด ๆ ด้วยชื่อ (Character Name) อย่างเช่น เราเรียก ก ว่า &quot;กอไก่&quot; หรือ A ว่า &quot;เอ&quot;</p>
<p>แต่การที่จะให้คอมพิวเตอร์ใช้สิ่งเหล่านั้นอย่างที่คนเราทำมันกลับเป็นเรื่องไม่ง่ายนัก การแยกแยะตัวอักษรจากภาพเป็นเรื่องยากของคอมพิวเตอร์มาหลายสิบปี ส่วนการใช้ชื่อเพื่อที่จะเรียกตัวอักษรนั้นเป็นเรื่องที่กินหน่วยความจำมากไปหน่อย</p>
<p>สิ่งที่คอมพิวเตอร์ใช้ ก็คือ รหัสตัวอักษร (Character Code) รหัสตัวอักษรก็คือรหัสตัวเลขที่คอมพิวเตอร์ใช้เพื่อแทนตัวอักษรนั่นเอง</p>
<p>โดยสรุปก็คือ Character คือ ชนิดของข้อมูลที่เก็บรหัสตัวอักษรไว้ นั่นเองครับ</p>
<p>แน่นอน พอมีรหัส มันก็ต้องมีการเข้ารหัส (Encoding) การเข้ารหัสจะเป็นการกำหนดว่ารหัสที่ใช้นั้นสร้างขึ้นมายังไง เช่น อาจจะเป็นตัวเลขชุดเดียว บอกว่าเป็นตัวอักษรที่เท่าไหร่ นับจากตัว A หรืออาจจะเป็นสองชุด หรืออาจจะเป็นอะไรที่พิสดารกว่านั้น</p>
<p>คุณสามารถสร้าง Encoding ของคุณเองก็ได้ ตราบใดที่เกมคุณสามารถถอดรหัสตัวอักษรได้แล้วแสดงผลได้ถูกต้อง</p>
<p>แต่ถ้าคุณคิดว่ามันไม่ฉลาดนักที่จะสร้างรหัสของตัวเอง ก็มีมาตรฐานให้ใช้อยู่มากมาย มาตรฐานที่ควรรู้จักก็ได้แก่ ASCII, ISO8859, ส่วนมาตรฐานของไทยก็มี มอก.620 เป็นต้น และมาตรฐานที่ใช้ร่วมกันทั่วโลกอย่าง Unicode (ผมจะพูดถึง Unicode ในภายหลังครับ)</p>
<p>เรื่องของ Encoding อยู่ในบทถัดไปครับ</p>
<h2>Glyph</h2>
<p>Glyph นั้นจริง ๆ อธิบายได้ง่าย มันก็คือ “ภาพ” ที่แสดงผลให้เราเห็น ตัวอักษรนั้นคือตัวอะไร</p>
<p>ถ้านึกไม่ออกลองดูภาพข้างล่างนะครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/image1.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/image_thumb1.png" width="93" height="95" /></a></p>
<p>ภาพข้างบนดูแล้วมีตัวอักษรทั้งหมดห้าตัว ซึ่งหน้าตาไม่เหมือนกัน แต่เราแยกแยะได้ว่ามันคือตัวอักษร “ก” ครับ ที่มันหน้าตาไม่เหมือนกันเพราะมันเป็น Glyph คนละตัวกันนั่นเอง (ส่วนสาเหตุที่ Glyph เป็นคนละตัว เพราะเป็น Glyph ที่มาจากคนละฟอนท์ครับ</p>
<p>โปรแกรมคอมพิวเตอร์จะไม่สนใจว่า ไอ้ที่มันวาดอยู่บนจอน่ะมันคือภาพอะไร มันมีหน้าที่รู้แค่ว่า ถ้ามี Character ไหน มันจะเอา Glyph ไหนขึ้นมาวาด ก็เท่านั้นเองครับ</p>
<h2>แล้วไอ้สองตัวนี้มันสัมพันธ์กันอย่างไร ?</h2>
<p>อธิบายมาก็ยาว น่าจะมีคนสงสัยว่า แล้วจะพูดถึงทำไม ??? คำตอบก็คือ คอมพิวเตอร์ จะเก็บข้อมูลเป็น Character และแสดงผล Character นั้นด้วย Glyph ครับ&#160; ซึ่ง Character และ Glyph จะถูกเก็บอยู่ในไฟล์ Font ครับ โดยไฟล์ Font จะเป็นตัวที่บอกว่า Character ไหน ใช้ Glyph ตัวไหนในการวาดครับ</p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=224</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>เรื่องวุ่น ๆ กับตัวหนังสือ &#8211; ตอนที่ 1 &#8211; Non Technical</title>
		<link>http://playground-soft.com/wordpress/?p=221</link>
		<comments>http://playground-soft.com/wordpress/?p=221#comments</comments>
		<pubDate>Sun, 08 May 2011 16:30:41 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[เขียนโปรแกรม]]></category>
		<category><![CDATA[Text Rendering]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=221</guid>
		<description><![CDATA[บทความนี้ยกยอดมาจากที่ผมเขียนเอาไว้ใน TGDX นะครับ สวัสดีครับ วันนี้อยากจะพูดเรื่องตัุวหนังสือกับเกมเสียหน่อย ไม่รู้จะมีใครสนใจมั้ย (แฮ่) จริง ๆ ว่าจะเขียนมาตั้งแต่สองปีที่แล้วแล้ว 55 เอาเถอะ เริ่มเลยละกัน บทความชุดนี้จะมีกี่ตอนก็ยังนึกไม่ออกเหมือนกัน แต่ก็น่าจะยาวในระดับนึงนะครับ ตอนแรกนี้จะขอพูดเรื่องที่ไม่ได้เกี่ยวข้องกับการเขียนโปรแกรมเท่าไหร่ก่อน เป็นการปูพื้นเรื่องน่ะครับ ขอเริ่มจากคำศัพท์ก่อน Typeface คำนี้คือ ชุดของตัวอักษรที่มีลักษณะเหมือนกัน โดยอาจจะมีหลาย ๆ รูปแบบ เช่น ตัวหนา ตัวเอียง เป็นต้น Font เป็นคำที่ได้ยินกันติดหู แต่หลาย ๆ คนคงไม่รู้ว่ามันคืออะไร คำว่าฟอนท์หมายถึง ชุดของตัวอักษร ในรูปแบบใดรูปแบบนึง และอยู่ใน Typeface เดียวกัน ว่ากันง่าย &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=221">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>บทความนี้ยกยอดมาจากที่ผมเขียนเอาไว้ใน TGDX นะครับ</p>
<p>สวัสดีครับ วันนี้อยากจะพูดเรื่องตัุวหนังสือกับเกมเสียหน่อย ไม่รู้จะมีใครสนใจมั้ย (แฮ่) จริง ๆ ว่าจะเขียนมาตั้งแต่สองปีที่แล้วแล้ว 55 เอาเถอะ เริ่มเลยละกัน</p>
<p>บทความชุดนี้จะมีกี่ตอนก็ยังนึกไม่ออกเหมือนกัน <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-thinkingsmile" alt="Thinking smile" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/wlEmoticon-thinkingsmile.png" /> แต่ก็น่าจะยาวในระดับนึงนะครับ ตอนแรกนี้จะขอพูดเรื่องที่ไม่ได้เกี่ยวข้องกับการเขียนโปรแกรมเท่าไหร่ก่อน เป็นการปูพื้นเรื่องน่ะครับ</p>
<ul>
<li>ขอเริ่มจากคำศัพท์ก่อน     <br /><strong>Typeface</strong> คำนี้คือ ชุดของตัวอักษรที่มีลักษณะเหมือนกัน โดยอาจจะมีหลาย ๆ รูปแบบ เช่น ตัวหนา ตัวเอียง เป็นต้น</li>
<li><strong>Font</strong> เป็นคำที่ได้ยินกันติดหู แต่หลาย ๆ คนคงไม่รู้ว่ามันคืออะไร คำว่าฟอนท์หมายถึง ชุดของตัวอักษร ในรูปแบบใดรูปแบบนึง และอยู่ใน Typeface เดียวกัน ว่ากันง่าย ๆ ก็คือ subset ของ typeface นั่นเอง</li>
</ul>
<p>มาถึงตรงนี้หลาย ๆ คนคงสงสัยว่ามันต่างกันยังไง ขอยกตัวอย่างก็แล้วกัน น่าจะเข้าใจง่ายกว่า</p>
<ul>
<li><strong>Arial</strong> เป็น <strong>typeface</strong> </li>
<li><strong>Arial Regular</strong>, <strong>Arial Bold</strong>, <strong>Arial Italic</strong> เป็น <strong>font</strong> ครับ</li>
</ul>
<p>เรื่องของ Typeset vs Font มันค่อนข้างงง ๆ เพราะหลาย ๆ เวปใช้ในคำจำกัดความที่ไม่ค่อยเหมือนกันเท่าไหร่ แต่เอาเป็นว่าแนว ๆ ที่ผมอธิบายก็แล้วกันครับ</p>
<p><strong>Font Family</strong> ก็คือ ชุดของ Typeface ที่มีลักษณะใกล้เคียงกัน เช่น ชุดของฟอนท์ที่มีการใช้น้ำหนักเส้น ชุดของฟอนท์ที่มีเฉพาะสัญลักษณ์ เป็นต้น</p>
<p>Font Family ในภาษาอังกฤษ จะมีอยู่สองชุดหลัก ๆ ก็คือ Serif กับ Sans Serif</p>
<ul>
<li>Serif คือ Font Family ของฟอนท์ที่มี &quot;หัว&quot; และ น้ำหนักของเส้น </li>
<li>ส่วน Sans Serif นั้นจะไม่มีการตวัดตรงหัว ไม่มีน้ำหนักเส้นครับ</li>
</ul>
<p>ตัวอย่างครับ :-   <br /><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/05/image_thumb.png" width="203" height="115" /></a></p>
<p>ในบางครั้งเราอาจจะเห็น Gothic และ Romans ซึ่งจริง ๆ แล้ว Gothic ก็คือ Serif และ Romans ก็คือ Sans Serif ครับ</p>
<p>ในเกม เรามักจะใช้ตัวอักษรแบบ Sans Serif เพราะอ่านง่ายกว่า แลดูไม่รก แต่ในเกมที่ใช้ Theme แบบโบราณ เราก็อาจจะเห็นว่ามีการใช้ Font แบบ Serif บ้างเหมือนกัน เพื่อให้ภาพโดยรวมดูเก่านั่นเอง</p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=221</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Font Converter part#2 Let&#8217;s Try !</title>
		<link>http://playground-soft.com/wordpress/?p=217</link>
		<comments>http://playground-soft.com/wordpress/?p=217#comments</comments>
		<pubDate>Fri, 29 Apr 2011 20:23:39 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[Bitmap Font Creator]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=217</guid>
		<description><![CDATA[คราวที่แล้วพูดถึงเรื่องของที่มา คราวนี้มาพูดถึงเรื่องตัวโปรแกรมกันดีกว่าครับ หลังจากที่ดาวน์โหลดโปรแกรมเสร็จ แตกไฟล์ออกมาแล้วจะมีหน้าตาประมาณนี้ ซึ่งก็จะมีแค่ตัว Executable หนึ่งตัว ไฟล์ DLL นิดหน่อย กับ Folder ที่ชื่อว่า Plugin … โปรแกรมนี้จริง ๆ แล้วไม่มีอะไรเลย เหมือนเป็นโครงหลักให้ผุ้ใช้มาขยายมันมากกว่า ผ่าน Plugin นั่นเองครับ เปิดโปรแกรมกันเลยดีกว่า ทีนี้ กลับมาต่อกันที่ตัวโปรแกรม หลังจากที่เราดับเบิลคลิ๊กตัวไอคอนแดง ๆ แล้ว (แต่ต้องลง .Net Framework ก่อนนะ) จะมีหน้าต่างหลักขึ้นมาแบบนี้ครับ โดยหลัก ๆ แล้วจะมีสองปุ่มใหญ่ ๆ อยู่บนหน้า (และอีกสองปุ่มเล็ก ๆ &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=217">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>คราวที่แล้วพูดถึงเรื่องของที่มา คราวนี้มาพูดถึงเรื่องตัวโปรแกรมกันดีกว่าครับ</p>
<p>หลังจากที่ดาวน์โหลดโปรแกรมเสร็จ แตกไฟล์ออกมาแล้วจะมีหน้าตาประมาณนี้</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb2.png" width="244" height="164" /></a></p>
<p>ซึ่งก็จะมีแค่ตัว Executable หนึ่งตัว ไฟล์ DLL นิดหน่อย กับ Folder ที่ชื่อว่า Plugin … โปรแกรมนี้จริง ๆ แล้วไม่มีอะไรเลย เหมือนเป็นโครงหลักให้ผุ้ใช้มาขยายมันมากกว่า ผ่าน Plugin นั่นเองครับ </p>
<h1>เปิดโปรแกรมกันเลยดีกว่า</h1>
<p>ทีนี้ กลับมาต่อกันที่ตัวโปรแกรม หลังจากที่เราดับเบิลคลิ๊กตัวไอคอนแดง ๆ แล้ว (แต่ต้องลง .Net Framework ก่อนนะ) จะมีหน้าต่างหลักขึ้นมาแบบนี้ครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb3.png" width="244" height="145" /></a></p>
<p>โดยหลัก ๆ แล้วจะมีสองปุ่มใหญ่ ๆ อยู่บนหน้า (และอีกสองปุ่มเล็ก ๆ ซึ่งไม่ได้มีส่วนร่วมอะไรกับเขาเท่าไหร่) สองปุ่มนี้จะทำหน้าที่เปิดหน้าต่างอื่น ขึ้นมา ซึ่งก็มีสองหน้าต่างน่ะล่ะ </p>
<p>หน้าต่างแรกก็คือ</p>
<h2>ตัววาด Glyph</h2>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb4.png" width="244" height="196" /></a></p>
<p>Glyph หมายถึง ภาพตัวอักษร หน้าที่ของหน้าจอนี้คือ มันจะไปดึงเอาภาพ Glyph ในรูปแบบของ Vector จากไฟล์ Truetype ที่เราเปิดขึ้นมา แล้ววาดมันลงไปเป็นไฟล์ภาพแยกกัน พร้อมกับข้อมูลของแต่ละ Glyph ซึ่งจะถูกเขียนลงเป็นไฟล์ XML ครับ</p>
<p>เริ่มจาก เปิดไฟล์ฟอนท์ขึ้นมา แล้วก็กดปุ่ม Update โลด</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image5.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb5.png" width="244" height="196" /></a></p>
<p>จะเห็นตัวหนังสือขึ้นบนหน้าจอ Preview ตรงนี้อาจจะเห็นเป็นตัวขาด ๆ ไม่ค่อยสวย ลองเปลี่ยน Painter Type เป็น Gradient ปรับค่านิดหน่อย ใส่ขอบอีกนิด แล้วกด Preview ดูอีกทีครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image6.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb6.png" width="244" height="187" /></a></p>
<p>เริ่มสวยละนะครับ</p>
<p>ถ้าอยากพรีวิวด้วยข้อความอื่น ก็ลองเปลี่ยนตัวหนังสือในช่อง Text ดูนะครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image7.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb7.png" width="244" height="84" /></a></p>
<p>ในส่วนของ Painter นั้น ถ้าเกิดว่าตัวที่มากับโปรแกรมนั้นไม่ตรงกับที่ต้องการ ผู้ใช้สามารถเขียน Plugin เพิ่มเองได้ครับ โดยการสร้าง DLL ที่เชื่อมเข้ากับ Plugin-Interface.dll ซึ่งวิธีทำขอยกยอดไว้คราวหน้าล่ะกันครับ</p>
<p>เมื่อปรับจนพอใจแล้ว สิ่งต่อไปก็คือ กำหนดว่าให้เซฟไฟล์ไปไว้ที่ Path ไหน และใช้สคริปท์ใดบ้าง ซึ่งในส่วนของสคริปท์ก็คือชุดของ Glyph ที่ฝังอยู่ในไฟล์นั่นเอง โดยส่วนใหญ่จะเป็นเรื่องของภาษาครับ (แต่มีบางส่วนที่เป็นสัญลักษณ์บ้าง) อันนี้อ้างตามมาตรฐาน Unicode ครับ</p>
<p>สิ่งนึงที่ต้องระวังก็คือ ถ้าหากว่า ฟอนท์ต้นฉบับที่เราเอามาใช้ดันไม่มีสคริปท์ตัวที่เลือก ตัวโปรแกรมจะไม่เขียนไฟล์ภาพของสคริปท์นั้นลงไปใน Ouput นะครับ (เพราะไม่รู้จะใช้ตัวไหนนั่นเอง)</p>
<p>ว่าแล้วผมจะเลือกภาษาไทย และภาษาอังกฤษ ก็แล้วกันนะครับ จากนั้นก็เลือกว่าจะเซฟไฟล์ไว้ที่ไหน แล้วกด Start โลด</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image8.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb8.png" width="114" height="244" /></a></p>
<p>โปรแกรมจะทำการเรนเดอร์ไฟล์ภาพ และเขียนข้อมูลที่จำเป็น ลงไปใน Path ที่เราเลือกไว้ครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image9.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb9.png" width="244" height="196" /></a></p>
<p>เสร็จแล้วจะได้ Output แบบนี้</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image10.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb10.png" width="244" height="140" /></a></p>
<p>ภายในไฟล์ xml จะมีข้อมูลของแต่ละ Glyph อยู่ ซึ่ง ก็จะมีบอกว่า Glyph นี้เป็นของ Character Code อะไร ขนาดเท่าไหร่ และข้อมูล Glyph Metrics ซึ่งผมจะพูดถึงในครั้งต่อๆ ไปครับ แต่ถ้าอยากอ่านเอารายละเอียดไว้ก่อนก็ลองอ่านจากเวปของทาง <a href="http://freetype.sourceforge.net/freetype2/docs/glyphs/index.html">Freetype</a> เองดูนะครับ ลองทำความเข้าใจดูนะครับ ไม่ยาก ๆ</p>
<p>ทีนี้กลับมาเรื่องเดิม เรากลับไปหน้าแรก แล้วลองกดปุ่มที่สอง หน้าต่างที่สองก็จะโผล่ออกมาดังนี้ครับ</p>
<h2></h2>
<h2>ตัวสร้างฟอนท์</h2>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image11.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb11.png" width="244" height="151" /></a></p>
<p>หน้าต่างนี้จะทำหน้าที่เอาข้อมูลที่สร้างขึ้นจากหน้าที่แล้ว มารวบรวมมาเป็นไฟล์ฟอนท์ที่เราต้องการครับ สิ่งที่ต้องทำก็คือ เพิ่มไฟล์ xml ที่เราสร้างจากหน้าที่แล้วมาไว้ในลิสต์ แล้วก็กดเริ่มต้น เท่านั้นเอง</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image12.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb12.png" width="244" height="151" /></a></p>
<p>ทีนี้ แล้ว ไฟล์ output ที่ได้นั้นเป็นอย่างไร … อันนี้ขึ้นอยู่กับว่าเลือก Converter อะไร ซึ่งผมใส่ Converter ตัวอย่างมาให้หนึ่งตัว ชื่อว่า Sample Converter นั่นเอง … ตัว Converter นี้จะสร้างไฟล์ฟอนท์เป็นภาษา Lua ตามฟอร์แมทที่ผมใช้ในเกมนึงของผม (ซึ่งล่มไปนานแล้วครับ 555) พร้อมกับไฟล์ภาพพร้อมใช้ครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image13.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb13.png" width="244" height="140" /></a></p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image14.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb14.png" width="208" height="244" /></a><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image15.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb15.png" width="244" height="223" /></a></p>
<p>ส่วน ถ้าอยากได้ฟอร์แมทอื่น คุณสามารถที่จะสร้าง plugin ของตัวเอง แล้วก็เรียกใช้ผ่านหน้าจอนี้เหมือนเดิมได้ครับ</p>
<p>ทีนี้ผมก็ได้ไฟล์ฟอนท์ไว้ใช้งานแล้วเรียบร้อย … ผมก็เอาใส่เข้าไปในตัวเกมผม แล้วก็ทดลองรันดูว่าใช้ได้มั้ย แล้วก็จบครับ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image16.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb16.png" width="244" height="191" /></a></p>
<p>อะไรทำนองนี้ล่ะครับ <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/wlEmoticon-smile.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=217</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Font Converter part#1 A Little Bit of History</title>
		<link>http://playground-soft.com/wordpress/?p=184</link>
		<comments>http://playground-soft.com/wordpress/?p=184#comments</comments>
		<pubDate>Wed, 27 Apr 2011 20:55:41 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[Bitmap Font Creator]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=184</guid>
		<description><![CDATA[น่าจะมีคนไม่เข้าใจว่า … ผมจะทำโปรแกรมนี้ขึ้นมาทำไม ถ้าเริ่มท้าวความไปสมัยตอนที่ทำโปรเจคนี้ใหม่ ๆ ตอนนั้นผมยังคงทำงานอยู่ที่ Sanuk Software ในตำแหน่งโปรแกรมเมอร์ เขียนเกมอยู่น่ะล่ะครับ ก็ได้มีโอกาสได้เห็น Tool หลาย ๆ ตัวที่เขาใช้ในการพัฒนาเกม ซึ่งในจำนวนนั้นก็มีโปรแกรมแปลงฟอนท์อยู่ด้วย เพราะว่า Platform ที่ใช้นั้นไม่รองรับการอ่านไฟล์ true type ซึ่งต่างจาก Windows ดังนั้นก็ต้องมีฟอนท์เฉพาะของมันเอง ในตอนนั้นผมเริ่มที่อยากเขียน Game Engine ของตัวเอง ซึ่งก็ได้มีโอกาสเขียนเหมือนกัน แต่ว่าเขียนในโปรเจคของบริษัท ซึ่งก็เป็นสินทรัพย์ของบริษัทไป ตอนนั้นตัว Engine ถ้าจำไม่ผิดรู้สึกว่ามันยังวาดตัวอักษรไม่ได้ แต่ผมวางแผนเอาไว้แล้วล่ะว่าจะไม่ใช้ระบบ Font ของวินโดวส์ เพราะอยากให้ Engine มัน &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=184">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>น่าจะมีคนไม่เข้าใจว่า … ผมจะทำโปรแกรมนี้ขึ้นมาทำไม ถ้าเริ่มท้าวความไปสมัยตอนที่ทำโปรเจคนี้ใหม่ ๆ ตอนนั้นผมยังคงทำงานอยู่ที่ <a href="http://www.sanuksoftware.com/">Sanuk Software</a> ในตำแหน่งโปรแกรมเมอร์ เขียนเกมอยู่น่ะล่ะครับ ก็ได้มีโอกาสได้เห็น Tool หลาย ๆ ตัวที่เขาใช้ในการพัฒนาเกม ซึ่งในจำนวนนั้นก็มีโปรแกรมแปลงฟอนท์อยู่ด้วย เพราะว่า Platform ที่ใช้นั้นไม่รองรับการอ่านไฟล์ true type ซึ่งต่างจาก Windows ดังนั้นก็ต้องมีฟอนท์เฉพาะของมันเอง</p>
<p>ในตอนนั้นผมเริ่มที่อยากเขียน Game Engine ของตัวเอง ซึ่งก็ได้มีโอกาสเขียนเหมือนกัน แต่ว่าเขียนในโปรเจคของบริษัท ซึ่งก็เป็นสินทรัพย์ของบริษัทไป ตอนนั้นตัว Engine ถ้าจำไม่ผิดรู้สึกว่ามันยังวาดตัวอักษรไม่ได้ แต่ผมวางแผนเอาไว้แล้วล่ะว่าจะไม่ใช้ระบบ Font ของวินโดวส์ เพราะอยากให้ Engine มัน Cross-Platform ได้ (รายละเอียดเกี่ยวกับโปรเจคนี้ผมคงไม่สามารถเปิดเผยได้มากนัก เอาเป็นว่า มันเคยมีละกัน) ก็มีการเตรียมออกแบบไฟล์ฟอนท์ไปบ้าง และมีการเขียนตัวแปลงฟอนท์</p>
<p>แต่หลังจากนั้นผมก็ลาออกจากที่นั่น และก็ไม่ทราบชะตากรรมของมันอีก (จริง ๆ ก็รู้แหละแต่ไม่บอกล่ะนะ 555)</p>
<p>โปรแกรมนี้ ไม่ใช่โปรแกรมแปลงฟอนท์ตัวที่ผมกล่าวถึงขั้นต้น (เพราะตัวนั้นเขียนด้วย Java ซึ่งลบไปนานละ มันยังใช้ไม่ได้ด้วยซ้ำ) แต่โปรแกรมที่ว่ามันก็เป็นจุดกำเนิดของโปรแกรมนี้เหมือนกัน …</p>
<p>อีกเรื่องนึงคือ ตอนนั้น ผมยังเล่นเกมประเภท Date Sim อยู่บ้าง เห็นหลาย ๆ เกมที่มีการวาด Font สวย ๆ ก็เลยอยากทำบ้าง ตัวที่เป็นแรงบันดาลใจจริง ๆ เป็นเกมของ <a href="http://www.studiogu.com/">StudioGU</a> ที่ชื่อว่า Angel’s Tale</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/screenshot3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="screenshot3" border="0" alt="screenshot3" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/screenshot3_thumb.png" width="244" height="191" /></a></p>
<p>ผมเคยคุยกับโปรแกรมเมอร์เกมนี้ เขาว่า เกมนี้ทั้งหมดวาดด้วย GDI และ รวมทั้งตัวอักษรด้วย สังเกตให้ดีว่า ตัวอักษรจะมีการไล่สีในแนวตั้ง (Linear Gradient) และมีเส้นขอบด้านนอก ตัวอักษรจะเปลี่ยนสีไปตามคนพูด อย่างในภาพก็จะเป็นสีฟ้า</p>
<p>นอกจากนี้ก็จะเป็นเกมของ F&amp;C อย่างเกม White Breath ข้างล่างนี้ ซึ่งตัวอักษรจะเป็นแค่ตัวอักษรสีขาวธรรมดา แต่จะมีเงาสีดำอยู่ด้านล่าง ก็ดูดีนะครับ อ้อ ขอบของตัวอักษรเป็น anti-aliasing ด้วยนะ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/screenshot2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="screenshot2" border="0" alt="screenshot2" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/screenshot2_thumb.png" width="244" height="197" /></a></p>
<p>(ปล. เกมนี้ 18+ …)</p>
<p>ผมก็เลยเกิดบ้าพลังขึ้นมา อยากทำตัวแปลงฟอนท์ที่สามารถใส่เอฟเฟคตัวอักษรได้เอง </p>
<p>จริง ๆ ผมก็ตั้งใจเอาไว้ว่าจะทำ Game Engine ของตัวเองด้วย แต่ด้วยความขี้เกียจผมก็ล้มเลิกโปรเจคไป ตัวแปลงฟอนท์ตัวนี้ก็เลย … ไม่รู้จะเอาไปใช้กับอะไร สุดท้าย ผมก็เลยคิดว่า ทำไมเราไม่เอาโปรแกรมไปเปิดโค๊ดซะ แล้วก็ทำให้มันสามารถใช้กับ Engine อะไรก็ได้ ตราบเท่าที่ผู้ใช้สามารถประยุกต์มันได้</p>
<p>โปรแกรมแปลงฟอนท์ของผม ก็เลยไม่มีกำหนดเอาไว้ว่า Output จะหน้าตาเป็นอย่างไร แต่ะจะให้ผู้ใช้เขียน Plugin ขึ้นมาเพื่อที่จะกำหนด output format ของตัวเองซะเลย</p>
<p>หลังจากนั้นสักพักใหญ่ ๆ ผ่านไปสองปี นับจากที่ผมเปิดโค๊ด ผมก็ตัดสินใจอีกอย่างว่า ทำไมเราไม่ให้ผู้ใช้เขียน Plugin ขึ้นมา เพื่อที่จะกำหนดว่าหน้าตาของแต่ละ Glyph (ภาพตัวอักษร) จะเป็นเช่นไร ผมก็เลยทำอย่างนั้น</p>
<p>สรุปว่าตัวโปรแกรมจริง ๆ ก็เลยมีแต่แกนครับ ทุกอย่างผู้ใช้ต้องเขียนเพิ่มเอง อยากได้อะไรก็ทำเอง ว่างั้น !</p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=184</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Playground-soft Font Converter&#8211;build#04132011</title>
		<link>http://playground-soft.com/wordpress/?p=179</link>
		<comments>http://playground-soft.com/wordpress/?p=179#comments</comments>
		<pubDate>Wed, 13 Apr 2011 15:42:37 +0000</pubDate>
		<dc:creator>นายตาหวาน</dc:creator>
				<category><![CDATA[จิปาถะ]]></category>

		<guid isPermaLink="false">http://playground-soft.com/wordpress/?p=179</guid>
		<description><![CDATA[วันนี้เอาเวลาว่าง ๆ วันสงกรานต์มานั่งทำโปรแกรมที่ … ไม่เห็นว่าจะมีคนใช้ … ต่อ นะครับ ที่ทำวันนี้คือนั่งแก้ให้ตัววาด Glyph ทำงานเป็นแบบ Plugin เหมือนกับตัวแปลงไฟล์น่ะล่ะ เดี๋ยวจะเขียนอธิบายเป็น Tutorial สำหรับการเขียน Plugin ไว้ให้ภายในวันสองวันนี้ล่ะ เขียนไม่ยากจริง ๆ เพราะว่าสุดท้ายแล้วก็ขึ้นอยู่กับตัวคนเขียนว่าต้องการอะไรน่ะครับ อ้อ แล้วก็มีการทำไอคอนกับโลโก้ครับ หน้าตาก็เป็นเยี่ยงนี้น่ะ คิดไว้ว่า เดี๋ยวเก็บงานอีกหน่อย จะเริ่มเอาไปโฆษณาใน Gamedev.net แล้วล่ะครับ ก็หวังว่าจะมีคนเอาไปลองใช้มั่ง ปล. ฟอนท์ที่ใช้ทำโลโก้ชื่อว่า Layiji ท่าไม้ตาย ครับ ออกแบบโดยคุณ Layiji เป็นฟอนท์ที่ตัวหนาสะใจเหมาะเอาไว้ทำเกมแนวจีน ๆ มาก &#8230;<p class="read-more"><a href="http://playground-soft.com/wordpress/?p=179">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>วันนี้เอาเวลาว่าง ๆ วันสงกรานต์มานั่งทำโปรแกรมที่ … ไม่เห็นว่าจะมีคนใช้ … ต่อ นะครับ ที่ทำวันนี้คือนั่งแก้ให้ตัววาด Glyph ทำงานเป็นแบบ Plugin เหมือนกับตัวแปลงไฟล์น่ะล่ะ </p>
<p>เดี๋ยวจะเขียนอธิบายเป็น Tutorial สำหรับการเขียน Plugin ไว้ให้ภายในวันสองวันนี้ล่ะ เขียนไม่ยากจริง ๆ เพราะว่าสุดท้ายแล้วก็ขึ้นอยู่กับตัวคนเขียนว่าต้องการอะไรน่ะครับ</p>
<p>อ้อ แล้วก็มีการทำไอคอนกับโลโก้ครับ หน้าตาก็เป็นเยี่ยงนี้น่ะ</p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb.png" width="244" height="147" /></a></p>
<p><a href="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image1.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/image_thumb1.png" width="244" height="239" /></a></p>
<p>คิดไว้ว่า เดี๋ยวเก็บงานอีกหน่อย จะเริ่มเอาไปโฆษณาใน <a href="http://www.gamedev.net/">Gamedev.net</a> แล้วล่ะครับ ก็หวังว่าจะมีคนเอาไปลองใช้มั่ง <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smilewithtongueout" alt="Smile with tongue out" src="http://playground-soft.com/wordpress/wp-content/uploads/2011/04/wlEmoticon-smilewithtongueout.png" /></p>
<p>ปล. ฟอนท์ที่ใช้ทำโลโก้ชื่อว่า <a href="http://www.f0nt.com/release/layiji-%E0%B8%97%E0%B9%88%E0%B8%B2%E0%B9%84%E0%B8%A1%E0%B9%89%E0%B8%95%E0%B8%B2%E0%B8%A2-3/">Layiji ท่าไม้ตาย</a> ครับ ออกแบบโดยคุณ Layiji เป็นฟอนท์ที่ตัวหนาสะใจเหมาะเอาไว้ทำเกมแนวจีน ๆ มาก แต่แนะนำว่าให้ลองติดต่อเจ้าของก่อนนะครับ เพราะฟอนท์ตัวนี้มี License ที่ละเอียดอ่อนนิดนึง คิดว่าถ้าเอาโปรแกรมผมไป Export ฟอนท์นี้ไปใช้โดยไม่บอกเจ้าของนี่อาจจะงานเข้าได้นะ 555</p>
]]></content:encoded>
			<wfw:commentRss>http://playground-soft.com/wordpress/?feed=rss2&#038;p=179</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
	</channel>
</rss>

