<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[irpg Community - Scripting Academy]]></title>
		<link>https://irpg.in.th/</link>
		<description><![CDATA[irpg Community - https://irpg.in.th]]></description>
		<pubDate>Thu, 23 Apr 2026 00:44:08 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[ถามการทำสคริปต์  เมื่อไม่กดคีย์ใดๆ]]></title>
			<link>https://irpg.in.th/thread-2708.html</link>
			<pubDate>Sun, 27 Dec 2015 21:35:19 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=3590">hammer</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2708.html</guid>
			<description><![CDATA[ก็ประมาณว่า<br />
<br />
if (ไม่กดคีย์ใดเลย)<br />
&#36;game_switches[0001]==true<br />
else<br />
&#36;game_switches[0001]==false<br />
end <br />
<br />
ครับ ประมาณนี้ จะเขียนยังไงครับ<br />
<br />
แล้วถ้าเป็นไม่กด คีย์ บางคีย์ อย่าง<br />
<br />
<br />
if (ไม่กดคีย์ C )<br />
&#36;game_switches[0001]==true<br />
else<br />
&#36;game_switches[0001]==false<br />
end <br />
<br />
ประมาณนี้]]></description>
			<content:encoded><![CDATA[ก็ประมาณว่า<br />
<br />
if (ไม่กดคีย์ใดเลย)<br />
&#36;game_switches[0001]==true<br />
else<br />
&#36;game_switches[0001]==false<br />
end <br />
<br />
ครับ ประมาณนี้ จะเขียนยังไงครับ<br />
<br />
แล้วถ้าเป็นไม่กด คีย์ บางคีย์ อย่าง<br />
<br />
<br />
if (ไม่กดคีย์ C )<br />
&#36;game_switches[0001]==true<br />
else<br />
&#36;game_switches[0001]==false<br />
end <br />
<br />
ประมาณนี้]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[รบกวนเกี่ยวกับหาค่าตัวแปร]]></title>
			<link>https://irpg.in.th/thread-2664.html</link>
			<pubDate>Mon, 09 Nov 2015 23:40:29 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2887">Boyss</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2664.html</guid>
			<description><![CDATA[อยากเก็บข้อมูลเช่นชื่อไอเท็มมีอยู่เข้าตัวแปรครับอยากได้ตัวแปรดังนี้ครับ<br />
<br />
1.ชื่อไอเท็มที่มีอยู่ตอนนี้ทั้งหมด เข้าในตัวแปร(ตัวแปร1 = hppotion,mppotion,key,.....)<br />
2.จำนวนแต่ละไอเท็มเช่น potion 10 ขวด (เก็บค่า 10 ไว้ในตัวแปร)<br />
<br />
<br />
รบกวนด้วยครับ]]></description>
			<content:encoded><![CDATA[อยากเก็บข้อมูลเช่นชื่อไอเท็มมีอยู่เข้าตัวแปรครับอยากได้ตัวแปรดังนี้ครับ<br />
<br />
1.ชื่อไอเท็มที่มีอยู่ตอนนี้ทั้งหมด เข้าในตัวแปร(ตัวแปร1 = hppotion,mppotion,key,.....)<br />
2.จำนวนแต่ละไอเท็มเช่น potion 10 ขวด (เก็บค่า 10 ไว้ในตัวแปร)<br />
<br />
<br />
รบกวนด้วยครับ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[สอนการใช้งาน Plugin เบื้องต้น พร้อมตัวอย่างประกอบ]]></title>
			<link>https://irpg.in.th/thread-2635.html</link>
			<pubDate>Mon, 26 Oct 2015 23:57:40 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2730">splendith</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2635.html</guid>
			<description><![CDATA[.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">หมายเหตุ:</span> บทความนี้แนะนำหลักการและวิธีใช้ plugin นะครับ ไม่ใช่วิธีสร้าง *0*<br />
<br />
สวัสดีครับ หลังจากที่เจ้าตัว RPG Maker MV ได้ถูกเปิดตัวแล้ว ก็พบว่ามีสิ่งต่างๆ ที่น่าสนใจมากมาย ซึ่งส่วนที่จะมานำเสนอและแนะนำในวันนี้ คือส่วนของ <span style="font-weight: bold;" class="mycode_b">Plugin</span> ครับ ซึ่งเป็นสิ่งใหม่ที่ถูกนำเสนอในเวอร์ชันนี้<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ก่อนจะอ่านต่อไป ขอนิยามศัพท์เล็กน้อย ซึ่งเป็นศัพท์ที่ไม่เป็นทางการ ใช้ในบทความนี้เท่านั้น</span><br />
<span style="font-weight: bold;" class="mycode_b">ผู้เขียน script</span> - ผู้ที่ใช้งานโปรแกรม RPG Maker MV ในด้านการเขียน Javascript เป็นหลัก<br />
<span style="font-weight: bold;" class="mycode_b">ผู้ใช้งานทั่วไป</span> - ผู้ที่ใช้ RPG Maker MV และไม่ได้เขียน script เป็นหลักหรือไม่ถนัดการใช้ script ใช้ทรัพยากรต่างๆ เพียงในโปรแกรมเท่านั้น เช่น Event, Database, Map, เป็นต้น รวมถึงมือใหม่ด้วยครับ (ใครคิดศัพท์ดีกว่านี้บอกทีครับ *0*)<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">RPG Maker MV Script</span></span><br />
สำหรับผู้ที่ใช้งาน RPG Maker VX Ace, RPG Maker XP หรือเวอร์ชันก่อนหน้ามาก่อน เมื่อมาใช้ RPG Maker MV แล้ว สิ่งที่หลายคนน่าจะสงสัยสิ่งหนึ่งเลยคือ Script Editor หายไปไหน!? ไม่เห็นมีที่ให้เขียน script เลย หรือว่ามันจะกลับไปยุคโบราณที่ไม่สามารถเขียน script ได้!?<br />
<br />
ความจริงแล้ว ในเวอร์ชันนี้ script นั้นไม่ได้หายไปไหน แต่มาอยู่ในรูปแบบภาษา Javascript แทน (Javascript นะครับ ไม่ใช่ JAVA คนละภาษา อย่าสับสนนะ) และ script ต่างๆ นั้นจะอยู่ในโฟลเดอร์ js ที่อยู่ในโฟลเดอร์ project ของเรา ส่วน Script Editor เจ้า RPG Maker เวอร์ชันนี้ก็ได้เอาออกไปเรียบร้อยโรงเรียนจีน~<br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถามที่ผุดในหัวแต่ละคนคงไม่พ้น "แล้วเอา Script Editor ออกไปทำไม"</span><br />
<br />
ถ้าให้บอกเหตุผลจากทางผู้พัฒนา ผมก็คงไม่สามารถทราบได้ แต่ถ้าเป็นเหตุผลที่ผมวิเคราะห์ขึ้น น่าจะประมาณนี้<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">ผู้เขียน script มีอิสระในการเลือก Text Editor ที่ตัวเองถนัด</span> เพราะว่าเป็นไฟล์ text ธรรมดา ทำให้ท่านสามารถเปิดด้วย Text Editor อะไรก็ได้ อย่างผมถนัด Sublime ก็ใช้ตัวนี้เขียน script เลย เป็นต้น<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">เป็นการแบ่งแยกระหว่างผู้เขียน script และผู้ใช้งานทั่วไปได้อย่างชัดเจน</span> ข้อนี้คิดว่าเป็นข้อดีมากๆ ผู้ใช้งานทั่วไปจะไม่มีต้องไปเห็นโค้ดอันแสนยุ่บยั่บให้ปวดใจ ไม่สามารถไปปรับแก้โค้ดได้เลย และผู้เขียน script ทั้งหลายจึงไม่ต้องกังวลแล้วว่าคนอื่นที่นำ script ตัวเองไปใช้จะไปแก้โค้ดจนเกมพังหรือเปล่า ตาม Slogan ของเวอร์ชันนี้เลยครับ "SIMPLE ENOUGH FOR A CHILD. POWERFUL ENOUGH FOR A DEVELOPER."<br />
</li>
</ol>
<br />
<span style="font-weight: bold;" class="mycode_b">คำถามต่อมาก็คงไม่พ้น "อ้าว แล้วคนใช้ RPG Maker ทั่วไป จะเอา script ไปใช้ยังไง ถ้าไม่มีหน้า Script Editor ให้เอาไปวาง"</span><br />
<br />
แน่นอนว่ามันต้องมีทางออก ซึ่งใน RPG Maker MV ทางออกที่ว่าก็คือส่วนที่เรียกว่า <span style="font-weight: bold;" class="mycode_b">"Plugin"</span> นั่นเอง มันคืออะไร ใช้งานอย่างไร มาแทนทีวิธีการเก่าอย่างไร มาดูกันในหัวข้อต่อไปเลย~<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Plugin คืออะไร</span></span><br />
<br />
ในสมัยก่อนนั้น การนำสคริปต์ไปใช้ในเกม สามารถทำได้โดย <br />
<ol type="1" class="mycode_list"><li>copy script จากแหล่งต่างๆ ไปแปะไว้ใน Script Editor<br />
</li>
<li>แก้ไขค่า บรรทัดนู้นบรรทัดนี้ตามวิธีการใช้งานในแต่ละ script <br />
</li>
</ol>
<br />
ปัญหาของวิธีนี้นั่นคือผู้ใช้งานทั่วไปจะรู้สึกว่า วิธีการมันไม่ friendly เอาเสียเลย บางทีอ่านวิธีใช้ผิด แก้ค่าผิด เผลอไปโดนนู่นนี่ใน script เกมก็บั๊ก หรือ crash อย่างง่ายดาย<br />
<br />
Plugin เป็นส่วนที่จะมาเป็นตัวกลางระหว่างผู้เขียน script กับผู้ใช้งานทั่วไป ผ่าน interface ที่เข้าใจง่ายทั้งสองฝ่าย มีหน้าที่ในการนำเข้า script มาใช้งานในเกมแทนวิธีการเก่านั่นเอง ซึ่งข้อดีคือผู้ใช้งานทั่วไปสามารถนำ script มาใช้ได้อย่างง่ายดาย~<br />
<br />
มาดูภาพปลากรอบดีกว่า<br />
<br />
<img src="http://www.mx7.com/i/e64/po2rMB.jpg" loading="lazy"  alt="[Image: po2rMB.jpg]" class="mycode_img" /><br />
<br />
สังเกตว่าในเวอร์ชันเก่านั้น script จะต้องถูกแก้ผ่านตัวโปรแกรม ทำให้ผู้ใช้งานทั่วไปแม้จะไม่มีความรู้เรื่อง script ก็จำเป็นที่จะต้องใช้งาน script อยู่ดีหากต้องลง script จากคนอื่น<br />
<br />
แต่ใน MV นั้น มีสิ่งที่เรียกว่า Plugin Manager เป็นตัวกลางคอยดึง script เข้ามาใช้งานได้อย่างง่ายดาย ผู้ใช้งานทั่วไปไม่จำเป็นต้องเห็นโค้ดแม้แต่ตัวอักษรเดียว<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ข้อดีของระบบ Plugin</span><ul class="mycode_list"><li>ผู้ใช้งานทั่วไปไม่ต้องวุ่นวายกับการแก้ script เลย<br />
</li>
<li>สั่งว่าจะเปิด - ปิดใช้งานได้ทันที อันนี้มีประโยชน์มาก เมื่อก่อนอยาก disable script ถ้า script ออกแบบมาไม่ดีนี่วุ่นวายมาก<br />
</li>
<li>ปรับค่า config หรือ option (ที่ผู้เขียน script กำหนด) ผ่าน Plugin Manager ได้ทันที ไม่ต้องไป set ค่าในโค้ดเลย<br />
</li>
<li>มีระบบ plugin command กับ database note ในตัว ซึ่งจะอธิบายภายหลัง<br />
</li>
</ul>
<br />
<br />
----------<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">กรณีศึกษา 1 - Plugin ที่ทำให้สามารถเปลี่ยนอาวุธระหว่างการต่อสู้ได้</span></span><br />
Plugin ที่จะลองในตัวอย่างนี้จะชื่อว่า ChangeWeaponOnBattle สร้างโดย Sasuke KANNAZUKI เป็น plugin ที่สามารถทำให้ผู้เล่นเปลี่ยนอาวุธและโล่ระหว่างการต่อสู้ได้<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. เลือก plugin (หรือ script) ที่ต้องการ</span><br />
ในโปรแกรม RPG Maker MV ให้เข้าไปที่ Plugin Manager หรือกด F10 ดับเบิลคลิกที่รายการว่างๆ ในส่วนของ Name ใน General Settings จะมีให้เลือก plugin มากมาย จะเห็นว่ามีปลั๊กอินเบื้องต้นอยู่บ้าง <br />
<br />
ในตัวอย่างนี้ให้เลือก ChangeWeaponOnBattle ในช่อง Status เลือก ON (หมายถึงเปิดใช้งาน plugin) จากนั้นลองกด Help... มันจะเป็นการบอกคุณสมบัติวิธีการใช้ต่างๆ จากคนเขียน script ซึ่งหากกดไปแล้วจะมีเขียนบอกว่า This plugin does not provide plugin commands. แปลว่าอะไร เดี๋ยวจะเฉลยในกรณีศึกษาถัดไป<br />
<br />
plugin ตัวดังกล่าวมันแถมมาให้เลยในเกม เลยมีในรายการให้เลือก หากสงสัยว่ารายการนี้มาจากไหน จะเอา plugin อื่นๆ มาลงอย่างไร คำตอบคืออยู่ใน [โฟลเดอร์โปรเจ็กต์]\js\plugins ครับ และหากจะใช้ plugin หรือใช้ script จากที่อื่ีนนั้น จะต้องดาวน์โหลดไฟล์ .js มาวางไว้ที่นี่นั่นเอง <br />
<br />
<img src="http://www.mx7.com/i/6ee/EPCxX5.PNG" loading="lazy"  alt="[Image: EPCxX5.PNG]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. ตั้งค่าพารามิเตอร์</span><br />
เมื่อเลือกเสร็จแล้วจะมีให้ตั้งค่าในส่วนของ Parameters ในส่วนนี้จะเป็นการกำหนดค่าบางอย่างตามข้อตกลงที่ผู้เขียน script อนุญาตให้ผู้ใช้งานทั่วไปปรับแต่งได้ (อารมณ์ตั้งค่า Config ในไฟล์ script ของเวอร์ชันก่อนๆ) ใน plugin ChangeWeaponOnBattle นั้นมีให้ปรับเพียงค่าเดียวคือ commandName ซึ่งมีค่าคือ Equip หากอยากเปลี่ยนค่าหรืออยากรู้ว่ามันทำอะไรได้ ให้ลองกดดับเบิลคลิกเข้าไป จะสามารถเปลี่ยนค่าได้ ซึ่งจะมีคำอธิบายประกอบด้วยว่า parameter ดังกล่าวคืออะไร ในที่นี้หมายถึงข้อความที่ใช้แสดงบนเมนูเปลี่ยนอาวุธในตอนต่อสู้นั่นเอง<br />
<br />
เมื่อตั้งค่าเสร็จแล้ว ให้กด OK แล้วลองรันเกม เข้าฉากต่อสู้ดู จะพบว่าจะมีเมนูใหม่ขึ้นมา ซึ่งเป็นเมนูชื่อ Equip (หรือเป็นชื่ออื่นหากคุณไปเปลี่ยนค่า parameter ที่ได้กล่าวไปเมื่อกี๊) กดแล้วสามารถเปลี่ยนอาวุธและโล่ได้<br />
<br />
<img src="http://www.mx7.com/i/5dc/M61rsG.jpg" loading="lazy"  alt="[Image: M61rsG.jpg]" class="mycode_img" /><br />
<br />
เป็นการจบตัวอย่างแรกในการใช้ plugin ง่ายไหมครับ ไม่ต้องแตะส่วน script ซักนิด แถมตั้งค่า parameter ได้อีกต่างหาก<br />
<br />
<br />
-----------<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">กรณีศึกษา 2 - Plugin สมุด collection มอนสเตอร์หรือศัตรู</span></span><br />
<br />
<img src="http://www.mx7.com/i/c75/eyHgRa.PNG" loading="lazy"  alt="[Image: eyHgRa.PNG]" class="mycode_img" /><br />
<br />
วิธีใช้ plugin ในตัวอย่างนี้จะซับซ้อนขึ้นอีกนิสสส แต่จะครอบคลุมการใช้ plugin ทั้งหมด<br />
plugin ในตัวอย่างนี้จะใช้ของที่แถมมาเช่นเดิม มีชื่อว่า EnemyBook ซึ่งเป็น plugin หนังสือสะสมรายการ Monster / Enemy นั่นเอง จะมีบอกรายละเอียดรวมถึง status ของมอนสเตอร์ รายการจะเป็น unknown จนกว่าจะเจอมอนสเตอร์นั้นๆ (อารมณ์ podedex) ซึ่งเป็นระบบที่นิยมทำในหลายๆ เกม<br />
<br />
เหมือนเดิมเลยครับ เปิด Plugin Manager จากนั้นเลือกไปที่ plugin ชื่อ EnemyBook แล้วทีนี้ลองกด Help ดู พบว่ามีหน้าจอดังนี้<br />
<br />
<img src="http://www.mx7.com/i/d52/Izi36Y.PNG" loading="lazy"  alt="[Image: Izi36Y.PNG]" class="mycode_img" /><br />
<br />
สิ่งที่มีใน plugin นี้คือ Plugin Command และ Enemy Note มันคืออะไรมาดูกัน<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. Plugin Command</span><br />
เป็นคำสั่ง plugin โดยเฉพาะ ใช้ในการกระทำคำสั่งอะไรบางอย่าง เช่นจากภาพ คำสั่ง EnemyBook open หมายถึงการเปิดสมุดภาพนั่นเอง คำสั่งสามารถเรียกใช้งานได้ใน Event Command ชื่อ Plugin Command... อยู่ในหน้าสุดท้ายอันสุดท้ายเลย<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Enemy Note</span><br />
ใครเคยใช้ script ของ RPG Maker VX Ace จะคุ้นเคย Note กันดี หากใครไม่เคยใช้หรือไม่รู้จักก็ไม่เป็นไรครับ ปกติแล้วใน Database แต่ละหมวดนั้นจะเป็นการตั้งค่าคุณลักษณะหรือข้อมูลต่างๆ ในเกม ซึ่งในบางคุณลักษณะนั้นเป็นคุณลักษณะเพิ่มเติมที่มีการเชื่อมโยงไปยัง script บางตัว วิธีการกำหนดคุณลักษณะแบบนี้ เราจะใช้ช่อง Note ใน Database กำหนดเอา ให้ท่านลองเข้าไปที่ Database ในแต่ละหมวด สังเกตว่าแทบทุกหมวดจะมีช่อง Note ด้านล่างขวา ซึ่งเป็นช่องที่สามารถเขียนอะไรลงไปก็ได้ และเขียนคำสั่งพิเศษจาก script ได้ด้วยเช่นกัน! ทีนี้เขียนอะไรยังไง ให้ลองทำตามตัวอย่างกันเล้ยย<br />
<br />
ก่อนอื่นให้กด Ok เพื่อ เปิดใช้งาน plugin ก่อน จากนั้น<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. สร้าง Common Event ที่มีการเรียกใช้ Plugin Command: EnemyBook open ดังนี้</span><br />
<img src="http://www.mx7.com/i/4da/3czV34.jpg" loading="lazy"  alt="[Image: 3czV34.jpg]" class="mycode_img" /><br />
<br />
เป็นการบอกให้ Common Event นี้เปิดหน้าจอรายการมอนสเตอร์ผ่าน Plugin Command ที่ผู้สร้าง script สร้างขึ้นมา<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. สร้าง Item ดังนี้</span><br />
<img src="http://www.mx7.com/i/451/JgKt1u.jpg" loading="lazy"  alt="[Image: JgKt1u.jpg]" class="mycode_img" /><br />
<br />
เป็น Item หนังสือรายการมอนสเตอร์ เมื่อกดใช้จะไปเรียก Common Event ในข้อ 1.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. ไปที่ Enemy Database </span><br />
สังเกตว่าจะมีมอนสเตอร์เริ่มต้นให้ 4 ตัว คือ Bat, Slime, Orc, Monitaur ให้เลือกไปที่ Bat ในช่อง Note ให้ใส่ข้อความดังนี้<br />
&lt;desc1:Very stupid monster.&gt; <br />
&lt;desc2:Can kill easily in one shot.&gt; <br />
<br />
เป็นการใส่รายละเอียดของมอนสเตอร์ Bat <br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. ไปที่ Enemy Database</span><br />
ให้เลือกไปที่ Orc ในช่อง Note ให้ใส่ข้อความดังนี้<br />
&lt;book:no&gt;<br />
<br />
3. สร้างหีบสมบัติอย่างง่ายๆ ใกล้ตัวละคร โดยคลิกขวาที่พื้นในฉาก เลือก Quick Event Creation... &gt; Treasure... เลือกไอเท็มที่สร้างในขั้นตอนก่อนหน้า<br />
<br />
4. ตั้งค่าในฉากที่ตัวละครอยู่ให้มีการเจอมอนสเตอร์ในฉากแบบสุ่ม เลือก Bat*2<br />
<br />
5. ลองเล่นเกม แล้วเปิดหีบรับของทันที ไปที่ Menu Item เลือก Key Item แล้วลองกดใช้ Enemy Book จะพบว่าจะเจอหน้าจอประมาณนี้<br />
<br />
<img src="http://www.mx7.com/i/7d0/eMLEUs.JPG" loading="lazy"  alt="[Image: eMLEUs.JPG]" class="mycode_img" /><br />
<br />
จะพบว่ามี ?????? อยู่ 3 อัน หมายความว่าในเกมมีมอนสเตอร์ที่ถูกบันทึกในหนังสือได้ 3 ชนิด และเรายังไม่เคยเจอมอนสเตอร์ซักตัวมันเลยขึ้น unknown (ถ้าอยากเปลี่ยนจาก ?????? เป็นข้อความอย่างอื่น ก็ไปปรับที่ parameter Unknown Data ใน Plugin Manager ได้)<br />
<br />
จนถึงตรงนี้อาจสงสัยว่าเอ๊ะ ก็ใน Database เมื่อกี๊มันมี 4 ตัวนี่นา ทำไมขึ้นแค่ 3 เหตุผลเพราะว่า Monster Orc เราได้ใส่ &lt;book:no&gt; ในช่อง Note ซึ่งใน Help ของ plugin บอกว่า &lt;book:no&gt; จะทำให้รายการไม่ปรากฏบน Enemy Book นั่นเอง<br />
<br />
6. จากนั้นให้ลองเดินวนๆ จนกว่าจะเจอค้างคาว เมื่อเจอแล้วให้สู้หรือหนีก็ได้ แล้วเข้าไปใช้ไอเท็ม Enemy Book อีกที จะพบว่าข้อมูลค้างคาวได้โผล่มาแล้ว<br />
<img src="http://www.mx7.com/i/813/fGwo9P.JPG" loading="lazy"  alt="[Image: fGwo9P.JPG]" class="mycode_img" /><br />
<br />
พร้อมมีคำอธิบาย<br />
Very stupid monster.<br />
Can kill easily in one shot.<br />
<br />
ที่มุมล่างขวาด้วย เพราะเราได้ใส่คำสั่ง <br />
&lt;desc1:Very stupid monster.&gt; <br />
&lt;desc2:Can kill easily in one shot.&gt;<br />
ลงไปใน Note ของ Bat ตาม Help ของ plugin นั่นเอง<br />
<br />
เท่านี้คุณก็รู้วิธีการใช้ plugin แทบทั้งหมดแล้ว ทีนี้ผมอยากเพิ่มนิดนึง อยากให้มี NPC ลุงอาวุโสที่รู้เรื่องของเจ้า Slimeเป็นอย่างดี เมื่อเราไปคุยกับ NPC แล้วจะทำให้รู้ข้อมูล Slime ทันทีโดยไม่ต้องเคยสู้กับมอนสเตอร์มาก่อน ทำอย่างไรเอ่ยยย ลองทำดูนะ ไม่ยากกก...<br />
<br />
เฉลยยยยยยย~~<br />
<br />
หากดูใน Help ของ plugin นี้ จะพบว่าในส่วนของ Plugin Command มีอธิบายบรรทัดนี้ด้วย<br />
EnemyBook add 3        # Add enemy #3 to the enemy book<br />
<br />
ถ้าแปลแล้วก็หมายถึงเพิ่มข้อมูลศัตรูตาม id ที่ต้องการนั่นเอง เราก็ลองสร้าง Event ลุงแก่แล้วใส่ Plugin Command โดยพลัน<br />
<br />
<img src="http://www.mx7.com/i/bdb/Rm8Kge.JPG" loading="lazy"  alt="[Image: Rm8Kge.JPG]" class="mycode_img" /><br />
<br />
สังเกตว่าผมใช้ EnemyBook add 2 เพราะเลข 2 คือ id ของ Slime สามารถดูลำดับ id ได้ที่หมายเลขหน้าชื่อของ Database <br />
<br />
<img src="http://www.mx7.com/i/4da/DSWOML.JPG" loading="lazy"  alt="[Image: DSWOML.JPG]" class="mycode_img" /><br />
<br />
เมื่อเข้าเกมใหม่ ลองคุยกับลุง แล้วใช้ Item Enemy Book อีกรอบ จะพบว่าข้อมูล Slime โผล่มาทันที แม้จะยังไม่เคยเจอหรือสู้กับ Slime ก็ตาม เป็นต้น<br />
<br />
นอกจากนี้ยังมี Plugin Command อื่นๆ ใน Enemy Book อีก เช่น EnemyBook remove, EnemyBook complete, EnemyBook clear ก็ลองไปเล่นๆ ดูนะครับผม ^^<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">สรุป</span></span><br />
ระบบ Plugin ที่มาใน RPG Maker MV นั้นสามารถอำนวยความสะดวกให้กับผู้ใช้งานทั่วไปได้เป็นอย่างดี และรองรับระบบตั่งค่าผ่าน parameter, note และใช้คำสั่งผ่าน Plugin Command ได้อีกด้วย และมี Help และคำอธิบายในทุกๆ ส่วน ทำให้ผู้ใช้งานทั่วไปสามารถเข้าใจได้ง่าย และไม่ต้องยุ่งกับ script เลย ซึ่งสิ่งที่ผมอยากแนะนำคือ เมื่อนำ plugin มาใช้แล้ว ให้อ่านรายละเอียด และดู Help เสมอครับ<br />
<br />
บทความนี้ได้อธิบายวิธีการใช้งาน plugin ค่อนข้างละเอียด อย่างไรก็ตาม ยังไม่ได้อธิบายการเขียน plugin ซึ่งเป็นเรื่องที่ค่อนข้างซับซ้อนและยุ่งกับส่วนของ javascript เต็มๆ ซึ่งตอนนี้ผมก็กำลังพยายามศึกษาอยู่เหมือนกัน ครับ <img src="https://irpg.in.th/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" /><br />
<br />
ขอให้ใช้งาน RPG Maker MV กันอย่างมีความสุขคร้าบ]]></description>
			<content:encoded><![CDATA[.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">หมายเหตุ:</span> บทความนี้แนะนำหลักการและวิธีใช้ plugin นะครับ ไม่ใช่วิธีสร้าง *0*<br />
<br />
สวัสดีครับ หลังจากที่เจ้าตัว RPG Maker MV ได้ถูกเปิดตัวแล้ว ก็พบว่ามีสิ่งต่างๆ ที่น่าสนใจมากมาย ซึ่งส่วนที่จะมานำเสนอและแนะนำในวันนี้ คือส่วนของ <span style="font-weight: bold;" class="mycode_b">Plugin</span> ครับ ซึ่งเป็นสิ่งใหม่ที่ถูกนำเสนอในเวอร์ชันนี้<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ก่อนจะอ่านต่อไป ขอนิยามศัพท์เล็กน้อย ซึ่งเป็นศัพท์ที่ไม่เป็นทางการ ใช้ในบทความนี้เท่านั้น</span><br />
<span style="font-weight: bold;" class="mycode_b">ผู้เขียน script</span> - ผู้ที่ใช้งานโปรแกรม RPG Maker MV ในด้านการเขียน Javascript เป็นหลัก<br />
<span style="font-weight: bold;" class="mycode_b">ผู้ใช้งานทั่วไป</span> - ผู้ที่ใช้ RPG Maker MV และไม่ได้เขียน script เป็นหลักหรือไม่ถนัดการใช้ script ใช้ทรัพยากรต่างๆ เพียงในโปรแกรมเท่านั้น เช่น Event, Database, Map, เป็นต้น รวมถึงมือใหม่ด้วยครับ (ใครคิดศัพท์ดีกว่านี้บอกทีครับ *0*)<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">RPG Maker MV Script</span></span><br />
สำหรับผู้ที่ใช้งาน RPG Maker VX Ace, RPG Maker XP หรือเวอร์ชันก่อนหน้ามาก่อน เมื่อมาใช้ RPG Maker MV แล้ว สิ่งที่หลายคนน่าจะสงสัยสิ่งหนึ่งเลยคือ Script Editor หายไปไหน!? ไม่เห็นมีที่ให้เขียน script เลย หรือว่ามันจะกลับไปยุคโบราณที่ไม่สามารถเขียน script ได้!?<br />
<br />
ความจริงแล้ว ในเวอร์ชันนี้ script นั้นไม่ได้หายไปไหน แต่มาอยู่ในรูปแบบภาษา Javascript แทน (Javascript นะครับ ไม่ใช่ JAVA คนละภาษา อย่าสับสนนะ) และ script ต่างๆ นั้นจะอยู่ในโฟลเดอร์ js ที่อยู่ในโฟลเดอร์ project ของเรา ส่วน Script Editor เจ้า RPG Maker เวอร์ชันนี้ก็ได้เอาออกไปเรียบร้อยโรงเรียนจีน~<br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถามที่ผุดในหัวแต่ละคนคงไม่พ้น "แล้วเอา Script Editor ออกไปทำไม"</span><br />
<br />
ถ้าให้บอกเหตุผลจากทางผู้พัฒนา ผมก็คงไม่สามารถทราบได้ แต่ถ้าเป็นเหตุผลที่ผมวิเคราะห์ขึ้น น่าจะประมาณนี้<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">ผู้เขียน script มีอิสระในการเลือก Text Editor ที่ตัวเองถนัด</span> เพราะว่าเป็นไฟล์ text ธรรมดา ทำให้ท่านสามารถเปิดด้วย Text Editor อะไรก็ได้ อย่างผมถนัด Sublime ก็ใช้ตัวนี้เขียน script เลย เป็นต้น<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">เป็นการแบ่งแยกระหว่างผู้เขียน script และผู้ใช้งานทั่วไปได้อย่างชัดเจน</span> ข้อนี้คิดว่าเป็นข้อดีมากๆ ผู้ใช้งานทั่วไปจะไม่มีต้องไปเห็นโค้ดอันแสนยุ่บยั่บให้ปวดใจ ไม่สามารถไปปรับแก้โค้ดได้เลย และผู้เขียน script ทั้งหลายจึงไม่ต้องกังวลแล้วว่าคนอื่นที่นำ script ตัวเองไปใช้จะไปแก้โค้ดจนเกมพังหรือเปล่า ตาม Slogan ของเวอร์ชันนี้เลยครับ "SIMPLE ENOUGH FOR A CHILD. POWERFUL ENOUGH FOR A DEVELOPER."<br />
</li>
</ol>
<br />
<span style="font-weight: bold;" class="mycode_b">คำถามต่อมาก็คงไม่พ้น "อ้าว แล้วคนใช้ RPG Maker ทั่วไป จะเอา script ไปใช้ยังไง ถ้าไม่มีหน้า Script Editor ให้เอาไปวาง"</span><br />
<br />
แน่นอนว่ามันต้องมีทางออก ซึ่งใน RPG Maker MV ทางออกที่ว่าก็คือส่วนที่เรียกว่า <span style="font-weight: bold;" class="mycode_b">"Plugin"</span> นั่นเอง มันคืออะไร ใช้งานอย่างไร มาแทนทีวิธีการเก่าอย่างไร มาดูกันในหัวข้อต่อไปเลย~<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Plugin คืออะไร</span></span><br />
<br />
ในสมัยก่อนนั้น การนำสคริปต์ไปใช้ในเกม สามารถทำได้โดย <br />
<ol type="1" class="mycode_list"><li>copy script จากแหล่งต่างๆ ไปแปะไว้ใน Script Editor<br />
</li>
<li>แก้ไขค่า บรรทัดนู้นบรรทัดนี้ตามวิธีการใช้งานในแต่ละ script <br />
</li>
</ol>
<br />
ปัญหาของวิธีนี้นั่นคือผู้ใช้งานทั่วไปจะรู้สึกว่า วิธีการมันไม่ friendly เอาเสียเลย บางทีอ่านวิธีใช้ผิด แก้ค่าผิด เผลอไปโดนนู่นนี่ใน script เกมก็บั๊ก หรือ crash อย่างง่ายดาย<br />
<br />
Plugin เป็นส่วนที่จะมาเป็นตัวกลางระหว่างผู้เขียน script กับผู้ใช้งานทั่วไป ผ่าน interface ที่เข้าใจง่ายทั้งสองฝ่าย มีหน้าที่ในการนำเข้า script มาใช้งานในเกมแทนวิธีการเก่านั่นเอง ซึ่งข้อดีคือผู้ใช้งานทั่วไปสามารถนำ script มาใช้ได้อย่างง่ายดาย~<br />
<br />
มาดูภาพปลากรอบดีกว่า<br />
<br />
<img src="http://www.mx7.com/i/e64/po2rMB.jpg" loading="lazy"  alt="[Image: po2rMB.jpg]" class="mycode_img" /><br />
<br />
สังเกตว่าในเวอร์ชันเก่านั้น script จะต้องถูกแก้ผ่านตัวโปรแกรม ทำให้ผู้ใช้งานทั่วไปแม้จะไม่มีความรู้เรื่อง script ก็จำเป็นที่จะต้องใช้งาน script อยู่ดีหากต้องลง script จากคนอื่น<br />
<br />
แต่ใน MV นั้น มีสิ่งที่เรียกว่า Plugin Manager เป็นตัวกลางคอยดึง script เข้ามาใช้งานได้อย่างง่ายดาย ผู้ใช้งานทั่วไปไม่จำเป็นต้องเห็นโค้ดแม้แต่ตัวอักษรเดียว<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ข้อดีของระบบ Plugin</span><ul class="mycode_list"><li>ผู้ใช้งานทั่วไปไม่ต้องวุ่นวายกับการแก้ script เลย<br />
</li>
<li>สั่งว่าจะเปิด - ปิดใช้งานได้ทันที อันนี้มีประโยชน์มาก เมื่อก่อนอยาก disable script ถ้า script ออกแบบมาไม่ดีนี่วุ่นวายมาก<br />
</li>
<li>ปรับค่า config หรือ option (ที่ผู้เขียน script กำหนด) ผ่าน Plugin Manager ได้ทันที ไม่ต้องไป set ค่าในโค้ดเลย<br />
</li>
<li>มีระบบ plugin command กับ database note ในตัว ซึ่งจะอธิบายภายหลัง<br />
</li>
</ul>
<br />
<br />
----------<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">กรณีศึกษา 1 - Plugin ที่ทำให้สามารถเปลี่ยนอาวุธระหว่างการต่อสู้ได้</span></span><br />
Plugin ที่จะลองในตัวอย่างนี้จะชื่อว่า ChangeWeaponOnBattle สร้างโดย Sasuke KANNAZUKI เป็น plugin ที่สามารถทำให้ผู้เล่นเปลี่ยนอาวุธและโล่ระหว่างการต่อสู้ได้<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. เลือก plugin (หรือ script) ที่ต้องการ</span><br />
ในโปรแกรม RPG Maker MV ให้เข้าไปที่ Plugin Manager หรือกด F10 ดับเบิลคลิกที่รายการว่างๆ ในส่วนของ Name ใน General Settings จะมีให้เลือก plugin มากมาย จะเห็นว่ามีปลั๊กอินเบื้องต้นอยู่บ้าง <br />
<br />
ในตัวอย่างนี้ให้เลือก ChangeWeaponOnBattle ในช่อง Status เลือก ON (หมายถึงเปิดใช้งาน plugin) จากนั้นลองกด Help... มันจะเป็นการบอกคุณสมบัติวิธีการใช้ต่างๆ จากคนเขียน script ซึ่งหากกดไปแล้วจะมีเขียนบอกว่า This plugin does not provide plugin commands. แปลว่าอะไร เดี๋ยวจะเฉลยในกรณีศึกษาถัดไป<br />
<br />
plugin ตัวดังกล่าวมันแถมมาให้เลยในเกม เลยมีในรายการให้เลือก หากสงสัยว่ารายการนี้มาจากไหน จะเอา plugin อื่นๆ มาลงอย่างไร คำตอบคืออยู่ใน [โฟลเดอร์โปรเจ็กต์]\js\plugins ครับ และหากจะใช้ plugin หรือใช้ script จากที่อื่ีนนั้น จะต้องดาวน์โหลดไฟล์ .js มาวางไว้ที่นี่นั่นเอง <br />
<br />
<img src="http://www.mx7.com/i/6ee/EPCxX5.PNG" loading="lazy"  alt="[Image: EPCxX5.PNG]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. ตั้งค่าพารามิเตอร์</span><br />
เมื่อเลือกเสร็จแล้วจะมีให้ตั้งค่าในส่วนของ Parameters ในส่วนนี้จะเป็นการกำหนดค่าบางอย่างตามข้อตกลงที่ผู้เขียน script อนุญาตให้ผู้ใช้งานทั่วไปปรับแต่งได้ (อารมณ์ตั้งค่า Config ในไฟล์ script ของเวอร์ชันก่อนๆ) ใน plugin ChangeWeaponOnBattle นั้นมีให้ปรับเพียงค่าเดียวคือ commandName ซึ่งมีค่าคือ Equip หากอยากเปลี่ยนค่าหรืออยากรู้ว่ามันทำอะไรได้ ให้ลองกดดับเบิลคลิกเข้าไป จะสามารถเปลี่ยนค่าได้ ซึ่งจะมีคำอธิบายประกอบด้วยว่า parameter ดังกล่าวคืออะไร ในที่นี้หมายถึงข้อความที่ใช้แสดงบนเมนูเปลี่ยนอาวุธในตอนต่อสู้นั่นเอง<br />
<br />
เมื่อตั้งค่าเสร็จแล้ว ให้กด OK แล้วลองรันเกม เข้าฉากต่อสู้ดู จะพบว่าจะมีเมนูใหม่ขึ้นมา ซึ่งเป็นเมนูชื่อ Equip (หรือเป็นชื่ออื่นหากคุณไปเปลี่ยนค่า parameter ที่ได้กล่าวไปเมื่อกี๊) กดแล้วสามารถเปลี่ยนอาวุธและโล่ได้<br />
<br />
<img src="http://www.mx7.com/i/5dc/M61rsG.jpg" loading="lazy"  alt="[Image: M61rsG.jpg]" class="mycode_img" /><br />
<br />
เป็นการจบตัวอย่างแรกในการใช้ plugin ง่ายไหมครับ ไม่ต้องแตะส่วน script ซักนิด แถมตั้งค่า parameter ได้อีกต่างหาก<br />
<br />
<br />
-----------<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">กรณีศึกษา 2 - Plugin สมุด collection มอนสเตอร์หรือศัตรู</span></span><br />
<br />
<img src="http://www.mx7.com/i/c75/eyHgRa.PNG" loading="lazy"  alt="[Image: eyHgRa.PNG]" class="mycode_img" /><br />
<br />
วิธีใช้ plugin ในตัวอย่างนี้จะซับซ้อนขึ้นอีกนิสสส แต่จะครอบคลุมการใช้ plugin ทั้งหมด<br />
plugin ในตัวอย่างนี้จะใช้ของที่แถมมาเช่นเดิม มีชื่อว่า EnemyBook ซึ่งเป็น plugin หนังสือสะสมรายการ Monster / Enemy นั่นเอง จะมีบอกรายละเอียดรวมถึง status ของมอนสเตอร์ รายการจะเป็น unknown จนกว่าจะเจอมอนสเตอร์นั้นๆ (อารมณ์ podedex) ซึ่งเป็นระบบที่นิยมทำในหลายๆ เกม<br />
<br />
เหมือนเดิมเลยครับ เปิด Plugin Manager จากนั้นเลือกไปที่ plugin ชื่อ EnemyBook แล้วทีนี้ลองกด Help ดู พบว่ามีหน้าจอดังนี้<br />
<br />
<img src="http://www.mx7.com/i/d52/Izi36Y.PNG" loading="lazy"  alt="[Image: Izi36Y.PNG]" class="mycode_img" /><br />
<br />
สิ่งที่มีใน plugin นี้คือ Plugin Command และ Enemy Note มันคืออะไรมาดูกัน<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. Plugin Command</span><br />
เป็นคำสั่ง plugin โดยเฉพาะ ใช้ในการกระทำคำสั่งอะไรบางอย่าง เช่นจากภาพ คำสั่ง EnemyBook open หมายถึงการเปิดสมุดภาพนั่นเอง คำสั่งสามารถเรียกใช้งานได้ใน Event Command ชื่อ Plugin Command... อยู่ในหน้าสุดท้ายอันสุดท้ายเลย<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Enemy Note</span><br />
ใครเคยใช้ script ของ RPG Maker VX Ace จะคุ้นเคย Note กันดี หากใครไม่เคยใช้หรือไม่รู้จักก็ไม่เป็นไรครับ ปกติแล้วใน Database แต่ละหมวดนั้นจะเป็นการตั้งค่าคุณลักษณะหรือข้อมูลต่างๆ ในเกม ซึ่งในบางคุณลักษณะนั้นเป็นคุณลักษณะเพิ่มเติมที่มีการเชื่อมโยงไปยัง script บางตัว วิธีการกำหนดคุณลักษณะแบบนี้ เราจะใช้ช่อง Note ใน Database กำหนดเอา ให้ท่านลองเข้าไปที่ Database ในแต่ละหมวด สังเกตว่าแทบทุกหมวดจะมีช่อง Note ด้านล่างขวา ซึ่งเป็นช่องที่สามารถเขียนอะไรลงไปก็ได้ และเขียนคำสั่งพิเศษจาก script ได้ด้วยเช่นกัน! ทีนี้เขียนอะไรยังไง ให้ลองทำตามตัวอย่างกันเล้ยย<br />
<br />
ก่อนอื่นให้กด Ok เพื่อ เปิดใช้งาน plugin ก่อน จากนั้น<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. สร้าง Common Event ที่มีการเรียกใช้ Plugin Command: EnemyBook open ดังนี้</span><br />
<img src="http://www.mx7.com/i/4da/3czV34.jpg" loading="lazy"  alt="[Image: 3czV34.jpg]" class="mycode_img" /><br />
<br />
เป็นการบอกให้ Common Event นี้เปิดหน้าจอรายการมอนสเตอร์ผ่าน Plugin Command ที่ผู้สร้าง script สร้างขึ้นมา<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. สร้าง Item ดังนี้</span><br />
<img src="http://www.mx7.com/i/451/JgKt1u.jpg" loading="lazy"  alt="[Image: JgKt1u.jpg]" class="mycode_img" /><br />
<br />
เป็น Item หนังสือรายการมอนสเตอร์ เมื่อกดใช้จะไปเรียก Common Event ในข้อ 1.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. ไปที่ Enemy Database </span><br />
สังเกตว่าจะมีมอนสเตอร์เริ่มต้นให้ 4 ตัว คือ Bat, Slime, Orc, Monitaur ให้เลือกไปที่ Bat ในช่อง Note ให้ใส่ข้อความดังนี้<br />
&lt;desc1:Very stupid monster.&gt; <br />
&lt;desc2:Can kill easily in one shot.&gt; <br />
<br />
เป็นการใส่รายละเอียดของมอนสเตอร์ Bat <br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. ไปที่ Enemy Database</span><br />
ให้เลือกไปที่ Orc ในช่อง Note ให้ใส่ข้อความดังนี้<br />
&lt;book:no&gt;<br />
<br />
3. สร้างหีบสมบัติอย่างง่ายๆ ใกล้ตัวละคร โดยคลิกขวาที่พื้นในฉาก เลือก Quick Event Creation... &gt; Treasure... เลือกไอเท็มที่สร้างในขั้นตอนก่อนหน้า<br />
<br />
4. ตั้งค่าในฉากที่ตัวละครอยู่ให้มีการเจอมอนสเตอร์ในฉากแบบสุ่ม เลือก Bat*2<br />
<br />
5. ลองเล่นเกม แล้วเปิดหีบรับของทันที ไปที่ Menu Item เลือก Key Item แล้วลองกดใช้ Enemy Book จะพบว่าจะเจอหน้าจอประมาณนี้<br />
<br />
<img src="http://www.mx7.com/i/7d0/eMLEUs.JPG" loading="lazy"  alt="[Image: eMLEUs.JPG]" class="mycode_img" /><br />
<br />
จะพบว่ามี ?????? อยู่ 3 อัน หมายความว่าในเกมมีมอนสเตอร์ที่ถูกบันทึกในหนังสือได้ 3 ชนิด และเรายังไม่เคยเจอมอนสเตอร์ซักตัวมันเลยขึ้น unknown (ถ้าอยากเปลี่ยนจาก ?????? เป็นข้อความอย่างอื่น ก็ไปปรับที่ parameter Unknown Data ใน Plugin Manager ได้)<br />
<br />
จนถึงตรงนี้อาจสงสัยว่าเอ๊ะ ก็ใน Database เมื่อกี๊มันมี 4 ตัวนี่นา ทำไมขึ้นแค่ 3 เหตุผลเพราะว่า Monster Orc เราได้ใส่ &lt;book:no&gt; ในช่อง Note ซึ่งใน Help ของ plugin บอกว่า &lt;book:no&gt; จะทำให้รายการไม่ปรากฏบน Enemy Book นั่นเอง<br />
<br />
6. จากนั้นให้ลองเดินวนๆ จนกว่าจะเจอค้างคาว เมื่อเจอแล้วให้สู้หรือหนีก็ได้ แล้วเข้าไปใช้ไอเท็ม Enemy Book อีกที จะพบว่าข้อมูลค้างคาวได้โผล่มาแล้ว<br />
<img src="http://www.mx7.com/i/813/fGwo9P.JPG" loading="lazy"  alt="[Image: fGwo9P.JPG]" class="mycode_img" /><br />
<br />
พร้อมมีคำอธิบาย<br />
Very stupid monster.<br />
Can kill easily in one shot.<br />
<br />
ที่มุมล่างขวาด้วย เพราะเราได้ใส่คำสั่ง <br />
&lt;desc1:Very stupid monster.&gt; <br />
&lt;desc2:Can kill easily in one shot.&gt;<br />
ลงไปใน Note ของ Bat ตาม Help ของ plugin นั่นเอง<br />
<br />
เท่านี้คุณก็รู้วิธีการใช้ plugin แทบทั้งหมดแล้ว ทีนี้ผมอยากเพิ่มนิดนึง อยากให้มี NPC ลุงอาวุโสที่รู้เรื่องของเจ้า Slimeเป็นอย่างดี เมื่อเราไปคุยกับ NPC แล้วจะทำให้รู้ข้อมูล Slime ทันทีโดยไม่ต้องเคยสู้กับมอนสเตอร์มาก่อน ทำอย่างไรเอ่ยยย ลองทำดูนะ ไม่ยากกก...<br />
<br />
เฉลยยยยยยย~~<br />
<br />
หากดูใน Help ของ plugin นี้ จะพบว่าในส่วนของ Plugin Command มีอธิบายบรรทัดนี้ด้วย<br />
EnemyBook add 3        # Add enemy #3 to the enemy book<br />
<br />
ถ้าแปลแล้วก็หมายถึงเพิ่มข้อมูลศัตรูตาม id ที่ต้องการนั่นเอง เราก็ลองสร้าง Event ลุงแก่แล้วใส่ Plugin Command โดยพลัน<br />
<br />
<img src="http://www.mx7.com/i/bdb/Rm8Kge.JPG" loading="lazy"  alt="[Image: Rm8Kge.JPG]" class="mycode_img" /><br />
<br />
สังเกตว่าผมใช้ EnemyBook add 2 เพราะเลข 2 คือ id ของ Slime สามารถดูลำดับ id ได้ที่หมายเลขหน้าชื่อของ Database <br />
<br />
<img src="http://www.mx7.com/i/4da/DSWOML.JPG" loading="lazy"  alt="[Image: DSWOML.JPG]" class="mycode_img" /><br />
<br />
เมื่อเข้าเกมใหม่ ลองคุยกับลุง แล้วใช้ Item Enemy Book อีกรอบ จะพบว่าข้อมูล Slime โผล่มาทันที แม้จะยังไม่เคยเจอหรือสู้กับ Slime ก็ตาม เป็นต้น<br />
<br />
นอกจากนี้ยังมี Plugin Command อื่นๆ ใน Enemy Book อีก เช่น EnemyBook remove, EnemyBook complete, EnemyBook clear ก็ลองไปเล่นๆ ดูนะครับผม ^^<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">สรุป</span></span><br />
ระบบ Plugin ที่มาใน RPG Maker MV นั้นสามารถอำนวยความสะดวกให้กับผู้ใช้งานทั่วไปได้เป็นอย่างดี และรองรับระบบตั่งค่าผ่าน parameter, note และใช้คำสั่งผ่าน Plugin Command ได้อีกด้วย และมี Help และคำอธิบายในทุกๆ ส่วน ทำให้ผู้ใช้งานทั่วไปสามารถเข้าใจได้ง่าย และไม่ต้องยุ่งกับ script เลย ซึ่งสิ่งที่ผมอยากแนะนำคือ เมื่อนำ plugin มาใช้แล้ว ให้อ่านรายละเอียด และดู Help เสมอครับ<br />
<br />
บทความนี้ได้อธิบายวิธีการใช้งาน plugin ค่อนข้างละเอียด อย่างไรก็ตาม ยังไม่ได้อธิบายการเขียน plugin ซึ่งเป็นเรื่องที่ค่อนข้างซับซ้อนและยุ่งกับส่วนของ javascript เต็มๆ ซึ่งตอนนี้ผมก็กำลังพยายามศึกษาอยู่เหมือนกัน ครับ <img src="https://irpg.in.th/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" /><br />
<br />
ขอให้ใช้งาน RPG Maker MV กันอย่างมีความสุขคร้าบ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[อยากได้สคริปต์ เดินมีเสียงอะคับ]]></title>
			<link>https://irpg.in.th/thread-2491.html</link>
			<pubDate>Sun, 05 Jul 2015 16:19:48 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2972">Pethple</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2491.html</guid>
			<description><![CDATA[ตามหัวข้อคับ<br />
เหตูผล<br />
1 หายาก อยากให้ช่วยไปหา<br />
2 ไม่ค่อยมีเวลาหา<br />
3 ต้องการด่วน<br />
4 คิดไม่ออก อิอิ<br />
<br />
<br />
อาริกาโตะ]]></description>
			<content:encoded><![CDATA[ตามหัวข้อคับ<br />
เหตูผล<br />
1 หายาก อยากให้ช่วยไปหา<br />
2 ไม่ค่อยมีเวลาหา<br />
3 ต้องการด่วน<br />
4 คิดไม่ออก อิอิ<br />
<br />
<br />
อาริกาโตะ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Script Workshop - มาสร้างไอเท็ม Exp, Gold X2 ในฉากต่อสู้กัน]]></title>
			<link>https://irpg.in.th/thread-2458.html</link>
			<pubDate>Sun, 14 Jun 2015 13:37:17 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2730">splendith</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2458.html</guid>
			<description><![CDATA[<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Script Workshop - มาสร้างไอเท็ม Exp, Gold X2 ในฉากต่อสู้กัน</span></span><br />
<br />
บทความนี้จะสอนการเขียน script ขึ้นมา ซึ่งจะเล่าแนวคิดการเขียนตั้งแต่ต้นจนจบ หากฝึกจนชำนาญแล้ว ท่านสามารถนำไปประยุกต์ใช้ทำ script อื่นๆ แจกจ่ายได้เลย ^^ (เขียนสลับไปมากับบทความพื้นฐาน เดี๋ยวคนมีความรู้อยู่แล้วจะเบื่อซะก่อน แหะๆ)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ความยาก:</span> ปานกลาง<br />
<span style="font-weight: bold;" class="mycode_b">ความรู้พื้นฐานที่ควรมี</span><ul class="mycode_list"><li>การเขียนโปรแกรมเชิงวัตถุบน Ruby (พวก class, object ทั้งหลาย) โดยสังเขป<br />
</li>
<li><a href="http://irpg.in.th/thread-2441.html" target="_blank" rel="noopener" class="mycode_url">พื้นฐานการโม script เบื้องต้น</a><br />
</li>
</ul>
ลองอ่านๆ แล้วค่อยๆ ทำความเข้าใจดูนะครับ ถ้าพอเข้าใจคอนเซ็ปต์ก็เวิคเลย แต่ถ้าอ่านแล้วไม่รู้เรื่องไม่ต้องกังวลไปครับ วันไหนที่มีความรู้พื้นฐานแล้วกลับมาอ่านใหม่ ท่านจะเข้าใจมากขึ้น<br />
<br />
ในบทความนี้จะทำการเขียน script สร้างไอเท็มดังนี้<br />
<ol type="1" class="mycode_list"><li>Rich Potion - ใช้แล้ว Gold X2 ในฉากต่อสู้ เป็นระยะเวลา 1000 ก้าว<br />
</li>
<li>Master Potion - ใช้แล้ว Exp X2 ในฉากต่อสู้ เป็นระยะเวลา 1000 ก้าว<br />
</li>
</ol>
<img src="http://upic.me/i/jo/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
ซึ่งเมื่อใช้งานไอเท็มแล้ว จะมีสถานะบอกที่มุมบนขวาของจอด้วย<br />
<br />
<img src="http://upic.me/i/c1/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
และเมื่อไอเท็มหมดฤทธิ์ กล่องข้อความก็จะหายไปอัตโนมัติ เพื่อไม่ให้รกจอนั่นเอง<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">แนวคิดของผม</span></span><br />
แน่นอนว่าวิธีการเขียนอาจจะมีหลายวิธี ไม่มีผิดไม่มีถูกเสมอไป แต่ผมจะยึดแนวคิดของผมเป็นหลักในบทความนี้ สมมุติว่าผมอยากทำ script อันนึงเพื่อแจกจ่ายผู้อื่น หากเริ่มตั้งแต่ 0 ผมมีกระบวนการคิดอย่างไรในการเขียนมันขึ้นมา<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">1. สร้างไฟล์เปล่าขึ้นมาก่อนเลย</span></span><br />
แน่นอนว่าการนำ script ไปแจกคนอื่นนั้น จะต้องสร้างไฟล์ script ขึ้นมาเพื่อให้ผู้อื่นนำไฟล์ script เราไปใช้ในอนาคต ให้คลิกขวาสร้างไฟล์เปล่าขึ้นมา แล้วตั้งชื่อว่า Bonus Exp, Gold<br />
<span style="font-weight: bold;" class="mycode_b">หมายเหตุ: </span>เราจะไม่แก้โค้ดเดิมเด็ดขาดนะครับ ให้จำเอาไว้ว่าทุกครั้งที่ให้เขียนโค้ดหรือแก้โค้ด มันคือการเขียนที่ไฟล์ที่เราสร้างใหม่นี้เสมอครับ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">2. ทำทีละอย่าง</span></span><br />
หากยังไม่ชำนาญแล้ว แนะนำให้แก้โจทย์ทีละอย่างครับ เพื่อง่ายต่อความเข้าใจ<br />
ดังนั้นในส่วนแรกนี้ผมจะทำแต่ไอเท็ม gold X2 โดยยังไม่ไปยุ่งกับ exp นะครับ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">3. หาโค้ดส่วนที่ได้รับ gold หลังการต่อสู้</span></span><br />
ผมก็จะวิเคราะห์ก่อนว่า ถ้าเราจะให้ gold x2 ก็ควรจะต้องคูณมันตอนเราได้รับเงินหลังต่อสู้ใช่ไหมครับ ซึ่ง script ที่จัดการเกี่ยวกับการต่อสู้ทั้งหมดนั้น อยู่ใน module BattleManager (ไฟล์ประมาณบนซ้าย) ว่าแล้วผมก็กดเข้าไปทันที ลองหาๆ ด้วย Ctrl + F ดูแล้ว ก็จะได้โค้ดที่เข้าเค้าที่สุด อยู่ที่ประมาณบรรทัดที่ 316 ดังรูป<br />
<br />
<img src="http://upic.me/i/yp/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
ว่าแล้วก็ทำการ overwrite code นี้ออกมาไว้ที่ไฟล์เปล่าของเราที่สร้างในขั้นตอนที่ 1 เลย (ครอบด้วย module BattleManager ด้วยนะ ในกรณีที่เป็น module ไม่ใช่ class เราจะครอบด้วย module แทน)<br />
<br />
[shcode=rails]<br />
module BattleManager<br />
  def self.gain_gold<br />
    if &#36;game_troop.gold_total &gt; 0<br />
      text = sprintf(Vocab::ObtainGold, &#36;game_troop.gold_total)<br />
      &#36;game_message.add('\.' + text)<br />
      &#36;game_party.gain_gold(&#36;game_troop.gold_total)<br />
    end<br />
    wait_for_message<br />
  end<br />
end<br />
[/shcode]<br />
อยากให้ gold x2 ทำยังไงครับ ผมลองเดาโค้ดแล้วแก้ดูเป็นดังนี้<br />
[shcode=rails]<br />
module BattleManager<br />
  def self.gain_gold<br />
    if &#36;game_troop.gold_total &gt; 0<br />
      text = sprintf(Vocab::ObtainGold, &#36;game_troop.gold_total * 2) # แก้บรรทัดนี้<br />
      &#36;game_message.add('\.' + text)<br />
      &#36;game_party.gain_gold(&#36;game_troop.gold_total * 2) # แก้บรรทัดนี้<br />
    end<br />
    wait_for_message<br />
  end<br />
end<br />
[/shcode]<br />
ให้ลองรันเกมดู แล้วไปหาเรื่องสู้กับมอนสเตอร์ ตรวจสอบดูว่าได้เงินเพิ่มจริงหรือไม่ ถ้าเงินเพิ่มจริง แปลว่าเดาถูกแล้วล่ะ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">4. ควบคุมเงื่อนไขการคูณ gold ด้วยบงการอะไรซักอย่าง</span></span><br />
ทีนี้สิ่งที่ผมอยากได้นั้นไม่ใช่ gold X2 ตลอดกาลแบบนี้ แต่ต้องการให้ gold X2 เฉพาะเวลาที่ใช้ไอเท็ม และมีเวลาจำกัดเป็นจำนวนก้าว ดังนั้น ผมจะไม่เขียน * 2 ไปตรงๆ แบบนั้นแล้ว แต่จะนำไปคุณตัวแปรอะไรสักอย่างที่คอยบงการอีกที <br />
<br />
ซึ่งถ้าเราอ่านโค้ดบรรทัดที่ 6 ดูดีๆ แล้ว เราจะเดาได้ว่ามันคือคำสั่งเพิ่มเงินให้กับปาร์ตี้ของเราด้วยจำนวนที่ระบุในวงเล็บ และมีตัวแปร &#36;game_party ในการควบคุมข้อมูลปาร์ตี้อยู่ ดังนั้น ผมจะเพิ่มเจ้าตัวแปรบงการการคูณเงินของเราในข้อมูลปาร์ตี้เช่นกัน ซึ่งเราก็ต้องไปดูว่าตัวแปร &#36;game_party นั้นมันไปอ่านข้อมูลจากโค้ดที่ไหน ในขั้นตอนนี้ให้ไปดูที่ไฟล์ script ใน module DataManager ครับ ให้สังเกตประมาณบรรทัดที่ 82+<br />
<img src="http://upic.me/i/q1/6capture.jpg" loading="lazy"  alt="[Image: 6capture.jpg]" class="mycode_img" /><br />
ในบรรทัดที่ 91 เราจะเห็นว่ามีการประกาศตัวแปร &#36;game_party ให้มีค่าเท่ากับ Game_Party.new ในบรรทัดนี้ถ้ามีความรู้การเขียนโปรแกรมเชิงวัตถุ จะทราบว่า ให้เป็นการสร้าง object &#36;game_party ขึ้นมาด้วยคลาส Game_Party ดังนั้น เรารู้แล้วว่าข้อมูล &#36;game_party มาจากคลาส Game_Party ให้เราตรวจสอบดูรายการ script ด้านซ้ายดูครับ เราก็จะเห็นไฟล์ Game_Party ที่มี class Game_Party ด้านใน<br />
<br />
การเก็บข้อมูลอัตราการคูณเงิน กับจำนวนก้าวที่เหลือ เราควรเก็บข้อมูลในคลาสดังกล่าว เพราะเหมาะสมในการเป็นข้อมูลที่เกี่ยวกับปาร์ตี้ที่สุดแล้ว<br />
<br />
ในขั้นตอนนี้เราจะทำการเพิ่มตัวแปรในคลาส Game_Party ด้วยวิธีการ overwrite ครับ ให้ไปที่ไฟล์ของเราที่สร้างขึ้นในขั้นตอนที่ 1 แล้วเขียนโค้ดต่อจากเดิมดังนี้ (ไม่ต้องลบของเก่านะครับ เขียนต่อลงมาด้านล่างเลย)<br />
[shcode=rails]<br />
# ----------------------------------------------------------<br />
# โค้ดเก่าในส่วนของ module BattleManager ละไว้ในฐานที่เข้าใจ<br />
# ----------------------------------------------------------<br />
<br />
class Game_Party &lt; Game_Unit # ก็อบหัวมาจากไฟล์ Game_Party<br />
  # ส่วนนี้เป็นการบอกว่าตัวแปร @bonus_gold, @bonus_gold_step สามารถถูกอ่านค่าจากภายนอกได้<br />
  attr_reader :bonus_gold<br />
  attr_reader :bonus_gold_step<br />
  <br />
  # ส่วนนี้เหมาะกับการกำหนดค่าเริ่มต้นของตัวแปร<br />
  alias_method :initialize_copied, :initialize<br />
  def initialize<br />
    initialize_copied<br />
    @bonus_gold = 1<br />
    @bonus_gold_step = 0<br />
  end<br />
end<br />
[/shcode]<br />
โค้ดดังกล่าว เราจะทำการเพิ่มตัวแปร @bonus_gold, @bonus_gold_step ขึ้นมา ซึ่งเป็นตัวแปรประเภท class variable กล่าวคือตัวแปรนี้จะมีขอบเขตการใช้งานได้ในคลาสนี้เท่านั้น (มี @ นำหน้า)<ul class="mycode_list"><li>@bonus_gold - ใช้เก็บข้อมูลอัตราส่วนการได้เงิน เช่น ถ้า @bonus_gold = 2 คือ gold X2 เป็นต้น ซึ่งควรมีค่าเริ่มต้นเป็น 1 (gold x1)<br />
</li>
<li>@bonus_gold_step - เป็นตัวแปรที่เก็บจำนวนก้าวที่เหลือก่อนที่ @bonus_gold จะกลับมาเป็น 1<br />
 ซึ่งควรมีค่าเริ่มต้นเป็น 0 เพราะเรายังไม่ได้ใช้งานไอเท็ม</li>
</ul>
<br />
method initialize นั้น เป็น method ที่จะถูกเรียกใช้งานอัตโนมัติทันทีที่ทำการประกาศ object ขึ้น (initialize เป็นชือเฉพาะ) เราจะตั้งค่าเริ่มต้นให้ @bonus_gold = 1 และ @bonus_gold_step = 0 จากเหตุผลที่กล่าวไปด้านบน<br />
<br />
ทีนี้เราก็มีตัวแปรคอยควบคุมการ X เงินของเราแล้วครับ ให้เราเปลี่ยนโค้ดเก่า จาก * 2 เป็นดังนี้<br />
[shcode=rails]<br />
module BattleManager<br />
  def self.gain_gold<br />
    if &#36;game_troop.gold_total &gt; 0<br />
      text = sprintf(Vocab::ObtainGold, &#36;game_troop.gold_total * &#36;game_party.bonus_gold) # แก้บรรทัดนี้<br />
      &#36;game_message.add('\.' + text)<br />
      &#36;game_party.gain_gold(&#36;game_troop.gold_total * &#36;game_party.bonus_gold) # แก้บรรทัดนี้<br />
    end<br />
    wait_for_message<br />
  end<br />
end<br />
<br />
# ----------------------------------------------------------<br />
# โค้ดในส่วนของ class Game_Party ละไว้ในฐานที่เข้าใจ<br />
# ----------------------------------------------------------<br />
[/shcode]<br />
สังเกตว่าเราเปลี่ยนจาก * 2 เป็น * &#36;game_party.bonus_gold แทน ซึ่งค่าของ &#36;game_party.bonus_gold นั้นจะขึ้นอยู่กับตัวแปร @bonus_gold ด้านใน object &#36;game_party นั่นเอง<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">5. สร้างคำสั่งให้ gold X2 จำนวน 50 ก้าว</span></span><br />
ในโค้ดเก่าที่เราสร้าง ใน Game_Party ให้เพิ่ม method ขึ้นมาอีกอันหนึ่ง<br />
<br />
[shcode=rails]<br />
# ----------------------------------------------------------<br />
# โค้ดในส่วนของ module BattleManager ละไว้ในฐานที่เข้าใจ<br />
# ----------------------------------------------------------<br />
<br />
class Game_Party &lt; Game_Unit # ก็อบหัวมาจากไฟล์ Game_Party<br />
  # ----------------------------------------------------------<br />
  # โค้ดเก่าที่ให้เขียนในขั้นตอนที่ผ่านมา ละไว้ในฐานที่เข้าใจ<br />
  # ----------------------------------------------------------<br />
<br />
  # โค้ดที่เพิ่มเข้ามา  <br />
  def bonus_gold_start<br />
    puts "gold X2"<br />
    @bonus_gold = 2<br />
    @bonus_gold_step = 50<br />
  end<br />
end<br />
[/shcode]<br />
ในโค้ดนี้เราจะสร้าง method ขึ้นมา เพื่อสั่งให้ ทำการ X2 Gold และเพิ่มจำนวนก้าวเป็น 50 ก้าว (จริงๆ ต้อง 1000 ก้าว แต่เราลองที่ 50 ก่อนเพื่อความง่ายในการตรวจสอบ)<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">6. สร้าง common event เรียกคำสังที่สร้างในข้อ 5</span></span><br />
ให้เราสร้าง common event ขึ้นมาครับ แล้วสร้าง event command และใส่ script ตามภาพเลย<br />
<img src="http://upic.me/i/tr/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
จากภาพ เราได้สั่งตัวแปร &#36;game_party ให้เรียก method ชื่อ bonus_gold_start ซึ่งเรารู้จากขั้นตอนที่ผ่านมาว่าตัวแปร &#36;game_party เป็น object ของ class Game_Party ทำให้การเรียกใช้งานแบบนี้ไม่มีปัญหา และเมื่อเรียกใช้งานแล้ว ตัวแปร @bonus_gold และ @bonus_gold_step ที่อยู่ใน object &#36;game_party จะมีค่า 2 และ 50 ตามลำดับ (ตอนแรกเป็น 1 และ 0 จากค่าเริ่มต้นที่ตั้งไว้)<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">7. ทดลองสร้างไอเท็มดู</span></span><br />
ให้ใส่รายละเอัยประมาณรูปภาพ สีแดงคือส่วนที่เน้นเป็นพิเศษ โดยเฉพาะตรง Effects เราต้องเลือกใช้งาน common event ที่เราสร้างขึ้น<br />
<img src="http://upic.me/i/9c/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">8. ทบทวนโค้ดของเรา และลองทดสอบเกมดูก่อน</span></span><br />
โค้ดที่เขียนจนถึงขั้นตอนนี้ต้องเป็นแบบนี้<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>module BattleManager<br />
&nbsp;&nbsp;def self.gain_gold<br />
&nbsp;&nbsp;&nbsp;&nbsp;if &#36;game_troop.gold_total &gt; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text = sprintf(Vocab::ObtainGold, &#36;game_troop.gold_total * &#36;game_party.bonus_gold)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;game_message.add('&#92;.' + text)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;game_party.gain_gold(&#36;game_troop.gold_total * &#36;game_party.bonus_gold) <br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;wait_for_message<br />
&nbsp;&nbsp;end<br />
end<br />
<br />
class Game_Party &lt; Game_Unit<br />
&nbsp;&nbsp;attr_reader :bonus_gold<br />
&nbsp;&nbsp;attr_reader :bonus_gold_step<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;alias_method :initialize_copied, :initialize<br />
&nbsp;&nbsp;def initialize<br />
&nbsp;&nbsp;&nbsp;&nbsp;initialize_copied<br />
&nbsp;&nbsp;&nbsp;&nbsp;@bonus_gold = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;@bonus_gold_step = 0<br />
&nbsp;&nbsp;end<br />
<br />
&nbsp;&nbsp;def bonus_gold_start<br />
&nbsp;&nbsp;&nbsp;&nbsp;puts "gold X2"<br />
&nbsp;&nbsp;&nbsp;&nbsp;@bonus_gold = 2<br />
&nbsp;&nbsp;&nbsp;&nbsp;@bonus_gold_step = 50<br />
&nbsp;&nbsp;end<br />
end</code></div></div><br />
มาถึงตอนนี้ให้เราลองทดสอบเกมดูก่อน โดยให้เสกไอเท็มดังกล่าวเข้าตัว ก่อนใช้ไอเท็ม ลองไปสู้กับมอนสเตอร์ที่มีการดรอบเงินดู (อาจจะสร้างอีเว้นท์สู้กับมอนง่ายๆ ไปเลย) ให้จำเงินที่ได้เอาไว้ หลังจากนั้นให้ลองใช้ไอเท็ม และลองไปสู้ใหม่ สังเกตผลลัพธ์ที่ได้<br />
<br />
ให้เราสังเกตดูว่า เมื่อกดใช้ไอเท็มที่เราสร้างขึ้นแล้ว จะมีข้อความ "gold X2" แสดงออกมาทาง console ทำให้เรารู้ว่าคำสั่งที่เราเรียกใช้นั้นทำงาน<br />
<img src="http://upic.me/i/21/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<br />
ทั้งนี้เพราะใน method bonus_gold_start นั้น เราได้เขียน puts "gold X2" ลงไปด้วย<br />
<br />
นี่แหละครับ สิ่งที่ผมอยากจะบอกว่า console นั้นสำคัญไฉน ทำให้ระหว่างการดีบั๊กเกมนั้น เราสามารถตรวจสอบได้ว่า ขณะนี้คำสั่งที่เราต้องการเรียก มันทำงานหรือเปล่า ลองนึกดูว่าถ้าเราไม่ puts ออกมาดู เวลาเราลองใช้ไอเท็มมันก็จะไม่มีข้อความอะไรบอก ทำให้เราไม่รู้ว่ามันใช้ได้หรือไม่ได้กันแน่ ถูกไหมครับ<br />
<br />
เมื่อผ่านมาถึงขั้นตอนนี้แล้ว ท่านจะพบว่าเมื่อใช้ไอเท็มแล้วไปสู้กันมอนสเตอร์ จะได้เงิน X2<br />
<br />
<span style="font-weight: bold;" class="mycode_b">อธิบายการทำงาน</span><br />
<ol type="1" class="mycode_list"><li>ก่อนใช้ไอเท็ม สู้กับมอนสเตอร์ ได้ gold x1 ตามคำสั่ง &#36;game_party.gain_gold(&#36;game_troop.gold_total * &#36;game_party.bonus_gold) ที่เรา overwrite ใน module BattleManager ซึ่งค่า &#36;game_party.bonus_gold ของเราจะเป็น 1 เพราะเป็นค่าเริ่มต้นที่เราตั้งไว้ใน class Game_Party<br />
</li>
<li>ใช้ไอเท็ม<br />
</li>
<li>ไอเท็มดังกล่าวไปเรียกใช้ common event ที่เราสร้าง<br />
</li>
<li>common event ไปเรียกใช้ script &#36;game_party.&#36;game_party.bonus_gold_start<br />
</li>
<li>method bonus_gold_start ถูกเรียกใช้งาน ทำให้ตัวแปร @bonus_gold มีค่าเป็น 2 และ @bonus_gold_step มีค่าเป็น 50<br />
</li>
<li>เมื่อสู้กับมอนสเตอร์ จะได้ gold X2 ตามคำสั่ง &#36;game_party.gain_gold(&#36;game_troop.gold_total * &#36;game_party.bonus_gold) ที่เรา overwrite ใน module BattleManager ซึ่งค่า &#36;game_party.bonus_gold ของเราจะเป็น 2 จากเหตุผลข้อที่แล้ว<br />
</li>
</ol>
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">ยินดีด้วย!!! คุณสามารถสร้างไอเท็มที่ใช้แล้ว gold x2 ตอนต่อสู้ได้แล้ว<br />
แต่ทั้งหมดที่ผ่านมานี้เป็นเพียงครึ่งทางเท่านั้น!!!</span></span><br />
<br />
เพราะท่านจะพบว่าเมื่อใช้ไอเท็มแล้วไปสู้กันมอนสเตอร์ จะได้เงิน X2 แต่มันจะ X2 ไปตลอดกาล ทั้งนี้เพราะเรายังไม่ได้เขียนระบบนับก้าวนั่นเอง และที่สำคัญ เรายังไม่มีกล่องข้อความแจ้งเตือนว่าเหลืออีกกี่ก้าวอีกด้วย และที่สำคัญกว่า เรายังไม่ได้เริ่มเขียนไอเท็ม Exp X2 กันแม้แต่นิดเดียว 5555+ ดังนั้น หนทางยังอีกยาวไกลนัก<br />
<br />
ซึ่งผมจะมาอธิบายต่อไป (edit กระทู้นี้ครับ) <br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">###มาแก้ไขกระทู้###</span><br />
เนื่องจากตอนนี้งานเยอะมาก ขออภัยในความล่าช้านะครับ หากว่างแล้วจะกลับมาเขียนต่อทันทีครับ -/\-</span></span><br />
<br />
.]]></description>
			<content:encoded><![CDATA[<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Script Workshop - มาสร้างไอเท็ม Exp, Gold X2 ในฉากต่อสู้กัน</span></span><br />
<br />
บทความนี้จะสอนการเขียน script ขึ้นมา ซึ่งจะเล่าแนวคิดการเขียนตั้งแต่ต้นจนจบ หากฝึกจนชำนาญแล้ว ท่านสามารถนำไปประยุกต์ใช้ทำ script อื่นๆ แจกจ่ายได้เลย ^^ (เขียนสลับไปมากับบทความพื้นฐาน เดี๋ยวคนมีความรู้อยู่แล้วจะเบื่อซะก่อน แหะๆ)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ความยาก:</span> ปานกลาง<br />
<span style="font-weight: bold;" class="mycode_b">ความรู้พื้นฐานที่ควรมี</span><ul class="mycode_list"><li>การเขียนโปรแกรมเชิงวัตถุบน Ruby (พวก class, object ทั้งหลาย) โดยสังเขป<br />
</li>
<li><a href="http://irpg.in.th/thread-2441.html" target="_blank" rel="noopener" class="mycode_url">พื้นฐานการโม script เบื้องต้น</a><br />
</li>
</ul>
ลองอ่านๆ แล้วค่อยๆ ทำความเข้าใจดูนะครับ ถ้าพอเข้าใจคอนเซ็ปต์ก็เวิคเลย แต่ถ้าอ่านแล้วไม่รู้เรื่องไม่ต้องกังวลไปครับ วันไหนที่มีความรู้พื้นฐานแล้วกลับมาอ่านใหม่ ท่านจะเข้าใจมากขึ้น<br />
<br />
ในบทความนี้จะทำการเขียน script สร้างไอเท็มดังนี้<br />
<ol type="1" class="mycode_list"><li>Rich Potion - ใช้แล้ว Gold X2 ในฉากต่อสู้ เป็นระยะเวลา 1000 ก้าว<br />
</li>
<li>Master Potion - ใช้แล้ว Exp X2 ในฉากต่อสู้ เป็นระยะเวลา 1000 ก้าว<br />
</li>
</ol>
<img src="http://upic.me/i/jo/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
ซึ่งเมื่อใช้งานไอเท็มแล้ว จะมีสถานะบอกที่มุมบนขวาของจอด้วย<br />
<br />
<img src="http://upic.me/i/c1/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
และเมื่อไอเท็มหมดฤทธิ์ กล่องข้อความก็จะหายไปอัตโนมัติ เพื่อไม่ให้รกจอนั่นเอง<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">แนวคิดของผม</span></span><br />
แน่นอนว่าวิธีการเขียนอาจจะมีหลายวิธี ไม่มีผิดไม่มีถูกเสมอไป แต่ผมจะยึดแนวคิดของผมเป็นหลักในบทความนี้ สมมุติว่าผมอยากทำ script อันนึงเพื่อแจกจ่ายผู้อื่น หากเริ่มตั้งแต่ 0 ผมมีกระบวนการคิดอย่างไรในการเขียนมันขึ้นมา<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">1. สร้างไฟล์เปล่าขึ้นมาก่อนเลย</span></span><br />
แน่นอนว่าการนำ script ไปแจกคนอื่นนั้น จะต้องสร้างไฟล์ script ขึ้นมาเพื่อให้ผู้อื่นนำไฟล์ script เราไปใช้ในอนาคต ให้คลิกขวาสร้างไฟล์เปล่าขึ้นมา แล้วตั้งชื่อว่า Bonus Exp, Gold<br />
<span style="font-weight: bold;" class="mycode_b">หมายเหตุ: </span>เราจะไม่แก้โค้ดเดิมเด็ดขาดนะครับ ให้จำเอาไว้ว่าทุกครั้งที่ให้เขียนโค้ดหรือแก้โค้ด มันคือการเขียนที่ไฟล์ที่เราสร้างใหม่นี้เสมอครับ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">2. ทำทีละอย่าง</span></span><br />
หากยังไม่ชำนาญแล้ว แนะนำให้แก้โจทย์ทีละอย่างครับ เพื่อง่ายต่อความเข้าใจ<br />
ดังนั้นในส่วนแรกนี้ผมจะทำแต่ไอเท็ม gold X2 โดยยังไม่ไปยุ่งกับ exp นะครับ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">3. หาโค้ดส่วนที่ได้รับ gold หลังการต่อสู้</span></span><br />
ผมก็จะวิเคราะห์ก่อนว่า ถ้าเราจะให้ gold x2 ก็ควรจะต้องคูณมันตอนเราได้รับเงินหลังต่อสู้ใช่ไหมครับ ซึ่ง script ที่จัดการเกี่ยวกับการต่อสู้ทั้งหมดนั้น อยู่ใน module BattleManager (ไฟล์ประมาณบนซ้าย) ว่าแล้วผมก็กดเข้าไปทันที ลองหาๆ ด้วย Ctrl + F ดูแล้ว ก็จะได้โค้ดที่เข้าเค้าที่สุด อยู่ที่ประมาณบรรทัดที่ 316 ดังรูป<br />
<br />
<img src="http://upic.me/i/yp/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
ว่าแล้วก็ทำการ overwrite code นี้ออกมาไว้ที่ไฟล์เปล่าของเราที่สร้างในขั้นตอนที่ 1 เลย (ครอบด้วย module BattleManager ด้วยนะ ในกรณีที่เป็น module ไม่ใช่ class เราจะครอบด้วย module แทน)<br />
<br />
[shcode=rails]<br />
module BattleManager<br />
  def self.gain_gold<br />
    if &#36;game_troop.gold_total &gt; 0<br />
      text = sprintf(Vocab::ObtainGold, &#36;game_troop.gold_total)<br />
      &#36;game_message.add('\.' + text)<br />
      &#36;game_party.gain_gold(&#36;game_troop.gold_total)<br />
    end<br />
    wait_for_message<br />
  end<br />
end<br />
[/shcode]<br />
อยากให้ gold x2 ทำยังไงครับ ผมลองเดาโค้ดแล้วแก้ดูเป็นดังนี้<br />
[shcode=rails]<br />
module BattleManager<br />
  def self.gain_gold<br />
    if &#36;game_troop.gold_total &gt; 0<br />
      text = sprintf(Vocab::ObtainGold, &#36;game_troop.gold_total * 2) # แก้บรรทัดนี้<br />
      &#36;game_message.add('\.' + text)<br />
      &#36;game_party.gain_gold(&#36;game_troop.gold_total * 2) # แก้บรรทัดนี้<br />
    end<br />
    wait_for_message<br />
  end<br />
end<br />
[/shcode]<br />
ให้ลองรันเกมดู แล้วไปหาเรื่องสู้กับมอนสเตอร์ ตรวจสอบดูว่าได้เงินเพิ่มจริงหรือไม่ ถ้าเงินเพิ่มจริง แปลว่าเดาถูกแล้วล่ะ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">4. ควบคุมเงื่อนไขการคูณ gold ด้วยบงการอะไรซักอย่าง</span></span><br />
ทีนี้สิ่งที่ผมอยากได้นั้นไม่ใช่ gold X2 ตลอดกาลแบบนี้ แต่ต้องการให้ gold X2 เฉพาะเวลาที่ใช้ไอเท็ม และมีเวลาจำกัดเป็นจำนวนก้าว ดังนั้น ผมจะไม่เขียน * 2 ไปตรงๆ แบบนั้นแล้ว แต่จะนำไปคุณตัวแปรอะไรสักอย่างที่คอยบงการอีกที <br />
<br />
ซึ่งถ้าเราอ่านโค้ดบรรทัดที่ 6 ดูดีๆ แล้ว เราจะเดาได้ว่ามันคือคำสั่งเพิ่มเงินให้กับปาร์ตี้ของเราด้วยจำนวนที่ระบุในวงเล็บ และมีตัวแปร &#36;game_party ในการควบคุมข้อมูลปาร์ตี้อยู่ ดังนั้น ผมจะเพิ่มเจ้าตัวแปรบงการการคูณเงินของเราในข้อมูลปาร์ตี้เช่นกัน ซึ่งเราก็ต้องไปดูว่าตัวแปร &#36;game_party นั้นมันไปอ่านข้อมูลจากโค้ดที่ไหน ในขั้นตอนนี้ให้ไปดูที่ไฟล์ script ใน module DataManager ครับ ให้สังเกตประมาณบรรทัดที่ 82+<br />
<img src="http://upic.me/i/q1/6capture.jpg" loading="lazy"  alt="[Image: 6capture.jpg]" class="mycode_img" /><br />
ในบรรทัดที่ 91 เราจะเห็นว่ามีการประกาศตัวแปร &#36;game_party ให้มีค่าเท่ากับ Game_Party.new ในบรรทัดนี้ถ้ามีความรู้การเขียนโปรแกรมเชิงวัตถุ จะทราบว่า ให้เป็นการสร้าง object &#36;game_party ขึ้นมาด้วยคลาส Game_Party ดังนั้น เรารู้แล้วว่าข้อมูล &#36;game_party มาจากคลาส Game_Party ให้เราตรวจสอบดูรายการ script ด้านซ้ายดูครับ เราก็จะเห็นไฟล์ Game_Party ที่มี class Game_Party ด้านใน<br />
<br />
การเก็บข้อมูลอัตราการคูณเงิน กับจำนวนก้าวที่เหลือ เราควรเก็บข้อมูลในคลาสดังกล่าว เพราะเหมาะสมในการเป็นข้อมูลที่เกี่ยวกับปาร์ตี้ที่สุดแล้ว<br />
<br />
ในขั้นตอนนี้เราจะทำการเพิ่มตัวแปรในคลาส Game_Party ด้วยวิธีการ overwrite ครับ ให้ไปที่ไฟล์ของเราที่สร้างขึ้นในขั้นตอนที่ 1 แล้วเขียนโค้ดต่อจากเดิมดังนี้ (ไม่ต้องลบของเก่านะครับ เขียนต่อลงมาด้านล่างเลย)<br />
[shcode=rails]<br />
# ----------------------------------------------------------<br />
# โค้ดเก่าในส่วนของ module BattleManager ละไว้ในฐานที่เข้าใจ<br />
# ----------------------------------------------------------<br />
<br />
class Game_Party &lt; Game_Unit # ก็อบหัวมาจากไฟล์ Game_Party<br />
  # ส่วนนี้เป็นการบอกว่าตัวแปร @bonus_gold, @bonus_gold_step สามารถถูกอ่านค่าจากภายนอกได้<br />
  attr_reader :bonus_gold<br />
  attr_reader :bonus_gold_step<br />
  <br />
  # ส่วนนี้เหมาะกับการกำหนดค่าเริ่มต้นของตัวแปร<br />
  alias_method :initialize_copied, :initialize<br />
  def initialize<br />
    initialize_copied<br />
    @bonus_gold = 1<br />
    @bonus_gold_step = 0<br />
  end<br />
end<br />
[/shcode]<br />
โค้ดดังกล่าว เราจะทำการเพิ่มตัวแปร @bonus_gold, @bonus_gold_step ขึ้นมา ซึ่งเป็นตัวแปรประเภท class variable กล่าวคือตัวแปรนี้จะมีขอบเขตการใช้งานได้ในคลาสนี้เท่านั้น (มี @ นำหน้า)<ul class="mycode_list"><li>@bonus_gold - ใช้เก็บข้อมูลอัตราส่วนการได้เงิน เช่น ถ้า @bonus_gold = 2 คือ gold X2 เป็นต้น ซึ่งควรมีค่าเริ่มต้นเป็น 1 (gold x1)<br />
</li>
<li>@bonus_gold_step - เป็นตัวแปรที่เก็บจำนวนก้าวที่เหลือก่อนที่ @bonus_gold จะกลับมาเป็น 1<br />
 ซึ่งควรมีค่าเริ่มต้นเป็น 0 เพราะเรายังไม่ได้ใช้งานไอเท็ม</li>
</ul>
<br />
method initialize นั้น เป็น method ที่จะถูกเรียกใช้งานอัตโนมัติทันทีที่ทำการประกาศ object ขึ้น (initialize เป็นชือเฉพาะ) เราจะตั้งค่าเริ่มต้นให้ @bonus_gold = 1 และ @bonus_gold_step = 0 จากเหตุผลที่กล่าวไปด้านบน<br />
<br />
ทีนี้เราก็มีตัวแปรคอยควบคุมการ X เงินของเราแล้วครับ ให้เราเปลี่ยนโค้ดเก่า จาก * 2 เป็นดังนี้<br />
[shcode=rails]<br />
module BattleManager<br />
  def self.gain_gold<br />
    if &#36;game_troop.gold_total &gt; 0<br />
      text = sprintf(Vocab::ObtainGold, &#36;game_troop.gold_total * &#36;game_party.bonus_gold) # แก้บรรทัดนี้<br />
      &#36;game_message.add('\.' + text)<br />
      &#36;game_party.gain_gold(&#36;game_troop.gold_total * &#36;game_party.bonus_gold) # แก้บรรทัดนี้<br />
    end<br />
    wait_for_message<br />
  end<br />
end<br />
<br />
# ----------------------------------------------------------<br />
# โค้ดในส่วนของ class Game_Party ละไว้ในฐานที่เข้าใจ<br />
# ----------------------------------------------------------<br />
[/shcode]<br />
สังเกตว่าเราเปลี่ยนจาก * 2 เป็น * &#36;game_party.bonus_gold แทน ซึ่งค่าของ &#36;game_party.bonus_gold นั้นจะขึ้นอยู่กับตัวแปร @bonus_gold ด้านใน object &#36;game_party นั่นเอง<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">5. สร้างคำสั่งให้ gold X2 จำนวน 50 ก้าว</span></span><br />
ในโค้ดเก่าที่เราสร้าง ใน Game_Party ให้เพิ่ม method ขึ้นมาอีกอันหนึ่ง<br />
<br />
[shcode=rails]<br />
# ----------------------------------------------------------<br />
# โค้ดในส่วนของ module BattleManager ละไว้ในฐานที่เข้าใจ<br />
# ----------------------------------------------------------<br />
<br />
class Game_Party &lt; Game_Unit # ก็อบหัวมาจากไฟล์ Game_Party<br />
  # ----------------------------------------------------------<br />
  # โค้ดเก่าที่ให้เขียนในขั้นตอนที่ผ่านมา ละไว้ในฐานที่เข้าใจ<br />
  # ----------------------------------------------------------<br />
<br />
  # โค้ดที่เพิ่มเข้ามา  <br />
  def bonus_gold_start<br />
    puts "gold X2"<br />
    @bonus_gold = 2<br />
    @bonus_gold_step = 50<br />
  end<br />
end<br />
[/shcode]<br />
ในโค้ดนี้เราจะสร้าง method ขึ้นมา เพื่อสั่งให้ ทำการ X2 Gold และเพิ่มจำนวนก้าวเป็น 50 ก้าว (จริงๆ ต้อง 1000 ก้าว แต่เราลองที่ 50 ก่อนเพื่อความง่ายในการตรวจสอบ)<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">6. สร้าง common event เรียกคำสังที่สร้างในข้อ 5</span></span><br />
ให้เราสร้าง common event ขึ้นมาครับ แล้วสร้าง event command และใส่ script ตามภาพเลย<br />
<img src="http://upic.me/i/tr/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
จากภาพ เราได้สั่งตัวแปร &#36;game_party ให้เรียก method ชื่อ bonus_gold_start ซึ่งเรารู้จากขั้นตอนที่ผ่านมาว่าตัวแปร &#36;game_party เป็น object ของ class Game_Party ทำให้การเรียกใช้งานแบบนี้ไม่มีปัญหา และเมื่อเรียกใช้งานแล้ว ตัวแปร @bonus_gold และ @bonus_gold_step ที่อยู่ใน object &#36;game_party จะมีค่า 2 และ 50 ตามลำดับ (ตอนแรกเป็น 1 และ 0 จากค่าเริ่มต้นที่ตั้งไว้)<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">7. ทดลองสร้างไอเท็มดู</span></span><br />
ให้ใส่รายละเอัยประมาณรูปภาพ สีแดงคือส่วนที่เน้นเป็นพิเศษ โดยเฉพาะตรง Effects เราต้องเลือกใช้งาน common event ที่เราสร้างขึ้น<br />
<img src="http://upic.me/i/9c/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">8. ทบทวนโค้ดของเรา และลองทดสอบเกมดูก่อน</span></span><br />
โค้ดที่เขียนจนถึงขั้นตอนนี้ต้องเป็นแบบนี้<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>module BattleManager<br />
&nbsp;&nbsp;def self.gain_gold<br />
&nbsp;&nbsp;&nbsp;&nbsp;if &#36;game_troop.gold_total &gt; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text = sprintf(Vocab::ObtainGold, &#36;game_troop.gold_total * &#36;game_party.bonus_gold)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;game_message.add('&#92;.' + text)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;game_party.gain_gold(&#36;game_troop.gold_total * &#36;game_party.bonus_gold) <br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;wait_for_message<br />
&nbsp;&nbsp;end<br />
end<br />
<br />
class Game_Party &lt; Game_Unit<br />
&nbsp;&nbsp;attr_reader :bonus_gold<br />
&nbsp;&nbsp;attr_reader :bonus_gold_step<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;alias_method :initialize_copied, :initialize<br />
&nbsp;&nbsp;def initialize<br />
&nbsp;&nbsp;&nbsp;&nbsp;initialize_copied<br />
&nbsp;&nbsp;&nbsp;&nbsp;@bonus_gold = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;@bonus_gold_step = 0<br />
&nbsp;&nbsp;end<br />
<br />
&nbsp;&nbsp;def bonus_gold_start<br />
&nbsp;&nbsp;&nbsp;&nbsp;puts "gold X2"<br />
&nbsp;&nbsp;&nbsp;&nbsp;@bonus_gold = 2<br />
&nbsp;&nbsp;&nbsp;&nbsp;@bonus_gold_step = 50<br />
&nbsp;&nbsp;end<br />
end</code></div></div><br />
มาถึงตอนนี้ให้เราลองทดสอบเกมดูก่อน โดยให้เสกไอเท็มดังกล่าวเข้าตัว ก่อนใช้ไอเท็ม ลองไปสู้กับมอนสเตอร์ที่มีการดรอบเงินดู (อาจจะสร้างอีเว้นท์สู้กับมอนง่ายๆ ไปเลย) ให้จำเงินที่ได้เอาไว้ หลังจากนั้นให้ลองใช้ไอเท็ม และลองไปสู้ใหม่ สังเกตผลลัพธ์ที่ได้<br />
<br />
ให้เราสังเกตดูว่า เมื่อกดใช้ไอเท็มที่เราสร้างขึ้นแล้ว จะมีข้อความ "gold X2" แสดงออกมาทาง console ทำให้เรารู้ว่าคำสั่งที่เราเรียกใช้นั้นทำงาน<br />
<img src="http://upic.me/i/21/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<br />
ทั้งนี้เพราะใน method bonus_gold_start นั้น เราได้เขียน puts "gold X2" ลงไปด้วย<br />
<br />
นี่แหละครับ สิ่งที่ผมอยากจะบอกว่า console นั้นสำคัญไฉน ทำให้ระหว่างการดีบั๊กเกมนั้น เราสามารถตรวจสอบได้ว่า ขณะนี้คำสั่งที่เราต้องการเรียก มันทำงานหรือเปล่า ลองนึกดูว่าถ้าเราไม่ puts ออกมาดู เวลาเราลองใช้ไอเท็มมันก็จะไม่มีข้อความอะไรบอก ทำให้เราไม่รู้ว่ามันใช้ได้หรือไม่ได้กันแน่ ถูกไหมครับ<br />
<br />
เมื่อผ่านมาถึงขั้นตอนนี้แล้ว ท่านจะพบว่าเมื่อใช้ไอเท็มแล้วไปสู้กันมอนสเตอร์ จะได้เงิน X2<br />
<br />
<span style="font-weight: bold;" class="mycode_b">อธิบายการทำงาน</span><br />
<ol type="1" class="mycode_list"><li>ก่อนใช้ไอเท็ม สู้กับมอนสเตอร์ ได้ gold x1 ตามคำสั่ง &#36;game_party.gain_gold(&#36;game_troop.gold_total * &#36;game_party.bonus_gold) ที่เรา overwrite ใน module BattleManager ซึ่งค่า &#36;game_party.bonus_gold ของเราจะเป็น 1 เพราะเป็นค่าเริ่มต้นที่เราตั้งไว้ใน class Game_Party<br />
</li>
<li>ใช้ไอเท็ม<br />
</li>
<li>ไอเท็มดังกล่าวไปเรียกใช้ common event ที่เราสร้าง<br />
</li>
<li>common event ไปเรียกใช้ script &#36;game_party.&#36;game_party.bonus_gold_start<br />
</li>
<li>method bonus_gold_start ถูกเรียกใช้งาน ทำให้ตัวแปร @bonus_gold มีค่าเป็น 2 และ @bonus_gold_step มีค่าเป็น 50<br />
</li>
<li>เมื่อสู้กับมอนสเตอร์ จะได้ gold X2 ตามคำสั่ง &#36;game_party.gain_gold(&#36;game_troop.gold_total * &#36;game_party.bonus_gold) ที่เรา overwrite ใน module BattleManager ซึ่งค่า &#36;game_party.bonus_gold ของเราจะเป็น 2 จากเหตุผลข้อที่แล้ว<br />
</li>
</ol>
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">ยินดีด้วย!!! คุณสามารถสร้างไอเท็มที่ใช้แล้ว gold x2 ตอนต่อสู้ได้แล้ว<br />
แต่ทั้งหมดที่ผ่านมานี้เป็นเพียงครึ่งทางเท่านั้น!!!</span></span><br />
<br />
เพราะท่านจะพบว่าเมื่อใช้ไอเท็มแล้วไปสู้กันมอนสเตอร์ จะได้เงิน X2 แต่มันจะ X2 ไปตลอดกาล ทั้งนี้เพราะเรายังไม่ได้เขียนระบบนับก้าวนั่นเอง และที่สำคัญ เรายังไม่มีกล่องข้อความแจ้งเตือนว่าเหลืออีกกี่ก้าวอีกด้วย และที่สำคัญกว่า เรายังไม่ได้เริ่มเขียนไอเท็ม Exp X2 กันแม้แต่นิดเดียว 5555+ ดังนั้น หนทางยังอีกยาวไกลนัก<br />
<br />
ซึ่งผมจะมาอธิบายต่อไป (edit กระทู้นี้ครับ) <br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">###มาแก้ไขกระทู้###</span><br />
เนื่องจากตอนนี้งานเยอะมาก ขออภัยในความล่าช้านะครับ หากว่างแล้วจะกลับมาเขียนต่อทันทีครับ -/\-</span></span><br />
<br />
.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ruby สู่การเขียน RGSS Part 2 - เข้าใจภาษา Ruby, ฝึกใช้ตัวเลข, ข้อความ, ตัวแปร]]></title>
			<link>https://irpg.in.th/thread-2455.html</link>
			<pubDate>Sun, 14 Jun 2015 03:08:04 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2730">splendith</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2455.html</guid>
			<description><![CDATA[<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Ruby สู่การเขียน RGSS Part 2 - เข้าใจภาษา Ruby, ฝึกใช้ตัวเลข, ข้อความ, ตัวแปร</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #FF0000;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">หมายเหตุ</span></span></span><ul class="mycode_list"><li>บทความชุด "Ruby สู่การเขียน RGSS" นั้น แบ่งออกเป็นหลาย part และมีเนื้อหาเรียงลำดับ หากยังไม่ได้อ่าน part ก่อนหน้าบทความนี้ ให้ไปอ่านก่อนครับ มิฉะนั้นอาจงง หรือตามไม่ทันครับ<br />
</li>
<li>อ่านจบแล้วโปรดทิ้งความคิดเห็นและข้อเสนอแนะไว้ด้วยนะคร้าบ<br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
ในบทความนี้เราจะมาเริ่มเขียนภาษา Ruby กันจริงๆ จังๆ เสียที ซึ่งใน part ที่แล้วเราได้ลองอุ่นเครื่องด้วยการเขียนโค้ดเล็กๆ น้อยๆ และสังเกตผลลัพธ์จาก console ในบทความนี้ก็เช่นกัน เรายังคงอยู่ที่หน้าจอ console ตลอดการเรียน<br />
<br />
ไฟล์ Hello World ที่สร้างมาในบทความที่แล้ว ให้ลบทิ้งไปได้เลย แล้วต่อจากนี้ถ้ามีการเขียนโค้ด ให้สร้างไฟล์เปล่าและตั้งชื่อเองนะ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">เนื้อหาในบทความนี้</span></span><br />
<ol type="1" class="mycode_list"><li>คุณลักษณะในภาษา Ruby<br />
</li>
<li>ตัวเลข, จำนวน<br />
</li>
<li>ข้อความ<br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. คุณลักษณะในภาษา Ruby</span></span><br />
ก่อนที่จะเริ่มเขียนโปรแกรมกันเป็นเรื่องราว อยากให้ทราบถึงคุณลักษณะบางอย่างก่อน เพราะไม่งั้นอาจเกิดปัญหาระหว่างการเขียนโปรแกรมได้ ซึ่งคุณลักษณะของภาษา Ruby นั้นมีดังนี้<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Case Sensitive</span></span><br />
ไม่ว่าจะเป็นตัวแปร หรือคำสั่งใดๆ ก็ตาม ภาษาอังกฤษแม้จะเป็นคำเดียวกัน แต่มีตัวเล็กตัวใหญ่ต่างกัน ก็ถือว่าเป็นคนละตัวกัน เช่น name จะถูกมองเป็นคนละตัวกับ Name<br />
<br />
ลองสร้างไฟล์เปล่าขึ้นมาไฟล์หนึ่ง แล้วเขียนโค้ดดังนี้<br />
[shcode=rails]<br />
money = 500<br />
puts "My money is #{money}"<br />
puts "My money is #{moneY}"<br />
[/shcode]<br />
ถ้ารันแล้วแฮงก์ไม่ต้องตกใจ ดูว่าผลลัพธ์ได้ประมาณนี้หรือไม่<br />
<img src="http://upic.me/i/os/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
หากเราเขียนโค้ดผิดพลาดจนโปรแกรมไม่สามารถทำงานต่อได้ มันก็จะขึ้น error และจบโปรแกรมลงทันที และให้ลองสังเกตดูคร่าวๆ ว่ามันขึ้น error ว่าอย่างไร ซึ่งมันเขียนว่า undefined local variable or method 'moneY' ... ซึ่งแปลได้ว่า ไม่เคยมีการกำหนดค่าตัวแปร moneY ขึ้น จึงไม่สามารถเรียกค่าได้<br />
<br />
กล่าวคือ money นั้น จะถูกมองเป็นคนละตัวกับ moneY นั่นเอง และเราไม่เคยกำหนดค่าของ moneY เอาไว้ พอโปรแกรมอ่านโค้ดบรรทัดที่ 3 ที่ต้องแสดงผล moneY มันเลยไม่รู้จะเอาอะไรมาแสดง จึงแจ้ง error ขึ้นมา<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Comments</span></span><br />
หากเราเขียนโค้ดเอาไว้ แล้วไม่ต้องการใช้งานโค้ดบรรทัดนั้นชั่วคราว หรือต้องการเขียนอธิบายในตัวโค้ด ในภาษา Ruby สามารถทำได้ โดยใส่เครื่องหมาย # หน้าโค้ดที่เราเขียน ให้เราลองเขียนโค้ดดังนี้ (ลบโค้ดเก่าออกก่อนด้วยนะ)<br />
[shcode=rails]<br />
puts "Hello World!"<br />
#puts "Invisible man!"<br />
<br />
#Look at the code below<br />
#This is my information<br />
puts "My name is Splendith."<br />
<br />
#The end of the code<br />
[/shcode]<br />
เมื่อกดรันแล้ว สังเกตว่าผลลัพธ์จะขึ้นเพียง<br />
Hello World!<br />
My name is Splendith.<br />
เพราะในบรรทัดอื่นนั้นมีเครื่องหมาย # นำหน้า ทำให้โปรแกรมจะข้ามการอ่านบรรทัดนั้นไป<br />
<br />
ทีนี้หากต้องการ comment ทีละหลายบรรทัด การมานั่งเขียน # ทุกบรรทัดคงไม่สะดวกแน่ วิธีการ comment ทีละหลายบรรทัดนั้น ให้ใส่ =begin, =end ครอบหัวท้าย ดังตัวอย่างต่อไปนี้<br />
[shcode=rails]<br />
puts "Hello world!"<br />
=begin<br />
puts "My name is Splendith."<br />
puts "I am 23 years old."<br />
puts "Today is a nice day."<br />
<br />
money = 4000<br />
puts "I have #{money} baht."<br />
=end<br />
puts "Good bye!"<br />
[/shcode]<br />
ผลลัพธ์จะขึ้นเพียง<br />
Hello world!<br />
Good bye!<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Statement Delimiters หริอตัวคั่นคำสั่ง</span></span><br />
โดยปกติแล้วภาษา Ruby ที่เราเขียนนั้น เราจะเขียน 1 คำสั่ง ต่อ 1 บรรทัดใช่ไหมครับ ตัวอย่างเช่นเราเขียน คำสั่ง puts ตามด้วยข้อความ บรรทัดหนึ่ง ถ้าต้องการเขียนคำสั่งอื่นๆ ก็ต้องเขียนบรรทัดใหม่ถูกไหมครับ เราไม่มีทางเขียนแบบนี้ได้<br />
[shcode=rails]<br />
puts "Hello world!"     puts "Good bye!"<br />
[/shcode]<br />
เพราะโปรแกรมมันไม่สามารถแยกได้ว่า puts ด้านขวานั้นคืออีกคำสั่งหนึ่ง<br />
แต่อย่างไรก็ตาม หากต้องการเขียนหลายๆ คำสั่งใน 1 บรรทัดนั้น ให้เราใช้เครื่องหมาย semicolon ( ; ) ในการแบ่งคำสั่ง<br />
[shcode=rails]<br />
puts "Hello world!";    puts "Good bye!"<br />
[/shcode]<br />
ซึ่งก็จะสามารถรันได้แล้วโดยไม่มีปัญหา แต่สังเกตว่าในหน้าจอ console นั้น ข้อความ Hello world! ก็ยังคงอยู่คนละบรรทัดกับข้อความ Good bye! ในจุดนี้อย่างงนะครับ เพราะโดยปกติของคำสั่ง puts อย่างที่บอกว่ามันจะทำการขึ้นบรรทัดใหม่หลังจบข้อความเสมอ ไม่ว่าเราจะเขียนโค้ดบรรทัดเดียวกัน หรือคนละบรรทัด หรือจะเว้นห่างกันกี่บรรทัดก็ตาม<br />
<br />
อย่างไรก็ตาม ในเคสปกติแล้ว ถ้าไม่จำเป็น เราไม่ควรเขียนหลายคำสั่งในบรรทัดเดียวกัน เพราะยากต่อการอ่านทำความเข้าใจ ให้เขียนคำสั่งละบรรทัดไปเลย (แต่เดียวอนาคต ; มันจะมีประโยชน์ ค่อยมาว่ากันครับ)<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Reserved Words</span></span><br />
คำบางคำไม่สามารถนำมาใช้งานได้ เนื่องจากเป็นคำที่จองไว้เป็นคำสั่งของระบบ เช่นหากเขียนโปรแกรมดังนี้<br />
[shcode=rails]<br />
name = "Splendith"<br />
class = "Magician"<br />
<br />
puts "My name is #{name}. My class is #{class}"<br />
[/shcode]<br />
เมื่อรันแล้วจะเกิด error ขึ้น เนื่องจากคำว่า class นั้น เป็นคำเฉพาะที่ภาษา Ruby เอาไว้ใช้งานเฉพาะทาง วิธีดูว่าคำไหนที่เป็นคำเฉพาะทาง มันจะเป็นตัวอักษรสีน้ำเงิน เราไม่ควรเอามาตั้งเป็นชื่อตัวแปร<br />
<br />
ทั้งนี้ จากข้อแรกที่เราบอกว่าเป็น case sensitive ดังนั้น ถ้าเปลี่ยนจาก class เป็น Class ก็จะใช้งานได้ปกติ (แต่ในทางปฏิบัติก็ไม่ควรใช้อยู่ดีครับ เพราะเดี๋ยวจะมึนซะเปล่า)<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. ตัวเลข, จำนวน</span></span><br />
ในเนื่อหาส่วนนี้ จะมีเล่นกับตัวเลขทั้งหลายกันครับ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การแสดงผลตัวเลข</span></span><br />
เราจะใช้ puts เช่นเดิม และตามด้วยตัวเลขได้เลย โดยไม่ต้องมีเครื่องหมายฟันหนู<br />
[shcode=rails]<br />
puts 15.8<br />
[/shcode]<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Operators</span></span><br />
เครื่องหมายในการคำนวณนั้น ตามวิชาคณิตศาสตร์ที่เราเรียนกันเลยครับ นั่นคือ บวก ( + ), ลบ ( - ), คูณ ( * ) และหาร ( / ) นอกจากนี้ยังมีเครื่องหมายยกกำลัง ( ** ) และเครื่องหมาย modulo ( % ) ซึ่งหมายถึงการคืนค่าเศษจากผลหาร<br />
<br />
มาลองเขียนกันเล่นๆ ครับ<br />
[shcode=rails]<br />
puts 5<br />
puts 5 + 2<br />
puts 2 - 14<br />
puts 4 * 3<br />
puts 1.5 / 4<br />
puts 11 % 3<br />
puts 8 ** 3<br />
puts 4 * 2 + 3 - 1<br />
[/shcode]<br />
ผลลัพธ์ที่ได้<br />
<img src="http://upic.me/i/4m/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
ในบรรทัดที่ 6 นั้น 8 % 3 คือ นำ 11 ไป หารด้วย 3 ได้ 3 เศษ 2 แล้วนำ 2 มาตอบ<br />
ในบรรทัดที่ 7 นั้น 8 ** 3 หมายถึง 8 ยกกำลัง 3 ได้ 512<br />
ในบรรทัดที่ 8 เราสามารถใส่เครื่องหมายทางคณิตศาสตร์ต่อกันไปเรื่อยๆ ได้<br />
<br />
นอกจากนี้ยังสามารถกำหนดตัวแปรให้มีค่าเป็นตัวเลขได้<br />
[shcode=rails]<br />
a = 5<br />
b = 10<br />
puts a + b<br />
puts "a - b is #{a - b}"<br />
[/shcode]<br />
ผลลัพธ์ ก็จะได้ 15 และ a - b is -5 ตามลำดับ<br />
<br />
และยังสามารถเพิ่มค่า-ลดค่าตัวแปรเดิมได้ เช่น<br />
[shcode=rails]<br />
money = 500<br />
money = money + 1000<br />
puts money<br />
[/shcode]<br />
ผลลัพธ์คือ 1500 เพราะได้เพิ่มค่าตัวแปรตัวเองไปอีก 1000 จาก 500<br />
<br />
และเราสามารถยุบโดยเขียนแบบนี้ได้<br />
[shcode=rails]<br />
money = 500<br />
money += 1000<br />
puts money<br />
[/shcode]<br />
ผลลัพธ์จะได้ 1500 เช่นกัน<br />
<br />
นอกจากนี้ยังใช้ -=, *=, /=, %=, **= ได้ด้วย<br />
<br />
ทีนี้มาดูอะไรที่มัน advance ขึ้นนิดนึง<br />
ให้เขียนโค้ดด้านล่าง แล้วก่อนรันเกม ลองทายดูก่อนว่าแต่ละอันได้ผลลัพธ์อะไรบ้าง<br />
[shcode=rails]<br />
puts 5 - 3 * 2 ** 3<br />
puts 7 / 2<br />
puts 1 / 5<br />
[/shcode]<br />
หากไม่เคยเขียนโปรแกรม ท่านอาจจะงงเป็นไก่ตาแตกว่าทำไมผลลัพธ์มันเพี้ยนหลุดโลกเช่นนี้ ลองดูผลลัพธ์ที่ได้กันครับ<br />
<br />
<img src="http://upic.me/i/8d/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
พิจารณาบรรทัดที่ 1 :: 5 - 3 * 2 ** 3<br />
จากหลักสากลทุกภาษาแทบทั่วโลกนั้น เราจะทำตัวเลขที่มีเครื่องหมายที่มีความสำคัญมากกว่าก่อน ซึ่งลำดับความสำคัญของเครื่องหมายนั้นเรียงดังนี้<br />
<ol type="1" class="mycode_list"><li>วงเล็บ<br />
</li>
<li>**<br />
</li>
<li>*, /, %<br />
</li>
<li>+, -<br />
</li>
</ol>
<span style="font-weight: bold;" class="mycode_b">หมายเหตุ:</span> หากเจอเครื่องหมายลำดับเดียวกัน ให้ทำจากซ้ายไปขวา<br />
<br />
ดังนั้น ในข้อดังกล่าว เราจะทำ 2 ** 3 ก่อน แล้วค่อยเอา 3 มาคุณ จากนั้นค่อยเอา 5 มาลบ ซึ่งเราสามารถจัดนิพจน์ใหม่ได้ดังนี้คือ (5 - (3 * (2 ** 3))) คำตอบก็จะได้ -19 เหมือนที่แสดงในหน้าจอ console เด๊ะๆ<br />
<br />
ในบรรทัดที่ 2 - 3<br />
หลักการสากลของทุกภาษาส่วนใหญ่นั้น (ย้ำว่าส่วนใหญ่) หากเราทำเลขจำนวนเต็ม ไปกระทำใดๆ ก็ตามกับเลขจำนวนเต็ม ค่าที่ออกมาจะได้เลขจำนวนเต็มเสมอ หากมีเศษให้ตัดทิ้งทันที จึงเป็นเหตุผลว่าทำไมผลลัพธ์ออกมาเป็นเลขกลมๆ<br />
ซึ่งถ้าหากต้องการให้ผลลัพธ์ออกมาเป็นทศนิยม เราต้องดัดแปลงนิดหน่อยดังนี้<br />
[shcode=rails]<br />
puts 7.0 / 2 # หรือ 7 / 2.0 หรือ 7.0 / 2.0<br />
puts 1.0 / 5 # หรือ 1 / 5.0 หรือ 1.0 / 5.0<br />
[/shcode]<br />
ผลลัพธ์ก็จะได้ 3.5 และ 0.2 ตามลำดับ ทั้งนี้เพราะมันมีหลักการว่า หากนำจำนวนจริง ไปกระทำใดๆ ก็ตามกับจำนวนเต็ม มันจะได้จำนวนจริงเสมอ ดังนั้นค่าที่ออกมาจึงเป็นจำนวนจริงมีทศนิยม<br />
<br />
<span style="font-weight: bold;" class="mycode_b">หมายเหตุ:</span> จำนวนเต็มคือจำนวนที่ไม่มีทศนิยม ส่วนจำนวนจริงในภาษาคอมพิวเตอร์จะมีทศนิยมเสมอ การแทนจำนวนเต็มให้โปรแกรมเข้าใจเป็นจำนวนจริง จะต้องใส่ .0 เสมอ<br />
<br />
ทีนี้ลองทำข้อนี้ดูครับ 4 - 2 * 3 / 4 + 5 ** (3 - 1) / 3 ได้เท่าไหร่เอ่ย?<br />
หากคิดแล้วก็ลองเอาไปใส่ในโปรแกรมแล้วรันดู ถ้าคำตอบตรงกับที่คิด แปลว่าท่านเข้าใจแจ่มแจ้งเลยล่ะ<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. ข้อความ</span></span><br />
ที่ผ่านมาเราได้คุ้นเคยกับข้อความไปบ้างแล้ว สิ่งที่ท่านน่าจะสังเกตได้คือ มันจะมีฟันหนู ( " ) ครอบเสมอ นั่นแหละเราจะเรียกมันว่าข้อความ หรือภาษาอังกฤษจะใช้คำว่า string<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การแสดงผลข้อความ</span></span><br />
ผ่านมาจุดนี้ทุกคนคงได้คำตอบแล้วล่ะ นั่นคือใช้คำสั่ง puts ตามด้วยข้อความคร่อมด้วยฟันหนู<br />
[shcode=rails]<br />
puts "Hello world!"<br />
[/shcode]<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การต่อข้อความ</span></span><br />
เราจะใช้เครื่องหมาย + ในการต่อข้อความ เช่น<br />
[shcode=rails]<br />
puts "Hello" + "world!"<br />
puts "Hello " + "world!"<br />
<br />
name = "Splendith"<br />
puts "Hello, " + name<br />
puts "Hello, #{name}"<br />
[/shcode]<br />
<br />
ผลลัพธ์<br />
<img src="http://upic.me/i/hu/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
สังเกตว่าในบรรทัดที่ 1 หากเราต่อข้อความ มันจะไม่ใส่เว้นวรรคให้ ต้องเพิ่มเองให้เหมือนบรรทัดที่ 2<br />
ในบรรทัดที่ 4 เรากำหนดตัวแปร name ให้มีค่า "Splendith"<br />
ในบรรทัดที่ 5 เราสามารถเอาข้อความไปต่อกับตัวแปรที่เป็นชนิดข้อความได้เลย หรือสามารถทำแบบบรรทัดที่ 6 เหมือนที่เคยทำในตัวอย่างก่อนๆ ก็ได้ ผลลัพธ์เหมือนกัน<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การทวีคูณข้อความ</span></span><br />
ในภาษา Ruby มีท่าพิเศษที่เราสามารถเอาข้อความไป * กับตัวเลขได้ด้วย<br />
[shcode=rails]<br />
puts "Hello" * 4<br />
[/shcode]<br />
<br />
ผลลัพธ์ก็จะได้ HelloHelloHelloHello<br />
หรือถ้าเราต้องการเส้นคั่นเก๋ๆ<br />
[shcode=rails]<br />
puts "--------------------------------------------------"<br />
[/shcode]<br />
เราสามารถเขียนเป็น<br />
[shcode=rails]<br />
puts "-" * 50<br />
[/shcode]<br />
ได้เลย โหดฝุดๆ ^^<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Escape Characters</span></span><br />
<br />
ทีนี้มาดูตัวอย่างที่มัน advance ขึ้นอีกนิด<br />
[shcode=rails]<br />
puts "The length of a standard ruler is 12" or 1' or 30 cm."<br />
[/shcode]<br />
เมื่อรันแล้วจะพบว่ามัน error ใช่ไหมครับ พอจะเดาได้ไหมว่าเป็นที่อะไร?<br />
หากมองไม่ออก ไม่เป็นไรครับ เราบอกว่า string ต้องคร่อมด้วยฟันหนู ( " ) ถูกไหมครับ แต่เจ้ากร๊รม ในข้อความของเราก็ดันมีเครื่องหมาย " ในนั้น (12") ทำให้โปรแกรมมันมองว่า เครื่องหมาย " หลังเลข 12 คือการจบข้อความ แล้วก็ ต่อด้วย or 1' or 30 cm." อะไรไม่รู้ข้างหลัง มันอ่านไม่ได้ มันเลย error ขึ้น<br />
<br />
วิธีการแก้นั้นไม่ยาก มันจะมีสิ่งที่เรียกว่า escape character ซึ่งมีแทบทุกภาษาเช่นกัน<ul class="mycode_list"><li>\" ใช้แทนเครื่องหมาย " ในข้อความ<br />
</li>
<li>\\ ใช้แทนเครื่องหมาย \ ในข้อความ<br />
</li>
<li>\n ใช้แทนขึ้นบรรทัดใหม่ในข้อความ<br />
</li>
<li>\t ใช้แทนการเคาะ tab ในข้อความ<br />
</li>
<li>และยังมีอย่างอื่นอีก ซึ่งจะไม่ลงที่นี่<br />
</li>
</ul>
ว่าแล้วก็ลองแก้ดูครับ โดยเปลี่ยนจาก 12" เป็น 12\"<br />
[shcode=rails]<br />
puts "The length of a standard ruler is 12\" or 1' or 30 cm."<br />
[/shcode]<br />
ทีนี้โปรแกรมก็จะมองว่า \" คือ เครื่องหมาย " ที่อยู่ด้านในข้อความ มิใช้เครื่องหมายปิดข้อความแต่อย่างใด<br />
<br />
ผลลัพธ์<br />
<img src="http://upic.me/i/80/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
มาลองดูอีกตัวอย่างหนี่งดู<br />
[shcode=rails]<br />
puts "Thai flag has 3 colors\n1. red\n2. white\n3. blue"<br />
[/shcode]<br />
ผลลัพธ์<br />
<img src="http://upic.me/i/et/10capture.jpg" loading="lazy"  alt="[Image: 10capture.jpg]" class="mycode_img" /><br />
<br />
อันนี้เป็นตัวอย่างการขึ้นบรรทัดใหม่ให้ดู ซึ่งจริงๆ แล้วควรจะเขียนแยกบรรทัดกันเพื่อง่ายต่อการอ่านครับ<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Single Quote</span></span><br />
นอกจากการใส้ข้อความในเครื่องหมายฟันหนู ( " ) หรือ double quote แล้ว ยังสามารถใส่ในเครื่องหมาย ( ' ) หรือ single quote (ภาษาไทยเรียก เครื่องหมายฝนทอง *0*)  ได้อีกด้วย เช่น<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>puts 'Hello world!'</code></div></div><br />
การครอบด้วย ' ยังสามารถใช้เครื่องหมาย " ด้านในโดยไม่ต้องเขียน \"<br />
การครอบด้วย " ยังสามารถใช้เครื่องหมาย ' ด้านในโดยไม่ต้องเขียน \' เช่นกัน<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>puts '12" = 30 cm'<br />
puts "1' = 30 cm"</code></div></div><br />
<span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">แต่ๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ</span></span><br />
เครื่องหมาย ' นั้น ไม่รองรับ escape character นอกจาก \\ และ \' และไม่รองรับการแทนนิพจน์ด้วย #{} ลองดูได้จากตัวอย่างนี้ครับ<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>name = "Splendith"<br />
puts "Hello, #{name}.&#92;tToday is a nice day!"<br />
puts 'Hello, #{name}.&#92;tToday is a nice day!'</code></div></div><br />
ผลที่ได้<br />
<img src="http://upic.me/i/c2/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
ผลลัพธ์จากเครื่องหมาย ' นั้นจะไม่แทนตัวแปรและ escape character ลงไป และยังคงข้อความเดิมไว้<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">ข้อควรระวัง</span></span><br />
ให้ดูตัวอย่างดังต่อไปนี้ครับ<br />
[shcode=rails]<br />
money = 500<br />
puts "I have " + money + " baht."<br />
[/shcode]<br />
เมื่อรันดู จะพบกับ error เนื่องจากเราไม่สามารถเอาข้อความไปต่อกับตัวเลขได้ ดังนั้น มันจึงพังตรง ". I have " + money + " baht." เพราะ money เป็นตัวแปรชนิดตัวเลข<br />
<br />
วิธีการแก้ไขมี 2 แบบ แบบแรกคือ ให้ใช้ #{} แทน<br />
[shcode=rails]<br />
money = 500<br />
puts "I have #{money} baht."<br />
[/shcode]<br />
ซึ่งเป็นวิธีที่ควรใช้<br />
<br />
ส่วนแบบที่สองนั้น ให้ใส่ .to_s ตามหลังตัวแปรชนิดตัวเลขของเราในการแสดงผลข้อความ<br />
[shcode=rails]<br />
money = 500<br />
puts "I have " + money.to_s + " baht."<br />
[/shcode]<br />
money.to_s มีความหมายว่า เฮ้ย เจ้าโปรแกรม ให้มอง money ให้เป็นข้อความเพื่อนำไปแสดงนะ อะไรทำนองนั้น<br />
<br />
หลายคนก็สงสัยว่า ทำแบบนี้ได้หรือเปล่าเอ่ยย<br />
[shcode=rails]<br />
money = "500"<br />
puts "I have " + money + " baht."<br />
[/shcode]<br />
พูดง่ายๆ คือ เก็บตัวแปร money เป็นข้อความ "500" ไปซะเลย<br />
คำตอบคือ <span style="color: #0000CD;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">ได้</span></span> แต่ <span style="font-weight: bold;" class="mycode_b"><span style="color: #FF0000;" class="mycode_color">อันตราย</span></span> มากๆ เพราะคุณจะสูญเสียความเป็นตัวเลขในตัวแปร money ไปทันที กล่าวคือ คุณไม่สามารถใช้ operator มาคำนวณได้อีก<br />
<br />
เพื่อให้เข้าใจมากกว่านี้ สมมุติผมมีเงิน 500 บาท ต่อมาพ่อให้ผมอีก 1000 บาท ผมจะมีเงินรวม 1500 บาทใช่ไหมครับ ถ้าเราดันเปลี่ยน money เป็นชนิดข้อความ เราก็จะเขียนมั่วๆ ได้แบบนี้<br />
[shcode=rails]<br />
money = "500"<br />
puts "I have " + money + " baht."<br />
<br />
money = money + 1000<br />
puts "Now I have " + money + " baht."<br />
[/shcode]<br />
ซึ่งแน่นอนว่ามัน error เพราะในบรรทัดที่ 4 เราเอาตัวแปร money ซึ่งเป็นข้อความ ไป + กับตัวเลข<br />
เราก็จะแก้เป็นแบบนี้<br />
[shcode=rails]<br />
money = "500"<br />
puts "I have " + money + " baht."<br />
<br />
money = money + "1000"<br />
puts "Now I have " + money + " baht."<br />
[/shcode]<br />
ผลก็คือ รันได้ ไม่ error แต่เราจะมีเงิน 5001000 บาท แทน พ่อให้ทีรวยเละเบย เพราะมันมองเป็นการเอาข้อความมาต่อกัน ถูกไหมครับ<br />
<br />
มันจึงเป็นเหตุผลว่า หากเป็นข้อมูลตัวเลขที่ต้องเอาไปคำนวณภายหลัง เช่น + - * / % ** เราต้องเก็บเป็นตัวเลข ห้ามเก็บเป็นข้อความเด็ดขาด<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">สรุป</span></span><br />
ในบทความนี้เราได้ลองใช้ตัวแปรชนิดข้อความ และตัวเลขดูแล้ว ซึ่งหากใช้บ่อยๆ จนคล่อง มันจะเป็นพื้นฐานที่ดีในการเขียนโปรแกรมโดยรวมเลยล่ะครับ <br />
<br />
นอกจากนี้ตัวแปรในภาษา Ruby ยังมีหลายประเภท หลายคนอาจสังเกตโค้ดใน RGSS ว่าบางตัวแปรนั้นมีเครื่องหมาย &#36; นำหน้า (เช่น &#36;game_variables, &#36;data_items) และบางตัวแปรจะมีเครื่องหมาย @ นำหน้า (เช่น @hp, @mp, @event) หรือแม้กระทั่งตัวแปรที่ขึ้นต้นด้วย @@ ก็มี ในตอนนี้เราอย่าเพิ่งไปสนใจขนาดนั้น เดี๋ยวในเรื่อง class ของ Ruby ผมจะอธิบายทั้งหมดอีกครั้งครับ<br />
<br />
ในบทความหน้าเราจะเรียนรู้การตรวจเช็คเงื่อนไขกันครับ สำหรับบทความนี้ขอจบแต่เพียงเท่านี้ ขอให้สนุกกับการเขียนโปรแกรมครับ สวัสดีครับ ^^]]></description>
			<content:encoded><![CDATA[<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Ruby สู่การเขียน RGSS Part 2 - เข้าใจภาษา Ruby, ฝึกใช้ตัวเลข, ข้อความ, ตัวแปร</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #FF0000;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">หมายเหตุ</span></span></span><ul class="mycode_list"><li>บทความชุด "Ruby สู่การเขียน RGSS" นั้น แบ่งออกเป็นหลาย part และมีเนื้อหาเรียงลำดับ หากยังไม่ได้อ่าน part ก่อนหน้าบทความนี้ ให้ไปอ่านก่อนครับ มิฉะนั้นอาจงง หรือตามไม่ทันครับ<br />
</li>
<li>อ่านจบแล้วโปรดทิ้งความคิดเห็นและข้อเสนอแนะไว้ด้วยนะคร้าบ<br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
ในบทความนี้เราจะมาเริ่มเขียนภาษา Ruby กันจริงๆ จังๆ เสียที ซึ่งใน part ที่แล้วเราได้ลองอุ่นเครื่องด้วยการเขียนโค้ดเล็กๆ น้อยๆ และสังเกตผลลัพธ์จาก console ในบทความนี้ก็เช่นกัน เรายังคงอยู่ที่หน้าจอ console ตลอดการเรียน<br />
<br />
ไฟล์ Hello World ที่สร้างมาในบทความที่แล้ว ให้ลบทิ้งไปได้เลย แล้วต่อจากนี้ถ้ามีการเขียนโค้ด ให้สร้างไฟล์เปล่าและตั้งชื่อเองนะ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">เนื้อหาในบทความนี้</span></span><br />
<ol type="1" class="mycode_list"><li>คุณลักษณะในภาษา Ruby<br />
</li>
<li>ตัวเลข, จำนวน<br />
</li>
<li>ข้อความ<br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. คุณลักษณะในภาษา Ruby</span></span><br />
ก่อนที่จะเริ่มเขียนโปรแกรมกันเป็นเรื่องราว อยากให้ทราบถึงคุณลักษณะบางอย่างก่อน เพราะไม่งั้นอาจเกิดปัญหาระหว่างการเขียนโปรแกรมได้ ซึ่งคุณลักษณะของภาษา Ruby นั้นมีดังนี้<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Case Sensitive</span></span><br />
ไม่ว่าจะเป็นตัวแปร หรือคำสั่งใดๆ ก็ตาม ภาษาอังกฤษแม้จะเป็นคำเดียวกัน แต่มีตัวเล็กตัวใหญ่ต่างกัน ก็ถือว่าเป็นคนละตัวกัน เช่น name จะถูกมองเป็นคนละตัวกับ Name<br />
<br />
ลองสร้างไฟล์เปล่าขึ้นมาไฟล์หนึ่ง แล้วเขียนโค้ดดังนี้<br />
[shcode=rails]<br />
money = 500<br />
puts "My money is #{money}"<br />
puts "My money is #{moneY}"<br />
[/shcode]<br />
ถ้ารันแล้วแฮงก์ไม่ต้องตกใจ ดูว่าผลลัพธ์ได้ประมาณนี้หรือไม่<br />
<img src="http://upic.me/i/os/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
หากเราเขียนโค้ดผิดพลาดจนโปรแกรมไม่สามารถทำงานต่อได้ มันก็จะขึ้น error และจบโปรแกรมลงทันที และให้ลองสังเกตดูคร่าวๆ ว่ามันขึ้น error ว่าอย่างไร ซึ่งมันเขียนว่า undefined local variable or method 'moneY' ... ซึ่งแปลได้ว่า ไม่เคยมีการกำหนดค่าตัวแปร moneY ขึ้น จึงไม่สามารถเรียกค่าได้<br />
<br />
กล่าวคือ money นั้น จะถูกมองเป็นคนละตัวกับ moneY นั่นเอง และเราไม่เคยกำหนดค่าของ moneY เอาไว้ พอโปรแกรมอ่านโค้ดบรรทัดที่ 3 ที่ต้องแสดงผล moneY มันเลยไม่รู้จะเอาอะไรมาแสดง จึงแจ้ง error ขึ้นมา<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Comments</span></span><br />
หากเราเขียนโค้ดเอาไว้ แล้วไม่ต้องการใช้งานโค้ดบรรทัดนั้นชั่วคราว หรือต้องการเขียนอธิบายในตัวโค้ด ในภาษา Ruby สามารถทำได้ โดยใส่เครื่องหมาย # หน้าโค้ดที่เราเขียน ให้เราลองเขียนโค้ดดังนี้ (ลบโค้ดเก่าออกก่อนด้วยนะ)<br />
[shcode=rails]<br />
puts "Hello World!"<br />
#puts "Invisible man!"<br />
<br />
#Look at the code below<br />
#This is my information<br />
puts "My name is Splendith."<br />
<br />
#The end of the code<br />
[/shcode]<br />
เมื่อกดรันแล้ว สังเกตว่าผลลัพธ์จะขึ้นเพียง<br />
Hello World!<br />
My name is Splendith.<br />
เพราะในบรรทัดอื่นนั้นมีเครื่องหมาย # นำหน้า ทำให้โปรแกรมจะข้ามการอ่านบรรทัดนั้นไป<br />
<br />
ทีนี้หากต้องการ comment ทีละหลายบรรทัด การมานั่งเขียน # ทุกบรรทัดคงไม่สะดวกแน่ วิธีการ comment ทีละหลายบรรทัดนั้น ให้ใส่ =begin, =end ครอบหัวท้าย ดังตัวอย่างต่อไปนี้<br />
[shcode=rails]<br />
puts "Hello world!"<br />
=begin<br />
puts "My name is Splendith."<br />
puts "I am 23 years old."<br />
puts "Today is a nice day."<br />
<br />
money = 4000<br />
puts "I have #{money} baht."<br />
=end<br />
puts "Good bye!"<br />
[/shcode]<br />
ผลลัพธ์จะขึ้นเพียง<br />
Hello world!<br />
Good bye!<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Statement Delimiters หริอตัวคั่นคำสั่ง</span></span><br />
โดยปกติแล้วภาษา Ruby ที่เราเขียนนั้น เราจะเขียน 1 คำสั่ง ต่อ 1 บรรทัดใช่ไหมครับ ตัวอย่างเช่นเราเขียน คำสั่ง puts ตามด้วยข้อความ บรรทัดหนึ่ง ถ้าต้องการเขียนคำสั่งอื่นๆ ก็ต้องเขียนบรรทัดใหม่ถูกไหมครับ เราไม่มีทางเขียนแบบนี้ได้<br />
[shcode=rails]<br />
puts "Hello world!"     puts "Good bye!"<br />
[/shcode]<br />
เพราะโปรแกรมมันไม่สามารถแยกได้ว่า puts ด้านขวานั้นคืออีกคำสั่งหนึ่ง<br />
แต่อย่างไรก็ตาม หากต้องการเขียนหลายๆ คำสั่งใน 1 บรรทัดนั้น ให้เราใช้เครื่องหมาย semicolon ( ; ) ในการแบ่งคำสั่ง<br />
[shcode=rails]<br />
puts "Hello world!";    puts "Good bye!"<br />
[/shcode]<br />
ซึ่งก็จะสามารถรันได้แล้วโดยไม่มีปัญหา แต่สังเกตว่าในหน้าจอ console นั้น ข้อความ Hello world! ก็ยังคงอยู่คนละบรรทัดกับข้อความ Good bye! ในจุดนี้อย่างงนะครับ เพราะโดยปกติของคำสั่ง puts อย่างที่บอกว่ามันจะทำการขึ้นบรรทัดใหม่หลังจบข้อความเสมอ ไม่ว่าเราจะเขียนโค้ดบรรทัดเดียวกัน หรือคนละบรรทัด หรือจะเว้นห่างกันกี่บรรทัดก็ตาม<br />
<br />
อย่างไรก็ตาม ในเคสปกติแล้ว ถ้าไม่จำเป็น เราไม่ควรเขียนหลายคำสั่งในบรรทัดเดียวกัน เพราะยากต่อการอ่านทำความเข้าใจ ให้เขียนคำสั่งละบรรทัดไปเลย (แต่เดียวอนาคต ; มันจะมีประโยชน์ ค่อยมาว่ากันครับ)<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Reserved Words</span></span><br />
คำบางคำไม่สามารถนำมาใช้งานได้ เนื่องจากเป็นคำที่จองไว้เป็นคำสั่งของระบบ เช่นหากเขียนโปรแกรมดังนี้<br />
[shcode=rails]<br />
name = "Splendith"<br />
class = "Magician"<br />
<br />
puts "My name is #{name}. My class is #{class}"<br />
[/shcode]<br />
เมื่อรันแล้วจะเกิด error ขึ้น เนื่องจากคำว่า class นั้น เป็นคำเฉพาะที่ภาษา Ruby เอาไว้ใช้งานเฉพาะทาง วิธีดูว่าคำไหนที่เป็นคำเฉพาะทาง มันจะเป็นตัวอักษรสีน้ำเงิน เราไม่ควรเอามาตั้งเป็นชื่อตัวแปร<br />
<br />
ทั้งนี้ จากข้อแรกที่เราบอกว่าเป็น case sensitive ดังนั้น ถ้าเปลี่ยนจาก class เป็น Class ก็จะใช้งานได้ปกติ (แต่ในทางปฏิบัติก็ไม่ควรใช้อยู่ดีครับ เพราะเดี๋ยวจะมึนซะเปล่า)<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. ตัวเลข, จำนวน</span></span><br />
ในเนื่อหาส่วนนี้ จะมีเล่นกับตัวเลขทั้งหลายกันครับ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การแสดงผลตัวเลข</span></span><br />
เราจะใช้ puts เช่นเดิม และตามด้วยตัวเลขได้เลย โดยไม่ต้องมีเครื่องหมายฟันหนู<br />
[shcode=rails]<br />
puts 15.8<br />
[/shcode]<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Operators</span></span><br />
เครื่องหมายในการคำนวณนั้น ตามวิชาคณิตศาสตร์ที่เราเรียนกันเลยครับ นั่นคือ บวก ( + ), ลบ ( - ), คูณ ( * ) และหาร ( / ) นอกจากนี้ยังมีเครื่องหมายยกกำลัง ( ** ) และเครื่องหมาย modulo ( % ) ซึ่งหมายถึงการคืนค่าเศษจากผลหาร<br />
<br />
มาลองเขียนกันเล่นๆ ครับ<br />
[shcode=rails]<br />
puts 5<br />
puts 5 + 2<br />
puts 2 - 14<br />
puts 4 * 3<br />
puts 1.5 / 4<br />
puts 11 % 3<br />
puts 8 ** 3<br />
puts 4 * 2 + 3 - 1<br />
[/shcode]<br />
ผลลัพธ์ที่ได้<br />
<img src="http://upic.me/i/4m/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
ในบรรทัดที่ 6 นั้น 8 % 3 คือ นำ 11 ไป หารด้วย 3 ได้ 3 เศษ 2 แล้วนำ 2 มาตอบ<br />
ในบรรทัดที่ 7 นั้น 8 ** 3 หมายถึง 8 ยกกำลัง 3 ได้ 512<br />
ในบรรทัดที่ 8 เราสามารถใส่เครื่องหมายทางคณิตศาสตร์ต่อกันไปเรื่อยๆ ได้<br />
<br />
นอกจากนี้ยังสามารถกำหนดตัวแปรให้มีค่าเป็นตัวเลขได้<br />
[shcode=rails]<br />
a = 5<br />
b = 10<br />
puts a + b<br />
puts "a - b is #{a - b}"<br />
[/shcode]<br />
ผลลัพธ์ ก็จะได้ 15 และ a - b is -5 ตามลำดับ<br />
<br />
และยังสามารถเพิ่มค่า-ลดค่าตัวแปรเดิมได้ เช่น<br />
[shcode=rails]<br />
money = 500<br />
money = money + 1000<br />
puts money<br />
[/shcode]<br />
ผลลัพธ์คือ 1500 เพราะได้เพิ่มค่าตัวแปรตัวเองไปอีก 1000 จาก 500<br />
<br />
และเราสามารถยุบโดยเขียนแบบนี้ได้<br />
[shcode=rails]<br />
money = 500<br />
money += 1000<br />
puts money<br />
[/shcode]<br />
ผลลัพธ์จะได้ 1500 เช่นกัน<br />
<br />
นอกจากนี้ยังใช้ -=, *=, /=, %=, **= ได้ด้วย<br />
<br />
ทีนี้มาดูอะไรที่มัน advance ขึ้นนิดนึง<br />
ให้เขียนโค้ดด้านล่าง แล้วก่อนรันเกม ลองทายดูก่อนว่าแต่ละอันได้ผลลัพธ์อะไรบ้าง<br />
[shcode=rails]<br />
puts 5 - 3 * 2 ** 3<br />
puts 7 / 2<br />
puts 1 / 5<br />
[/shcode]<br />
หากไม่เคยเขียนโปรแกรม ท่านอาจจะงงเป็นไก่ตาแตกว่าทำไมผลลัพธ์มันเพี้ยนหลุดโลกเช่นนี้ ลองดูผลลัพธ์ที่ได้กันครับ<br />
<br />
<img src="http://upic.me/i/8d/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
พิจารณาบรรทัดที่ 1 :: 5 - 3 * 2 ** 3<br />
จากหลักสากลทุกภาษาแทบทั่วโลกนั้น เราจะทำตัวเลขที่มีเครื่องหมายที่มีความสำคัญมากกว่าก่อน ซึ่งลำดับความสำคัญของเครื่องหมายนั้นเรียงดังนี้<br />
<ol type="1" class="mycode_list"><li>วงเล็บ<br />
</li>
<li>**<br />
</li>
<li>*, /, %<br />
</li>
<li>+, -<br />
</li>
</ol>
<span style="font-weight: bold;" class="mycode_b">หมายเหตุ:</span> หากเจอเครื่องหมายลำดับเดียวกัน ให้ทำจากซ้ายไปขวา<br />
<br />
ดังนั้น ในข้อดังกล่าว เราจะทำ 2 ** 3 ก่อน แล้วค่อยเอา 3 มาคุณ จากนั้นค่อยเอา 5 มาลบ ซึ่งเราสามารถจัดนิพจน์ใหม่ได้ดังนี้คือ (5 - (3 * (2 ** 3))) คำตอบก็จะได้ -19 เหมือนที่แสดงในหน้าจอ console เด๊ะๆ<br />
<br />
ในบรรทัดที่ 2 - 3<br />
หลักการสากลของทุกภาษาส่วนใหญ่นั้น (ย้ำว่าส่วนใหญ่) หากเราทำเลขจำนวนเต็ม ไปกระทำใดๆ ก็ตามกับเลขจำนวนเต็ม ค่าที่ออกมาจะได้เลขจำนวนเต็มเสมอ หากมีเศษให้ตัดทิ้งทันที จึงเป็นเหตุผลว่าทำไมผลลัพธ์ออกมาเป็นเลขกลมๆ<br />
ซึ่งถ้าหากต้องการให้ผลลัพธ์ออกมาเป็นทศนิยม เราต้องดัดแปลงนิดหน่อยดังนี้<br />
[shcode=rails]<br />
puts 7.0 / 2 # หรือ 7 / 2.0 หรือ 7.0 / 2.0<br />
puts 1.0 / 5 # หรือ 1 / 5.0 หรือ 1.0 / 5.0<br />
[/shcode]<br />
ผลลัพธ์ก็จะได้ 3.5 และ 0.2 ตามลำดับ ทั้งนี้เพราะมันมีหลักการว่า หากนำจำนวนจริง ไปกระทำใดๆ ก็ตามกับจำนวนเต็ม มันจะได้จำนวนจริงเสมอ ดังนั้นค่าที่ออกมาจึงเป็นจำนวนจริงมีทศนิยม<br />
<br />
<span style="font-weight: bold;" class="mycode_b">หมายเหตุ:</span> จำนวนเต็มคือจำนวนที่ไม่มีทศนิยม ส่วนจำนวนจริงในภาษาคอมพิวเตอร์จะมีทศนิยมเสมอ การแทนจำนวนเต็มให้โปรแกรมเข้าใจเป็นจำนวนจริง จะต้องใส่ .0 เสมอ<br />
<br />
ทีนี้ลองทำข้อนี้ดูครับ 4 - 2 * 3 / 4 + 5 ** (3 - 1) / 3 ได้เท่าไหร่เอ่ย?<br />
หากคิดแล้วก็ลองเอาไปใส่ในโปรแกรมแล้วรันดู ถ้าคำตอบตรงกับที่คิด แปลว่าท่านเข้าใจแจ่มแจ้งเลยล่ะ<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. ข้อความ</span></span><br />
ที่ผ่านมาเราได้คุ้นเคยกับข้อความไปบ้างแล้ว สิ่งที่ท่านน่าจะสังเกตได้คือ มันจะมีฟันหนู ( " ) ครอบเสมอ นั่นแหละเราจะเรียกมันว่าข้อความ หรือภาษาอังกฤษจะใช้คำว่า string<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การแสดงผลข้อความ</span></span><br />
ผ่านมาจุดนี้ทุกคนคงได้คำตอบแล้วล่ะ นั่นคือใช้คำสั่ง puts ตามด้วยข้อความคร่อมด้วยฟันหนู<br />
[shcode=rails]<br />
puts "Hello world!"<br />
[/shcode]<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การต่อข้อความ</span></span><br />
เราจะใช้เครื่องหมาย + ในการต่อข้อความ เช่น<br />
[shcode=rails]<br />
puts "Hello" + "world!"<br />
puts "Hello " + "world!"<br />
<br />
name = "Splendith"<br />
puts "Hello, " + name<br />
puts "Hello, #{name}"<br />
[/shcode]<br />
<br />
ผลลัพธ์<br />
<img src="http://upic.me/i/hu/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
สังเกตว่าในบรรทัดที่ 1 หากเราต่อข้อความ มันจะไม่ใส่เว้นวรรคให้ ต้องเพิ่มเองให้เหมือนบรรทัดที่ 2<br />
ในบรรทัดที่ 4 เรากำหนดตัวแปร name ให้มีค่า "Splendith"<br />
ในบรรทัดที่ 5 เราสามารถเอาข้อความไปต่อกับตัวแปรที่เป็นชนิดข้อความได้เลย หรือสามารถทำแบบบรรทัดที่ 6 เหมือนที่เคยทำในตัวอย่างก่อนๆ ก็ได้ ผลลัพธ์เหมือนกัน<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การทวีคูณข้อความ</span></span><br />
ในภาษา Ruby มีท่าพิเศษที่เราสามารถเอาข้อความไป * กับตัวเลขได้ด้วย<br />
[shcode=rails]<br />
puts "Hello" * 4<br />
[/shcode]<br />
<br />
ผลลัพธ์ก็จะได้ HelloHelloHelloHello<br />
หรือถ้าเราต้องการเส้นคั่นเก๋ๆ<br />
[shcode=rails]<br />
puts "--------------------------------------------------"<br />
[/shcode]<br />
เราสามารถเขียนเป็น<br />
[shcode=rails]<br />
puts "-" * 50<br />
[/shcode]<br />
ได้เลย โหดฝุดๆ ^^<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Escape Characters</span></span><br />
<br />
ทีนี้มาดูตัวอย่างที่มัน advance ขึ้นอีกนิด<br />
[shcode=rails]<br />
puts "The length of a standard ruler is 12" or 1' or 30 cm."<br />
[/shcode]<br />
เมื่อรันแล้วจะพบว่ามัน error ใช่ไหมครับ พอจะเดาได้ไหมว่าเป็นที่อะไร?<br />
หากมองไม่ออก ไม่เป็นไรครับ เราบอกว่า string ต้องคร่อมด้วยฟันหนู ( " ) ถูกไหมครับ แต่เจ้ากร๊รม ในข้อความของเราก็ดันมีเครื่องหมาย " ในนั้น (12") ทำให้โปรแกรมมันมองว่า เครื่องหมาย " หลังเลข 12 คือการจบข้อความ แล้วก็ ต่อด้วย or 1' or 30 cm." อะไรไม่รู้ข้างหลัง มันอ่านไม่ได้ มันเลย error ขึ้น<br />
<br />
วิธีการแก้นั้นไม่ยาก มันจะมีสิ่งที่เรียกว่า escape character ซึ่งมีแทบทุกภาษาเช่นกัน<ul class="mycode_list"><li>\" ใช้แทนเครื่องหมาย " ในข้อความ<br />
</li>
<li>\\ ใช้แทนเครื่องหมาย \ ในข้อความ<br />
</li>
<li>\n ใช้แทนขึ้นบรรทัดใหม่ในข้อความ<br />
</li>
<li>\t ใช้แทนการเคาะ tab ในข้อความ<br />
</li>
<li>และยังมีอย่างอื่นอีก ซึ่งจะไม่ลงที่นี่<br />
</li>
</ul>
ว่าแล้วก็ลองแก้ดูครับ โดยเปลี่ยนจาก 12" เป็น 12\"<br />
[shcode=rails]<br />
puts "The length of a standard ruler is 12\" or 1' or 30 cm."<br />
[/shcode]<br />
ทีนี้โปรแกรมก็จะมองว่า \" คือ เครื่องหมาย " ที่อยู่ด้านในข้อความ มิใช้เครื่องหมายปิดข้อความแต่อย่างใด<br />
<br />
ผลลัพธ์<br />
<img src="http://upic.me/i/80/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
มาลองดูอีกตัวอย่างหนี่งดู<br />
[shcode=rails]<br />
puts "Thai flag has 3 colors\n1. red\n2. white\n3. blue"<br />
[/shcode]<br />
ผลลัพธ์<br />
<img src="http://upic.me/i/et/10capture.jpg" loading="lazy"  alt="[Image: 10capture.jpg]" class="mycode_img" /><br />
<br />
อันนี้เป็นตัวอย่างการขึ้นบรรทัดใหม่ให้ดู ซึ่งจริงๆ แล้วควรจะเขียนแยกบรรทัดกันเพื่อง่ายต่อการอ่านครับ<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Single Quote</span></span><br />
นอกจากการใส้ข้อความในเครื่องหมายฟันหนู ( " ) หรือ double quote แล้ว ยังสามารถใส่ในเครื่องหมาย ( ' ) หรือ single quote (ภาษาไทยเรียก เครื่องหมายฝนทอง *0*)  ได้อีกด้วย เช่น<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>puts 'Hello world!'</code></div></div><br />
การครอบด้วย ' ยังสามารถใช้เครื่องหมาย " ด้านในโดยไม่ต้องเขียน \"<br />
การครอบด้วย " ยังสามารถใช้เครื่องหมาย ' ด้านในโดยไม่ต้องเขียน \' เช่นกัน<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>puts '12" = 30 cm'<br />
puts "1' = 30 cm"</code></div></div><br />
<span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">แต่ๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ</span></span><br />
เครื่องหมาย ' นั้น ไม่รองรับ escape character นอกจาก \\ และ \' และไม่รองรับการแทนนิพจน์ด้วย #{} ลองดูได้จากตัวอย่างนี้ครับ<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>name = "Splendith"<br />
puts "Hello, #{name}.&#92;tToday is a nice day!"<br />
puts 'Hello, #{name}.&#92;tToday is a nice day!'</code></div></div><br />
ผลที่ได้<br />
<img src="http://upic.me/i/c2/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
ผลลัพธ์จากเครื่องหมาย ' นั้นจะไม่แทนตัวแปรและ escape character ลงไป และยังคงข้อความเดิมไว้<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">ข้อควรระวัง</span></span><br />
ให้ดูตัวอย่างดังต่อไปนี้ครับ<br />
[shcode=rails]<br />
money = 500<br />
puts "I have " + money + " baht."<br />
[/shcode]<br />
เมื่อรันดู จะพบกับ error เนื่องจากเราไม่สามารถเอาข้อความไปต่อกับตัวเลขได้ ดังนั้น มันจึงพังตรง ". I have " + money + " baht." เพราะ money เป็นตัวแปรชนิดตัวเลข<br />
<br />
วิธีการแก้ไขมี 2 แบบ แบบแรกคือ ให้ใช้ #{} แทน<br />
[shcode=rails]<br />
money = 500<br />
puts "I have #{money} baht."<br />
[/shcode]<br />
ซึ่งเป็นวิธีที่ควรใช้<br />
<br />
ส่วนแบบที่สองนั้น ให้ใส่ .to_s ตามหลังตัวแปรชนิดตัวเลขของเราในการแสดงผลข้อความ<br />
[shcode=rails]<br />
money = 500<br />
puts "I have " + money.to_s + " baht."<br />
[/shcode]<br />
money.to_s มีความหมายว่า เฮ้ย เจ้าโปรแกรม ให้มอง money ให้เป็นข้อความเพื่อนำไปแสดงนะ อะไรทำนองนั้น<br />
<br />
หลายคนก็สงสัยว่า ทำแบบนี้ได้หรือเปล่าเอ่ยย<br />
[shcode=rails]<br />
money = "500"<br />
puts "I have " + money + " baht."<br />
[/shcode]<br />
พูดง่ายๆ คือ เก็บตัวแปร money เป็นข้อความ "500" ไปซะเลย<br />
คำตอบคือ <span style="color: #0000CD;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">ได้</span></span> แต่ <span style="font-weight: bold;" class="mycode_b"><span style="color: #FF0000;" class="mycode_color">อันตราย</span></span> มากๆ เพราะคุณจะสูญเสียความเป็นตัวเลขในตัวแปร money ไปทันที กล่าวคือ คุณไม่สามารถใช้ operator มาคำนวณได้อีก<br />
<br />
เพื่อให้เข้าใจมากกว่านี้ สมมุติผมมีเงิน 500 บาท ต่อมาพ่อให้ผมอีก 1000 บาท ผมจะมีเงินรวม 1500 บาทใช่ไหมครับ ถ้าเราดันเปลี่ยน money เป็นชนิดข้อความ เราก็จะเขียนมั่วๆ ได้แบบนี้<br />
[shcode=rails]<br />
money = "500"<br />
puts "I have " + money + " baht."<br />
<br />
money = money + 1000<br />
puts "Now I have " + money + " baht."<br />
[/shcode]<br />
ซึ่งแน่นอนว่ามัน error เพราะในบรรทัดที่ 4 เราเอาตัวแปร money ซึ่งเป็นข้อความ ไป + กับตัวเลข<br />
เราก็จะแก้เป็นแบบนี้<br />
[shcode=rails]<br />
money = "500"<br />
puts "I have " + money + " baht."<br />
<br />
money = money + "1000"<br />
puts "Now I have " + money + " baht."<br />
[/shcode]<br />
ผลก็คือ รันได้ ไม่ error แต่เราจะมีเงิน 5001000 บาท แทน พ่อให้ทีรวยเละเบย เพราะมันมองเป็นการเอาข้อความมาต่อกัน ถูกไหมครับ<br />
<br />
มันจึงเป็นเหตุผลว่า หากเป็นข้อมูลตัวเลขที่ต้องเอาไปคำนวณภายหลัง เช่น + - * / % ** เราต้องเก็บเป็นตัวเลข ห้ามเก็บเป็นข้อความเด็ดขาด<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">สรุป</span></span><br />
ในบทความนี้เราได้ลองใช้ตัวแปรชนิดข้อความ และตัวเลขดูแล้ว ซึ่งหากใช้บ่อยๆ จนคล่อง มันจะเป็นพื้นฐานที่ดีในการเขียนโปรแกรมโดยรวมเลยล่ะครับ <br />
<br />
นอกจากนี้ตัวแปรในภาษา Ruby ยังมีหลายประเภท หลายคนอาจสังเกตโค้ดใน RGSS ว่าบางตัวแปรนั้นมีเครื่องหมาย &#36; นำหน้า (เช่น &#36;game_variables, &#36;data_items) และบางตัวแปรจะมีเครื่องหมาย @ นำหน้า (เช่น @hp, @mp, @event) หรือแม้กระทั่งตัวแปรที่ขึ้นต้นด้วย @@ ก็มี ในตอนนี้เราอย่าเพิ่งไปสนใจขนาดนั้น เดี๋ยวในเรื่อง class ของ Ruby ผมจะอธิบายทั้งหมดอีกครั้งครับ<br />
<br />
ในบทความหน้าเราจะเรียนรู้การตรวจเช็คเงื่อนไขกันครับ สำหรับบทความนี้ขอจบแต่เพียงเท่านี้ ขอให้สนุกกับการเขียนโปรแกรมครับ สวัสดีครับ ^^]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ruby สู่การเขียน RGSS Part 1 - มาเริ่มต้นกันเถอะ :)]]></title>
			<link>https://irpg.in.th/thread-2447.html</link>
			<pubDate>Sat, 13 Jun 2015 04:12:34 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2730">splendith</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2447.html</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Ruby สู่การเขียน RGSS Part 1 - มาเริ่มต้นกันเถอะ <img src="https://irpg.in.th/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" /></span></span><br />
<br />
สวัสดีครับ เนื่องจากในตอนนี้ได้มีบทความเกี่ยวกับการโม script ไปบ้างแล้ว และเดี๋ยวจะมี Workshop มาลงให้ทุกท่านได้ศึกษากัน แต่เนื่องจากการโม script และการเขียน script จริงนั้น พื้นฐานการเขียน Ruby เป็นสิ่งที่ขาดไม่ได้ ซึ่งหากได้อ่าน<a href="http://irpg.in.th/thread-2441-post-24674.html#pid24674" target="_blank" rel="noopener" class="mycode_url">บทความการโม script ของผม</a>แล้ว จะพบว่าในบทความนั้นเน้นไปในทางการ "เดา" โค้ด ว่าคำสั่งต่างๆ มันน่าจะทำงานยังงั้นยังงี้ ซึ่งถ้าท่านได้เรียนรู้การเขียน Ruby ระดับหนึ่งแล้ว ลองกลับไปแกะ script ใหม่อีกรอบนั้น ท่านจะเริ่มเปลี่ยนจากการ "เดา" เป็นการหา "หลักการ" มากขึ้น การ "ลองผิดลองถูก" จะเปลี่ยนเปนการ "ทำความเข้าใจ" สูงขึ้น และยิ่งเรียนรู้มากขึ้น ก็จะยิ่งเข้าใจโค้ดมากขึ้น ในอนาคตการแกะโค้ดก็ไม่ต่างอะไรกับการแกะถั่วเลยล่ะ หุหุ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">สิ่งที่จำเป็นกับการฝึก</span></span><br />
เนื่องจากสมาชิกในบอร์ดนี้น่าจะเขียนภาษา Ruby เพื่อใช้ในโปรแกรม RPG Maker XP, VX, VX Ace ดังนั้น เราจะใช้โปรแกรมดังกล่าวในการเรียนภาษา Ruby เลยครับ ใครใช้เวอร์ชันไหนให้เลือกตัวนั้นเลยจ้า<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">เนื้อหาในบทความนี้</span></span><ul class="mycode_list"><li>บทนำ<br />
</li>
<li>จำเป็นต้องเป็นโปรแกรมเมอร์มาก่อนหรือไม่<br />
</li>
<li>ภาษา Ruby คืออะไร และ RGSS คืออะไร<br />
</li>
<li>เขียน RGSS เวอร์ชันไหนดี<br />
</li>
<li>การทำงานของ RGSS<br />
</li>
<li>หน้าจอ Console นั้นขาดไม่ได้!<br />
</li>
<li>อุ่นเครื่องกับการเริ่มเขียน Ruby Script อย่างง่าย<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">บทนำ</span></span><br />
ในยุคของ RPG Maker ในสมัยเวอร์ชัน 95, 2000, 2003 นั้น การสร้างเกม RPG ขึ้นมาเกมหนึ่งนั้นทำได้ง่ายและสนุก ใช้เวลาฝึกฝนให้เป็นเทพได้ไม่นาน คำว่า "ใครๆ ก็สามารถสร้างเกม RPG ขึ้นมาได้" คือสโลแกนของเวอร์ชั่นที่กล่าวมา ซึ่งแน่นอนว่ามันมีข้อจำกัดต่างๆ มากมาย เพราะการตั้งค่าภายในโปรแกรม, ฐานข้อมูล, และเหตุการณ์ (event) นั้นยังมีขีดจำกัดของมันอยู่ (แต่ในสมัยนั้นคนทั่วไปทำเกมได้นี่ถือว่าอลังการแล้วนะ O_O)<br />
<br />
ในเวลาต่อมา ก็ได้ถือกำเนิด RPG Maker XP ขึ้นมา ซึ่งเป็นการปฏิรูปวงการ RPG Maker เลยก็ว่าได้ เพราะว่ามีคุณสมบัติใหม่ที่เพิ่มเติมเข้ามา นั่นคือระบบ script editor โดยใช้ภาษา Ruby เป็นแกนหลัก ทำให้เกม RPG ที่สร้างจาก RPG Maker XP นั้นมีความยืดหยุ่นหลากหลายมาก ไม่ซ้ำซากจำเจ แต่ความยืดหยุ่นย่อมแลกมาด้วยความซับซ้อนของระบบมากยิ่งขึ้น เพราะทันทีที่กด F11 เปิด script editor ขึ้นมา ก็พบกับความงุนงง ว่าแล้วก็อย่าไปแตะต้องมันเลย เดี๋ยวเกมพัง บรึ๋ยยยยยย~~<br />
<br />
คำว่า "ใครๆ ก็สามารถสร้างเกม RPG ขึ้นมาได้" นั้น ยังคงใช้ได้อยู่ใน RPG Maker XP แต่ "คนที่เขียน script เป็น" นั้นจะมีผลงานออกมาแตกต่าง เป็นเอกลักษณ์ และเหนือชั้น...<br />
<br />
แน่นอนว่าผมเองก็เป็นคนหนึ่งที่กลัวหน้าจอ script editor มาก่อนเหมือนกัน ผมได้ฝึกมาระยะหนึ่ง และในวันนี้ ความกลัวได้หมดลงแล้ว เป็นความสนุก และความสุขที่ได้เขียน ซึ่งแน่นอนว่า เป้าหมายของผมก็จะทำให้ความกลัวของทุกๆ คนหมดไป และมีความสุขกับมันเช่นกัน <br />
<br />
เชื่อผมเถอะครับ การฝึกเขียน script มันไม่ได้มีประโยชน์เฉพาะใน RPG Maker เท่านั้น หากคุณมีความฝันที่จะเขียนเกมจริงๆ จังๆ ในอนาคตแล้ว มันเป็นโอกาสที่ดีมาก และสร้างมูลค่ากับตนเองขึ้นไปอีกระดับหนึ่งทีเดียวครับ <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
เกมที่สมบูรณ์แบบ ย่อมไม่พ้นการเขียนโปรแกรม เรียนเถอะครับ มีแต่กำไรกับกำไร ^^<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">จำเป็นต้องเป็นโปรแกรมเมอร์มาก่อนหรือไม่</span></span><br />
ขอตอบว่าไม่จำเป็นครับ ทุกคนเริ่มฝึกฝน ณ จุดนี้ได้ ในบทความนี้จะพยายามสอนพื้นฐานที่จำเป็นในการนำไปเขียน script ครับ ดังนั้นไม่ต้องกังวลว่าท่านไม่เคยเขียนโปรแกรมมาก่อน<br />
<br />
แต่ก็ต้องเรียนกันตรงๆ ว่า คนที่เคยเขียนโปรแกรมมาก่อน หรือเรียนด้านนี้โดยเฉพาะ จะได้เปรียบกว่าคนที่ไม่เคยเขียนอย่างมากครับ เพราะมีประสบการณ์ความรู้ด้านตรรกะ และกระบวนการแก้ปัญหามาแล้วนั่นเอง ซึ่งคนที่ไม่เคยเขียนโปรแกรมมาก่อนอาจต้องฝึกฝนในจุดนี้เพิ่มเติมด้วยครับ แต่สิ่งเหล่านี้มันเป็นเรื่องที่ต้องใช้เวลาครับ ดังนั้นไม่ต้องไปซีเรียสมาก<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">ภาษา Ruby คืออะไร และ RGSS คืออะไร</span></span><br />
ภาษา Ruby เป็นภาษาคอมพิวเตอร์ภาษาหนึ่ง สร้างขึ้นโดยคนญี่ปุ่น (<a href="https://en.wikipedia.org/wiki/Ruby_(programming_language)" target="_blank" rel="noopener" class="mycode_url">รายละเอียดเพิ่มเติม</a>) ซึ่งเป็นภาษาที่มีความสละสลวย อ่านง่าย ผู้พัฒนาตั้งใจให้ทุกคนที่เขียนภาษา Ruby มีความสุข ดังนั้น หากเขียนภาษานี้เป็นแล้ว ท่านจะสนุกกับมันสุดๆ เลยล่ะ ~ ความยากในการเรียนรู้นั้น เทียบกับภาษาอื่นๆ แล้ว ขอบอกว่า ค่อนข้างยากกว่าภาษาอื่นๆ แต่ไม่ต้องห่วง เราจะค่อยๆ ไปพร้อมๆ กันครับ<br />
<br />
ส่วน RGSS นั้น ย่อมาจาก Ruby Game Scripting System แปลตรงตัวก็คือ ระบบเขียนเกมด้วย script โดยใช้ภาษา Ruby ซึ่ง RPG Maker เป็นผู้สถาปนาระบบ RGSS ขึ้นมา ซึ่งเจ้า RGSS นั้นเปรียบได้เหมือนโครงสร้างของระบบเกมของ RPG Maker ที่เขียนขึ้นด้วยภาษา Ruby ใช้เป็นตัวกลางควบคุมทุกสิ่งอย่าง ไม่ว่าจะเป็นตัวละคร ไอเท็ม มอนสเตอร์ ฉากต่างๆ การดำเนินเรื่อง เหตุการณ์ ฯลฯ ซึ่งวาดแผนผังออกมาน่าจะมีกระบวนการดังนี้<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">เขียน RGSS เวอร์ชันไหนดี</span></span><br />
คิดว่าทุกๆ ท่านในที่นี้ (และหลายๆ คนบนโลกนี้) น่าจะแบ่งการใช้งาน RPG Maker เป็น 2 ฝั่ง ใหญ่ๆ นั่นคือ RPG Maker XP และ RPG Maker VX Ace (ที่เป็นตัวพัฒนาจาก VX) เพราะมีเอกลักษณ์แตกต่างกันพอสมควร มีข้อดีข้อเสีย จุดเด่น จุดด้อย แตกต่างกันไป ทั้งนี้ขึ้นกับความชอบของแต่ละคน<br />
<br />
แต่ถ้าหากพูดในแง่การเขียน script แล้ว ใน RPG Maker XP นั้นใช้ RGSS เวอร์ชั่น 1 และ RPG Maker VX Ace นั้นใช้ RGSS เวอร์ชัน 3<br />
<br />
ซึ่งจากประสบการณ์ที่ผมได้เรียนรู้ทั้งสองเวอร์ชั่นนั้น RGSS 3 นั้นได้ปรับปรุงพัฒนาไปตามยุคสมัย ซึ่งดีกว่า RGSS 1 ในทุกๆ ด้าน ทั้งมีรูปแบบโครงสร้างที่อ่านเข้าใจง่ายกว่า มีการจัดว่างแบ่งไฟล์ได้เหมาะสมและเป็นหมวดหมู่กว่า แนวคิดและวิธีการเขียนโปรแกรมนั้นเป็นระบบกว่ามากๆ และที่สำคัญที่สุดคือ ใช้ Ruby เวอร์ชันใหม่กว่าซึ่งมีประสิทธิภาพสูงกว่าพอสมควร (เวอร์ชันห่างกันเกือบ 10 ปีนะเธอว์)<br />
<br />
ดังนั้น ในแง่การเขียน script ถ้าให้ผมแนะนำ ผมขอแนะนำให้ท่านเริ่มเขียน RGSS 3 บน RPG Maker VX Ace ไปเลยดีกว่าครับ ได้ผลดีกว่าในระยะยาว แต่ถ้าท่านไม่ชอบเจ้า Ace จริงๆ หรือว่าไม่มีโปรแกรม หรือว่ายึดติด XP ไปแล้ว ก็ไม่มีปัญหาครับ เพราะบทความซีรีส์นี้ของผมนั้นสอนเขียน Ruby เป็นหลักครับ ไม่ได้สอนเขียน RGSS<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การทำงานของ RGSS</span></span><br />
เคยสังเกตไหมครับ ว่า โฟลเดอร์ชื่อว่า Data ที่อยู่ในโปรเจกต์ มันคืออะไร... (โปรเจกต์ที่ยังไม่ Encrypt นะครับ)<br />
<br />
มันคือไฟล์ข้อมูลที่ใช้อ่านตอนอยู่ในเกมนั่นเอง ซึ่งเมื่อเราใช้ RPG Maker แล้วกด Ctrl+S ปุ๊บ ไฟล์เหล่านั้นก็จะทำการอัพเดตใหม่ตามข้อมูลที่เราแก้ในเกมทั้งหมด ซึ่งถ้าลองดูเผินๆ แล้ว มันจะมีไฟล์ที่น่าจะอยู่ใน database (F9) ของเกม ส่วนแผนที่และเหตุการณ์ (event) ทั้งหลายที่เรายัดๆ แก้ๆ นั้น จะถูกเก็บอยู่ในไฟล์ MapXXX.r-data- (r-data- คือ rxdata หรือ rvdata2 ขึ้นกับเวอร์ชัน) ดังนั้น ไม่ว่าเราจะแก้ไขแผนที่ อีเวนต์ หรือฐานข้อมูลเกม ข้อมูลทุกอย่างล้วนยัดอยู่ในโฟลเดอร์ Data<br />
<br />
ซึ่งเมื่อเรากดรันเกมปุ๊บ ระบบก็จะทำการดึงข้อมูลต่างๆ ที่อยู่ในโฟลเดอร์ดังกล่าว ไปประมวลผลเป็นเกมที่เราเห็นนั่นเอง ซึ่งการดึงข้อมูลนั้น เป็นหน้าที่ของไฟล์ที่ชื่อว่า Scripts.r-data- ซึ่งเป็นไฟล์ เก็บ script ในหน้าจอ script editor (F11)<br />
<br />
กล่าวคือ script เป็นตัวที่ทำให้ข้อมูลทั้งหมดในเกมเกิดขึ้นมา ซึ่งขับเคลื่อนโดย RGSS นั่นเอง<br />
หลักการของการรันก็คือ<br />
<br />
เมื่อกดรันเกม -&gt; เกมไปอ่านไฟล์ Scripts.r-data- (RGSS) -&gt; RGSS ทำการควบคุม จัดการเกมโดยอ่านข้อมูลไฟล์อื่นๆ ในโฟลเดอร์ Data และนำมาแสดงผล -&gt; ออกมาเป็นเกมที่เห็น<br />
<br />
ทีนี้ผมอยากให้ท่านลองเปิดโปรแกรมแล้วกด F11 เพื่อแสดงหน้าจอ script editor ขึ้นมาครับ ให้สังเกตฝั่งซ้ายที่เป็นรายการ script ต่างๆ ในการอ่านไฟล์ Scripts.r-data- นั้น มันจะไล่อ่านโค้ดทั้งหมดเรียงจากบนลงล่างในทุกๆ ไฟล์เลยครับ ดังนั้นถ้าผมเพิ่มไฟล์ลงไป มันก็จะอ่านไฟล์ที่ผมเพิ่มด้วย ซึ่งเดี๋ยวเราจะมาเพิ่มไฟล์เพื่อฝึกเขียนภาษา Ruby กันครับ แต่ก่อนจะมาเริ่มเขียนนั้น ผมขอให้ทุกท่านอ่านหัวข้อถัดไปก่อน<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">หน้าจอ Console นั้นขาดไม่ได้!</span></span><br />
ถ้าท่านใช้ RPG Maker VX Ace ให้ลองไปที่ Game -&gt; Show Console<br />
<img src="http://upic.me/i/89/66untitled.png" loading="lazy"  alt="[Image: 66untitled.png]" class="mycode_img" /><br />
<br />
แล้วลองกดรันเกมดู พบว่าจะมีจอดำๆ ประหลาดๆ โผล่มา เราเรียกมันว่าหน้าจอ console<br />
<br />
<img src="http://upic.me/i/qc/6capture.jpg" loading="lazy"  alt="[Image: 6capture.jpg]" class="mycode_img" /><br />
<br />
จอนี้ใช้ทำการ log ข้อมูลออกมาดู ซึ่งสำคัญมากกกกก หากท่านเขียนสคริปต์ที่ซับซ้อนในภายหลัง แล้วต้องการให้มันแสดงสถานะอะไรบางอย่างออกมา การมีจอนี้ทำให้การ Debug โค้ดนั้นง่ายกว่าเดิมสุดๆ ไม่ว่าจะเป็นการโม script หรือเขียน script ขึ้นใหม่ จอ console จะทำให้การเขียน script ของคุณจะราบรื่นขึ้นมาก เราจะใช้จอ console นี้ตลอดทุกบทความ รวมถึงกระทู้พวก Workshop ต่างๆ ที่อาจมีขึ้นในอนาคตด้วย<br />
<br />
สำหรับผู้ที่ใช้ RPG Maker XP, RPG Maker VX เราขอแสดงความเสียใจที่โปรแกรมนั้นไม่มีจอ console แต่โชคดีสุดๆ ที่ในเว็บบอร์ดนอกนั้นมีผู้ใจดีเขียนระบบจอ console ผ่าน script ให้ ซึ่ง<a href="http://forums.rpgmakerweb.com/index.php?/topic/15747-xp-and-vx-console-output/" target="_blank" rel="noopener" class="mycode_url">ดาวน์โหลดได้ที่นี่เลยครับ</a> เมื่อดาวน์โหลดมาแล้ว ให้นำไปวางไว้เหนือไฟล์ Main ในหน้าจอ script editor โดยคลิกขวาที่ Main แล้วเลือก Insert จะมีช่องเปล่าขึ้นมา ให้ตั้งชื่อว่า Console แล้วด้านขวาใส่โค้ดในเว็บนั้นลงไป ตามภาพ<br />
<br />
<img src="http://upic.me/i/58/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<br />
ทีนี้ก็จะมีจอ console เหมือนกันแล้ว ^^<br />
<img src="http://upic.me/i/w2/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">อุ่นเครื่องกับการเริ่มเขียน Ruby Script อย่างง่าย</span></span><br />
เอาล่ะครับ กด F11 เปิด script editor แล้วทีนี้ให้ลองสร้างไฟล์ใหม่ขึ้นมา โดยใน RPG Maker VX Ace ให้ไปที่ส่วนของ Material ในฝั่งซ้าย คลิกขวาคำว่า ( Insert here ) เลือก Insert มันจะมีช่องว่างโผล่มา ให้ตั้งชื่อว่า Hello World (จริงๆ ตั้งอะไรก็ได้)<br />
<br />
<img src="http://upic.me/i/ls/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
ส่วน RPG Maker XP ให้คลิกขวาที่ Main แล้วเลือก Insert จะมีช่องเปล่าขึ้นมา ให้ตั้งชื่อว่า Hello World เหมือนกัน<br />
<br />
<img src="http://upic.me/i/uq/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
หลังจากที่สร้างไฟล์เสร็จแล้ว ทีนี้ให้เลือกไฟล์ Hello World ของเรา ในหน้าจอฝั่งขวาจะว่างเปล่า เพราะยังไม่ได้เขียนอะไร ให้ลองเขียนโค้ดลงไปดังนี้<br />
<br />
[shcode=rails]<br />
puts "Hello World!"<br />
puts "Welcome to RPG Maker Script!"<br />
<br />
name = "Splendith"<br />
age = 23<br />
color = "blue"<br />
<br />
puts ""<br />
puts "My name is #{name}."<br />
puts "I am #{age} years old."<br />
puts "My favorite color is #{color}."<br />
[/shcode]<br />
<br />
จากนั้นลองกดรันเกมดู<br />
<br />
แต่นแต๊น... หน้าจอเกมยังเหมือนเดิมไม่มีอะไรเปลี่ยน<br />
แต่ให้ลองสังเกตจอ console ของเรา<br />
<br />
มันมีข้อความขึ้นมาใช่ไหมเอ่ย~<br />
<br />
<img src="http://upic.me/i/hj/6capture.jpg" loading="lazy"  alt="[Image: 6capture.jpg]" class="mycode_img" /><br />
<br />
นี่แหละครับ ประโยชน์ของหน้าจอ console ครับ ซึ่งในบทเรียนภาษา Ruby ที่ผมจะสอนนั้น เราจะไม่ไปยุ่งเกี่ยวกับเกมเลยครับ กด Run ให้เกมขึ้น ปล่อยมันไป แล้วเราสนใจกันแต่จอดำ 555+<br />
<br />
ทีนี้เมื่อเห็นผลลัพธ์ที่ออกมาแล้ว อยากให้ลองสังเกตดูครับว่าโค้ดที่เขียนไปนั้นทำงานอย่างไร จึงจะได้ผลลัพธ์ดังกล่าว ซึ่งไม่ยากใช่ไหมครับ<br />
<br />
คำสั่ง puts เป็นคำสั่งใช้ในการแสดงข้อความออกทางหน้าจอ console โดยการพิมพ์ข้อความจำเป็นต้องมรเครื่องหมายฟันหนู (") คร่อม  ซึ่งคำสั่งนี้จะทำการขึ้นบรรทัดใหม่ให้ด้วย<br />
<br />
ในบรรทัดที่ 4-6 เรากำหนด name ให้มีค่า "Splendith" กำหนด age ให้มีค่า 23 และกำหนด color ให้มีค่า "blue" ซึ่งเจ้า name, age, color ในทางการเขียนโปรแกรมเราจะเรียกมันว่า "ตัวแปร" ซึ่งใช้ในการกำหนดค่าไปใช้ในอนาคตได้ครับ และสังเกตว่าถ้าใส่ข้อความ ต้องมีฟันหนู (") คร่อม เช่นเดิม แต่ข้อมูลตัวเลข (23) นั้นไม่จำเป็นต้องมี<br />
บรรทัดที่ 8 ทำการ puts ข้อความเปล่า นั่นก็คือต้องการเว้นช่อง 1 บรรทัดในหน้าจอแสดงผล<br />
ส่วนบรรทัดที่ 9-11 เราได้ทำการแทนค่าในตัวแปรลงไปในข้อความ ด้วยการเขียน #{  } คร่อมตัวแปรของเรา ลงในข้อความ ค่าของตัวแปรก็จะถูกนำไปแสดงในข้อความนั่นเอง<br />
<br />
ทีนี้ลองเปลี่ยนข้อมูลในตัวแปรเป็นชื่อ อายุ และสีที่ชอบเป็นข้อมูลตัวท่านดู แล้วลองรันใหม่ สังเกตผลลัพธ์<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">สรุป</span></span><br />
เป็นยังไงกันบ้างครับ พอจะเข้าใจกระบวนการทำงานของ RGSS และรู้สึกสนุกและตื่นเต้นกับการเขียน script หรือเปล่าครับ หากเริ่มสนุกกับมันแล้วล่ะก็ บทความต่อไปเราจะมาเข้มข้น เน้นการเขียน Ruby แบบจะๆ กันครับ ส่วนบทความนี้อาจจะมีการบรรยายมากไปหน่อย ถ้าเบื่อหรือง่วงก็ขออภัยครับ<br />
<br />
บทความนี้สรุปไม่ยาวมาก ยังไงก็ขอให้มีความสุขกับการเขียน script นะครับ ^^]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Ruby สู่การเขียน RGSS Part 1 - มาเริ่มต้นกันเถอะ <img src="https://irpg.in.th/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" /></span></span><br />
<br />
สวัสดีครับ เนื่องจากในตอนนี้ได้มีบทความเกี่ยวกับการโม script ไปบ้างแล้ว และเดี๋ยวจะมี Workshop มาลงให้ทุกท่านได้ศึกษากัน แต่เนื่องจากการโม script และการเขียน script จริงนั้น พื้นฐานการเขียน Ruby เป็นสิ่งที่ขาดไม่ได้ ซึ่งหากได้อ่าน<a href="http://irpg.in.th/thread-2441-post-24674.html#pid24674" target="_blank" rel="noopener" class="mycode_url">บทความการโม script ของผม</a>แล้ว จะพบว่าในบทความนั้นเน้นไปในทางการ "เดา" โค้ด ว่าคำสั่งต่างๆ มันน่าจะทำงานยังงั้นยังงี้ ซึ่งถ้าท่านได้เรียนรู้การเขียน Ruby ระดับหนึ่งแล้ว ลองกลับไปแกะ script ใหม่อีกรอบนั้น ท่านจะเริ่มเปลี่ยนจากการ "เดา" เป็นการหา "หลักการ" มากขึ้น การ "ลองผิดลองถูก" จะเปลี่ยนเปนการ "ทำความเข้าใจ" สูงขึ้น และยิ่งเรียนรู้มากขึ้น ก็จะยิ่งเข้าใจโค้ดมากขึ้น ในอนาคตการแกะโค้ดก็ไม่ต่างอะไรกับการแกะถั่วเลยล่ะ หุหุ<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">สิ่งที่จำเป็นกับการฝึก</span></span><br />
เนื่องจากสมาชิกในบอร์ดนี้น่าจะเขียนภาษา Ruby เพื่อใช้ในโปรแกรม RPG Maker XP, VX, VX Ace ดังนั้น เราจะใช้โปรแกรมดังกล่าวในการเรียนภาษา Ruby เลยครับ ใครใช้เวอร์ชันไหนให้เลือกตัวนั้นเลยจ้า<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">เนื้อหาในบทความนี้</span></span><ul class="mycode_list"><li>บทนำ<br />
</li>
<li>จำเป็นต้องเป็นโปรแกรมเมอร์มาก่อนหรือไม่<br />
</li>
<li>ภาษา Ruby คืออะไร และ RGSS คืออะไร<br />
</li>
<li>เขียน RGSS เวอร์ชันไหนดี<br />
</li>
<li>การทำงานของ RGSS<br />
</li>
<li>หน้าจอ Console นั้นขาดไม่ได้!<br />
</li>
<li>อุ่นเครื่องกับการเริ่มเขียน Ruby Script อย่างง่าย<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">บทนำ</span></span><br />
ในยุคของ RPG Maker ในสมัยเวอร์ชัน 95, 2000, 2003 นั้น การสร้างเกม RPG ขึ้นมาเกมหนึ่งนั้นทำได้ง่ายและสนุก ใช้เวลาฝึกฝนให้เป็นเทพได้ไม่นาน คำว่า "ใครๆ ก็สามารถสร้างเกม RPG ขึ้นมาได้" คือสโลแกนของเวอร์ชั่นที่กล่าวมา ซึ่งแน่นอนว่ามันมีข้อจำกัดต่างๆ มากมาย เพราะการตั้งค่าภายในโปรแกรม, ฐานข้อมูล, และเหตุการณ์ (event) นั้นยังมีขีดจำกัดของมันอยู่ (แต่ในสมัยนั้นคนทั่วไปทำเกมได้นี่ถือว่าอลังการแล้วนะ O_O)<br />
<br />
ในเวลาต่อมา ก็ได้ถือกำเนิด RPG Maker XP ขึ้นมา ซึ่งเป็นการปฏิรูปวงการ RPG Maker เลยก็ว่าได้ เพราะว่ามีคุณสมบัติใหม่ที่เพิ่มเติมเข้ามา นั่นคือระบบ script editor โดยใช้ภาษา Ruby เป็นแกนหลัก ทำให้เกม RPG ที่สร้างจาก RPG Maker XP นั้นมีความยืดหยุ่นหลากหลายมาก ไม่ซ้ำซากจำเจ แต่ความยืดหยุ่นย่อมแลกมาด้วยความซับซ้อนของระบบมากยิ่งขึ้น เพราะทันทีที่กด F11 เปิด script editor ขึ้นมา ก็พบกับความงุนงง ว่าแล้วก็อย่าไปแตะต้องมันเลย เดี๋ยวเกมพัง บรึ๋ยยยยยย~~<br />
<br />
คำว่า "ใครๆ ก็สามารถสร้างเกม RPG ขึ้นมาได้" นั้น ยังคงใช้ได้อยู่ใน RPG Maker XP แต่ "คนที่เขียน script เป็น" นั้นจะมีผลงานออกมาแตกต่าง เป็นเอกลักษณ์ และเหนือชั้น...<br />
<br />
แน่นอนว่าผมเองก็เป็นคนหนึ่งที่กลัวหน้าจอ script editor มาก่อนเหมือนกัน ผมได้ฝึกมาระยะหนึ่ง และในวันนี้ ความกลัวได้หมดลงแล้ว เป็นความสนุก และความสุขที่ได้เขียน ซึ่งแน่นอนว่า เป้าหมายของผมก็จะทำให้ความกลัวของทุกๆ คนหมดไป และมีความสุขกับมันเช่นกัน <br />
<br />
เชื่อผมเถอะครับ การฝึกเขียน script มันไม่ได้มีประโยชน์เฉพาะใน RPG Maker เท่านั้น หากคุณมีความฝันที่จะเขียนเกมจริงๆ จังๆ ในอนาคตแล้ว มันเป็นโอกาสที่ดีมาก และสร้างมูลค่ากับตนเองขึ้นไปอีกระดับหนึ่งทีเดียวครับ <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
เกมที่สมบูรณ์แบบ ย่อมไม่พ้นการเขียนโปรแกรม เรียนเถอะครับ มีแต่กำไรกับกำไร ^^<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">จำเป็นต้องเป็นโปรแกรมเมอร์มาก่อนหรือไม่</span></span><br />
ขอตอบว่าไม่จำเป็นครับ ทุกคนเริ่มฝึกฝน ณ จุดนี้ได้ ในบทความนี้จะพยายามสอนพื้นฐานที่จำเป็นในการนำไปเขียน script ครับ ดังนั้นไม่ต้องกังวลว่าท่านไม่เคยเขียนโปรแกรมมาก่อน<br />
<br />
แต่ก็ต้องเรียนกันตรงๆ ว่า คนที่เคยเขียนโปรแกรมมาก่อน หรือเรียนด้านนี้โดยเฉพาะ จะได้เปรียบกว่าคนที่ไม่เคยเขียนอย่างมากครับ เพราะมีประสบการณ์ความรู้ด้านตรรกะ และกระบวนการแก้ปัญหามาแล้วนั่นเอง ซึ่งคนที่ไม่เคยเขียนโปรแกรมมาก่อนอาจต้องฝึกฝนในจุดนี้เพิ่มเติมด้วยครับ แต่สิ่งเหล่านี้มันเป็นเรื่องที่ต้องใช้เวลาครับ ดังนั้นไม่ต้องไปซีเรียสมาก<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">ภาษา Ruby คืออะไร และ RGSS คืออะไร</span></span><br />
ภาษา Ruby เป็นภาษาคอมพิวเตอร์ภาษาหนึ่ง สร้างขึ้นโดยคนญี่ปุ่น (<a href="https://en.wikipedia.org/wiki/Ruby_(programming_language)" target="_blank" rel="noopener" class="mycode_url">รายละเอียดเพิ่มเติม</a>) ซึ่งเป็นภาษาที่มีความสละสลวย อ่านง่าย ผู้พัฒนาตั้งใจให้ทุกคนที่เขียนภาษา Ruby มีความสุข ดังนั้น หากเขียนภาษานี้เป็นแล้ว ท่านจะสนุกกับมันสุดๆ เลยล่ะ ~ ความยากในการเรียนรู้นั้น เทียบกับภาษาอื่นๆ แล้ว ขอบอกว่า ค่อนข้างยากกว่าภาษาอื่นๆ แต่ไม่ต้องห่วง เราจะค่อยๆ ไปพร้อมๆ กันครับ<br />
<br />
ส่วน RGSS นั้น ย่อมาจาก Ruby Game Scripting System แปลตรงตัวก็คือ ระบบเขียนเกมด้วย script โดยใช้ภาษา Ruby ซึ่ง RPG Maker เป็นผู้สถาปนาระบบ RGSS ขึ้นมา ซึ่งเจ้า RGSS นั้นเปรียบได้เหมือนโครงสร้างของระบบเกมของ RPG Maker ที่เขียนขึ้นด้วยภาษา Ruby ใช้เป็นตัวกลางควบคุมทุกสิ่งอย่าง ไม่ว่าจะเป็นตัวละคร ไอเท็ม มอนสเตอร์ ฉากต่างๆ การดำเนินเรื่อง เหตุการณ์ ฯลฯ ซึ่งวาดแผนผังออกมาน่าจะมีกระบวนการดังนี้<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">เขียน RGSS เวอร์ชันไหนดี</span></span><br />
คิดว่าทุกๆ ท่านในที่นี้ (และหลายๆ คนบนโลกนี้) น่าจะแบ่งการใช้งาน RPG Maker เป็น 2 ฝั่ง ใหญ่ๆ นั่นคือ RPG Maker XP และ RPG Maker VX Ace (ที่เป็นตัวพัฒนาจาก VX) เพราะมีเอกลักษณ์แตกต่างกันพอสมควร มีข้อดีข้อเสีย จุดเด่น จุดด้อย แตกต่างกันไป ทั้งนี้ขึ้นกับความชอบของแต่ละคน<br />
<br />
แต่ถ้าหากพูดในแง่การเขียน script แล้ว ใน RPG Maker XP นั้นใช้ RGSS เวอร์ชั่น 1 และ RPG Maker VX Ace นั้นใช้ RGSS เวอร์ชัน 3<br />
<br />
ซึ่งจากประสบการณ์ที่ผมได้เรียนรู้ทั้งสองเวอร์ชั่นนั้น RGSS 3 นั้นได้ปรับปรุงพัฒนาไปตามยุคสมัย ซึ่งดีกว่า RGSS 1 ในทุกๆ ด้าน ทั้งมีรูปแบบโครงสร้างที่อ่านเข้าใจง่ายกว่า มีการจัดว่างแบ่งไฟล์ได้เหมาะสมและเป็นหมวดหมู่กว่า แนวคิดและวิธีการเขียนโปรแกรมนั้นเป็นระบบกว่ามากๆ และที่สำคัญที่สุดคือ ใช้ Ruby เวอร์ชันใหม่กว่าซึ่งมีประสิทธิภาพสูงกว่าพอสมควร (เวอร์ชันห่างกันเกือบ 10 ปีนะเธอว์)<br />
<br />
ดังนั้น ในแง่การเขียน script ถ้าให้ผมแนะนำ ผมขอแนะนำให้ท่านเริ่มเขียน RGSS 3 บน RPG Maker VX Ace ไปเลยดีกว่าครับ ได้ผลดีกว่าในระยะยาว แต่ถ้าท่านไม่ชอบเจ้า Ace จริงๆ หรือว่าไม่มีโปรแกรม หรือว่ายึดติด XP ไปแล้ว ก็ไม่มีปัญหาครับ เพราะบทความซีรีส์นี้ของผมนั้นสอนเขียน Ruby เป็นหลักครับ ไม่ได้สอนเขียน RGSS<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size">การทำงานของ RGSS</span></span><br />
เคยสังเกตไหมครับ ว่า โฟลเดอร์ชื่อว่า Data ที่อยู่ในโปรเจกต์ มันคืออะไร... (โปรเจกต์ที่ยังไม่ Encrypt นะครับ)<br />
<br />
มันคือไฟล์ข้อมูลที่ใช้อ่านตอนอยู่ในเกมนั่นเอง ซึ่งเมื่อเราใช้ RPG Maker แล้วกด Ctrl+S ปุ๊บ ไฟล์เหล่านั้นก็จะทำการอัพเดตใหม่ตามข้อมูลที่เราแก้ในเกมทั้งหมด ซึ่งถ้าลองดูเผินๆ แล้ว มันจะมีไฟล์ที่น่าจะอยู่ใน database (F9) ของเกม ส่วนแผนที่และเหตุการณ์ (event) ทั้งหลายที่เรายัดๆ แก้ๆ นั้น จะถูกเก็บอยู่ในไฟล์ MapXXX.r-data- (r-data- คือ rxdata หรือ rvdata2 ขึ้นกับเวอร์ชัน) ดังนั้น ไม่ว่าเราจะแก้ไขแผนที่ อีเวนต์ หรือฐานข้อมูลเกม ข้อมูลทุกอย่างล้วนยัดอยู่ในโฟลเดอร์ Data<br />
<br />
ซึ่งเมื่อเรากดรันเกมปุ๊บ ระบบก็จะทำการดึงข้อมูลต่างๆ ที่อยู่ในโฟลเดอร์ดังกล่าว ไปประมวลผลเป็นเกมที่เราเห็นนั่นเอง ซึ่งการดึงข้อมูลนั้น เป็นหน้าที่ของไฟล์ที่ชื่อว่า Scripts.r-data- ซึ่งเป็นไฟล์ เก็บ script ในหน้าจอ script editor (F11)<br />
<br />
กล่าวคือ script เป็นตัวที่ทำให้ข้อมูลทั้งหมดในเกมเกิดขึ้นมา ซึ่งขับเคลื่อนโดย RGSS นั่นเอง<br />
หลักการของการรันก็คือ<br />
<br />
เมื่อกดรันเกม -&gt; เกมไปอ่านไฟล์ Scripts.r-data- (RGSS) -&gt; RGSS ทำการควบคุม จัดการเกมโดยอ่านข้อมูลไฟล์อื่นๆ ในโฟลเดอร์ Data และนำมาแสดงผล -&gt; ออกมาเป็นเกมที่เห็น<br />
<br />
ทีนี้ผมอยากให้ท่านลองเปิดโปรแกรมแล้วกด F11 เพื่อแสดงหน้าจอ script editor ขึ้นมาครับ ให้สังเกตฝั่งซ้ายที่เป็นรายการ script ต่างๆ ในการอ่านไฟล์ Scripts.r-data- นั้น มันจะไล่อ่านโค้ดทั้งหมดเรียงจากบนลงล่างในทุกๆ ไฟล์เลยครับ ดังนั้นถ้าผมเพิ่มไฟล์ลงไป มันก็จะอ่านไฟล์ที่ผมเพิ่มด้วย ซึ่งเดี๋ยวเราจะมาเพิ่มไฟล์เพื่อฝึกเขียนภาษา Ruby กันครับ แต่ก่อนจะมาเริ่มเขียนนั้น ผมขอให้ทุกท่านอ่านหัวข้อถัดไปก่อน<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">หน้าจอ Console นั้นขาดไม่ได้!</span></span><br />
ถ้าท่านใช้ RPG Maker VX Ace ให้ลองไปที่ Game -&gt; Show Console<br />
<img src="http://upic.me/i/89/66untitled.png" loading="lazy"  alt="[Image: 66untitled.png]" class="mycode_img" /><br />
<br />
แล้วลองกดรันเกมดู พบว่าจะมีจอดำๆ ประหลาดๆ โผล่มา เราเรียกมันว่าหน้าจอ console<br />
<br />
<img src="http://upic.me/i/qc/6capture.jpg" loading="lazy"  alt="[Image: 6capture.jpg]" class="mycode_img" /><br />
<br />
จอนี้ใช้ทำการ log ข้อมูลออกมาดู ซึ่งสำคัญมากกกกก หากท่านเขียนสคริปต์ที่ซับซ้อนในภายหลัง แล้วต้องการให้มันแสดงสถานะอะไรบางอย่างออกมา การมีจอนี้ทำให้การ Debug โค้ดนั้นง่ายกว่าเดิมสุดๆ ไม่ว่าจะเป็นการโม script หรือเขียน script ขึ้นใหม่ จอ console จะทำให้การเขียน script ของคุณจะราบรื่นขึ้นมาก เราจะใช้จอ console นี้ตลอดทุกบทความ รวมถึงกระทู้พวก Workshop ต่างๆ ที่อาจมีขึ้นในอนาคตด้วย<br />
<br />
สำหรับผู้ที่ใช้ RPG Maker XP, RPG Maker VX เราขอแสดงความเสียใจที่โปรแกรมนั้นไม่มีจอ console แต่โชคดีสุดๆ ที่ในเว็บบอร์ดนอกนั้นมีผู้ใจดีเขียนระบบจอ console ผ่าน script ให้ ซึ่ง<a href="http://forums.rpgmakerweb.com/index.php?/topic/15747-xp-and-vx-console-output/" target="_blank" rel="noopener" class="mycode_url">ดาวน์โหลดได้ที่นี่เลยครับ</a> เมื่อดาวน์โหลดมาแล้ว ให้นำไปวางไว้เหนือไฟล์ Main ในหน้าจอ script editor โดยคลิกขวาที่ Main แล้วเลือก Insert จะมีช่องเปล่าขึ้นมา ให้ตั้งชื่อว่า Console แล้วด้านขวาใส่โค้ดในเว็บนั้นลงไป ตามภาพ<br />
<br />
<img src="http://upic.me/i/58/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<br />
ทีนี้ก็จะมีจอ console เหมือนกันแล้ว ^^<br />
<img src="http://upic.me/i/w2/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">อุ่นเครื่องกับการเริ่มเขียน Ruby Script อย่างง่าย</span></span><br />
เอาล่ะครับ กด F11 เปิด script editor แล้วทีนี้ให้ลองสร้างไฟล์ใหม่ขึ้นมา โดยใน RPG Maker VX Ace ให้ไปที่ส่วนของ Material ในฝั่งซ้าย คลิกขวาคำว่า ( Insert here ) เลือก Insert มันจะมีช่องว่างโผล่มา ให้ตั้งชื่อว่า Hello World (จริงๆ ตั้งอะไรก็ได้)<br />
<br />
<img src="http://upic.me/i/ls/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
ส่วน RPG Maker XP ให้คลิกขวาที่ Main แล้วเลือก Insert จะมีช่องเปล่าขึ้นมา ให้ตั้งชื่อว่า Hello World เหมือนกัน<br />
<br />
<img src="http://upic.me/i/uq/9capture.jpg" loading="lazy"  alt="[Image: 9capture.jpg]" class="mycode_img" /><br />
<br />
หลังจากที่สร้างไฟล์เสร็จแล้ว ทีนี้ให้เลือกไฟล์ Hello World ของเรา ในหน้าจอฝั่งขวาจะว่างเปล่า เพราะยังไม่ได้เขียนอะไร ให้ลองเขียนโค้ดลงไปดังนี้<br />
<br />
[shcode=rails]<br />
puts "Hello World!"<br />
puts "Welcome to RPG Maker Script!"<br />
<br />
name = "Splendith"<br />
age = 23<br />
color = "blue"<br />
<br />
puts ""<br />
puts "My name is #{name}."<br />
puts "I am #{age} years old."<br />
puts "My favorite color is #{color}."<br />
[/shcode]<br />
<br />
จากนั้นลองกดรันเกมดู<br />
<br />
แต่นแต๊น... หน้าจอเกมยังเหมือนเดิมไม่มีอะไรเปลี่ยน<br />
แต่ให้ลองสังเกตจอ console ของเรา<br />
<br />
มันมีข้อความขึ้นมาใช่ไหมเอ่ย~<br />
<br />
<img src="http://upic.me/i/hj/6capture.jpg" loading="lazy"  alt="[Image: 6capture.jpg]" class="mycode_img" /><br />
<br />
นี่แหละครับ ประโยชน์ของหน้าจอ console ครับ ซึ่งในบทเรียนภาษา Ruby ที่ผมจะสอนนั้น เราจะไม่ไปยุ่งเกี่ยวกับเกมเลยครับ กด Run ให้เกมขึ้น ปล่อยมันไป แล้วเราสนใจกันแต่จอดำ 555+<br />
<br />
ทีนี้เมื่อเห็นผลลัพธ์ที่ออกมาแล้ว อยากให้ลองสังเกตดูครับว่าโค้ดที่เขียนไปนั้นทำงานอย่างไร จึงจะได้ผลลัพธ์ดังกล่าว ซึ่งไม่ยากใช่ไหมครับ<br />
<br />
คำสั่ง puts เป็นคำสั่งใช้ในการแสดงข้อความออกทางหน้าจอ console โดยการพิมพ์ข้อความจำเป็นต้องมรเครื่องหมายฟันหนู (") คร่อม  ซึ่งคำสั่งนี้จะทำการขึ้นบรรทัดใหม่ให้ด้วย<br />
<br />
ในบรรทัดที่ 4-6 เรากำหนด name ให้มีค่า "Splendith" กำหนด age ให้มีค่า 23 และกำหนด color ให้มีค่า "blue" ซึ่งเจ้า name, age, color ในทางการเขียนโปรแกรมเราจะเรียกมันว่า "ตัวแปร" ซึ่งใช้ในการกำหนดค่าไปใช้ในอนาคตได้ครับ และสังเกตว่าถ้าใส่ข้อความ ต้องมีฟันหนู (") คร่อม เช่นเดิม แต่ข้อมูลตัวเลข (23) นั้นไม่จำเป็นต้องมี<br />
บรรทัดที่ 8 ทำการ puts ข้อความเปล่า นั่นก็คือต้องการเว้นช่อง 1 บรรทัดในหน้าจอแสดงผล<br />
ส่วนบรรทัดที่ 9-11 เราได้ทำการแทนค่าในตัวแปรลงไปในข้อความ ด้วยการเขียน #{  } คร่อมตัวแปรของเรา ลงในข้อความ ค่าของตัวแปรก็จะถูกนำไปแสดงในข้อความนั่นเอง<br />
<br />
ทีนี้ลองเปลี่ยนข้อมูลในตัวแปรเป็นชื่อ อายุ และสีที่ชอบเป็นข้อมูลตัวท่านดู แล้วลองรันใหม่ สังเกตผลลัพธ์<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">สรุป</span></span><br />
เป็นยังไงกันบ้างครับ พอจะเข้าใจกระบวนการทำงานของ RGSS และรู้สึกสนุกและตื่นเต้นกับการเขียน script หรือเปล่าครับ หากเริ่มสนุกกับมันแล้วล่ะก็ บทความต่อไปเราจะมาเข้มข้น เน้นการเขียน Ruby แบบจะๆ กันครับ ส่วนบทความนี้อาจจะมีการบรรยายมากไปหน่อย ถ้าเบื่อหรือง่วงก็ขออภัยครับ<br />
<br />
บทความนี้สรุปไม่ยาวมาก ยังไงก็ขอให้มีความสุขกับการเขียน script นะครับ ^^]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[พื้นฐานการโม Script เบื้องต้น]]></title>
			<link>https://irpg.in.th/thread-2441.html</link>
			<pubDate>Fri, 12 Jun 2015 01:27:12 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2730">splendith</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2441.html</guid>
			<description><![CDATA[<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">พื้นฐานการโม Script เบื้องต้น</span></span><br />
<br />
บทความนี้เป็นบทความเบื้องต้น อย่างไรก็ตาม เนื้อหามีความยาวถึงยาวที่สุด เหมาะสำหรับผู้ที่ต้องการเขียน script อย่างจริงจังในอนาคต <br />
<br />
บทความนี้ตั้งใจเขียนมาก พยายามอธิบายให้ง่ายที่สุด อย่างไรก็ตาม หากไม่เข้าใจ มีข้อสงสัยหรือข้อเสนอแนะ โปรดคอมเมนต์ด้วยนะครับ หรือถ้าไม่รู้เรื่องตรงไหนบอกได้เลยครับ หรือหากมีข้อผิดพลาด แจ้งได้เลยนะครับ<br />
<br />
แม้ในบทความนี้จะใช้ RGSS3 เป็นหลัก แต่หลักการสอนในบทความนี้สามารถนำไปประยุกต์ใช้ได้ทุกเวอร์ชันครับ หรือแม้แต่นำหลักการไปใช้ทำอย่างอื่นนอกจากใช้ใน RPG Maker ก็ได้ครับ<br />
<br />
<hr class="mycode_hr" />
<br />
เคยไหม บางทีอยากได้ระบบตามที่ต้องการ ในบางกรณีการแก้ด้วย event หรือ database นั้นยังมีขีดจำกัดอยู่ จึงไม่สามารถเปลี่ยนแปลงได้ดั่งใจ ทำให้ต้องหวังพึ่งการใช้ script ในการทำระบบที่ต้องการ ซึ่งหลายๆ คนเมื่อเปิดหน้าจอ script editor ดูก็รู้สึกเอียน มึนหัว ตาลาย ไม่อยากไปแตะต้องเลย...<br />
<br />
ถ้าโชคดี เจอ script ที่มีคนเขียนมาก่อน ก็โหลดมาลงแล้วใช้งานได้เลย แต่ถ้าเราต้องการ script ที่มันเฉพาะเจาะจงจริงๆ ทักษะการโม script ก็ทำให้เราได้เปรียบไม่ใช่น้อย<br />
<br />
จริงๆ แล้วก่อนที่จะทำการโม script นั้น แนะนำให้ศึกษาพื้นฐานการเขียน Ruby script ก่อน เพราะจะทำให้เราเข้าใจ script ได้อย่างรวดเร็วมากขึ้น แต่อย่างไรก็ตาม ในบทความนี้จะพยายามยกตัวอย่างที่ทุกท่านเข้าใจได้ไม่ยาก<br />
<br />
ซึ่งบทเรียนจะมีดังนี้ครับ จะมาราธอนสอนตั้งแต่ต้นจนจบในกระทู้นี้เลยครับ<ul class="mycode_list"><li>เข้าใจส่วนต่างๆ ในหน้าจอ script ของ RGSS3<br />
</li>
<li>RPG Maker VX Ace Database Module<br />
</li>
<li>แนวคิดในการโม script<br />
</li>
<li>เข้าใจการ alias method และ overwrite script สิ่งสำคัญก่อนจะเป็นนักเขียน script ตัวยง!<br />
</li>
<li>แบบฝึกหัด<br />
</li>
</ul>
ทำความเข้าใจก่อนว่าอ่านบทความนี้จบ ท่านจะได้แนวคิดและหลักในการโมโค้ด แต่ไม่ถึงกับทำ script แจกเป็นเรื่องเป็นราวได้ อย่างไรก็ตาม บทความนี้เป็นการปูพื้นฐานที่ดีในการยืนอยู่จุดนั้นครับ ^^<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">เข้าใจส่วนต่างๆ ในหน้าจอ script ของ RGSS3</span></span><br />
สิ่งสำคัญที่ต้องรู้เป็นอันดับแรกเลยนั่นคือ ต้องรู้ว่าส่วนต่างๆ ของ script ในหน้า script editor นั้นมีหน้าที่อะไรบ้าง เพื่อจะนำไปสู่การคาดเดาเพื่อโม script ในอนาคต<br />
<br />
ใน RGSS3 นั้น ทีมพัฒนาได้เขียนโค้ดอ่านเข้าใจง่าย และเป็นระเบียบมากๆ มีการพัฒนาจากรุ่นก่อนๆ อย่างเห็นได้ชัด ให้ท่านลองปุ่ม F11 ดู จะมีหน้าจอ script editor ปรากฎขึ้นมา มองไปทางซ้าย สังเกตว่ามันจะแบ่งเป็นส่วนๆ ชัดเจน ให้ลองดูตามไปเลยนะครับ<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. ส่วนของ Modules</span></span><br />
ส่วนนี้จะอยู่ด้านบนซ้ายสุดของหน้าจอ แบ่งเป็นสองส่วนย่อย<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1.1 ส่วนของการจัดการข้อมูลที่ใช้ในเกม</span><ul class="mycode_list"><li>Vocab: เก็บข้อความในเกมแทบทั้งหมด ซึ่งมีทั้งข้อความที่แก้ใน script และข้อความที่ดึงมาจาก database ในหน้า Terms<br />
</li>
<li>Sound: เสียงประกอบต่างๆ ที่ดังข้อมูลมาจาก database ที่เราตั้งไว้ในหน้า System<br />
</li>
<li>Cache: การดึงข้อมูลที่อ่านไปใส่ลงหน่วยความจำหลัก เพื่อทำให้เกมทำงานเร็วขึ้น (เรื่องมันยาว หากอยากเข้าใจส่วนนี้จริงๆ หลังไมค์ได้ครับ)<br />
</li>
</ul>
<span style="font-weight: bold;" class="mycode_b">1.2 ส่วนของการควบคุมโดยรวมของเกม</span><br />
ส่วนนี้จะส่วนที่คอยควบคุมข้อมูลต่างๆ ในเกมครับ เทียบได้กับ "ผู้จัดการ" ที่สั่งพนักงานทำงานต่างๆ นั่นเอง<ul class="mycode_list"><li>DataManager: ในส่วนนี้จะควบคุมการใช้งานข้อมูลในเกมเป็นหลัก เช่น ข้อมูลเซฟ ข้อมูลจาก database ข้อมูลระหว่างการเล่นเกมอยู่ เป็นต้น<br />
</li>
<li>SceneManager: ใช้ควบคุมการเข้าถึงฉากต่างๆ ของเกม เช่น เมื่อกดเข้าเมนู SceneManager ก็จะมีหน้าสั่งให้เปลี่ยนจาก หน้าจอเกม (Scene_Map) เป็นหน้าจอเมนู (Scene_Menu) เป็นต้น<br />
</li>
<li>BattleManager: ส่วนควบคุมในกระบวนการต่อสู้แทบทั้งหมดตั้งแต่เริ่มเข้าฉากยันจบการต่อสู้ได้ exp ได้ของ<br />
</li>
</ul>
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. ส่วนของ Game Objects</span></span><br />
ในส่วนนี้จะเป็นส่วนของการเก็บข้อมูลต่างๆ ในเกมในขณะที่เล่นอยู่ เช่น ข้อมูลปาร์ตี้ ข้อมูลศัตรู หรืออื่นๆ โดยข้อมูลจะเป็นข้อมูลที่ถูกสร้างระหว่างที่อยู่ในเกม ไม่เกี่ยวข้องกับข้อมูลในฐานข้อมูลแต่อย่างใด เช่น เมื่อเดินเจอศัตรูปุ๊บ ข้อมูลศัตรูที่เจอก็จะถูกสร้าง แล้วก็มีข้อมูล hp, mp, atk, เป็นต้น ซึ่งสังเกตว่าข้อมูลบางอย่างจะมีการเปลี่ยนแปลงได้ตลอดเวลา เช่น เราโจมตี มอนสเตอร์ hp ลด เป็นต้น ในส่วนนี้แบ่งออกเป็นไฟล์ต่างๆ มากมาย และจะขึ้นต้นด้วย Game_ เพื่อแบ่งแยกประเภทชัดเจน<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. ส่วนของ Sprites</span></span><br />
ในส่วนนี้จะเป็นส่วนของการจัดการสิ่งของในเกมที่เกี่ยวกับภาพทั้งหมด ไม่ว่าจะเป็นท่าเดินของตัวละคร ภาพตัวละคร ภาพศัตรู รูปภาพ ฉากต่างๆ หรือเอฟเฟกต์ต่อสู้ เป็นต้น<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. ส่วนของ Windows</span></span><br />
ในส่วนนี้จะเป็นส่วนของหน้าต่างที่ใช้สื่อสารกับผูเล่นทั้งหมดในเกม ไม่ว่าจะเป็น กล่องข้อความ หน้าต่างตัวเลือก หรือหน้าต่างแสดงรายการเมนู หน้าหน้าต่างแสดงรายละเอียดผู้เล่น หน้าต่างแสดงข้อมูลเครื่องสวมใส่ เป็นต้น พูดง่ายๆ อะไรที่เป็นกล่องๆ มีเส้นขอบขาวๆ พื้นหลังสีน้ำเงิน (ในกรณีที่ไม่ได้ปรับแต่งอะไรเพิ่มเติม) มีข้อความข้างใน จะอยู่ในส่วนของ Windows หมด<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. ส่วนของ Scenes</span></span><br />
ในส่วนนี้จะเป็นส่วนของการเก็บฉากต่างๆ ในเกม ไม่ว่าจะเป็นฉาก Title, ฉาก Map (ฉากขณะเล่นเกม), ฉากเมนู, ฉากต่อสู้, ฉาก Game Over เป็นต้น <br />
<br />
อย่าสับสนกับส่วนของ Windows นะ หลายคนงงว่าทำไมส่วนของ Windows ก็มี Menu ส่วนของ Scene ก็มี Menu ในที่นี้ส่วนของ Scene จะหมายถึงการเข้าฉากที่เป็นเมนูเกม ซึ่งในเมนูเกมนั้นจะประกอบไปด้วย หน้าต่างเลือกเมนู หน้าต่างแสดงข้อมูลปาร์ตี้ หน้าต่าง หน้าต่างแสดงจำนวนเงิน ซึ่งหน้าต่างทั้งหลายเหล่านี้จะอยู่ใน ฉากของ Menu อีกทีนั่นเอง<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">RPG Maker VX Ace Database Module</span></span><br />
นอกจากส่วนที่อยู่ในหน้าจอ script editor แล้ว ยังมีข้อมูลอีกส่วนหนึ่งที่สามารถเรียกใช้ได้เช่นกัน แต่ไม่มีบอกในหน้าจอดังกล่าว นั่นคือ RPG Module ซึ่งเป็นโมดูลที่เก็บข้อมูล Database เกมทั้งหมด และส่วนใหญ่จะดึงข้อมูลจาก database editor (F9) เมื่อนำไปใช้ในเกม ในส่วนนี้จะเป็นค่าที่เรียกใช้ข้อมูลอย่างเดียว ไม่สามารถเปลี่ยนแปลงแก้ไขขณะอยู่ในเกมได้เลย<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">แนวคิดในการโม script</span></span><br />
เอาล่ะ เมื่อรู้ข้อมูลเบื้องต้นแล้ว ในตอนนี้เราจะสามารถคาดเดาได้บ้างแล้ว ว่าอยากแก้แบบนี้ ควรจะไปแก้ที่ไหน ทุกส่วนที่กล่าวมาล้วนมีความจำเป็นในการโม script ทั้งสิ้น แนวคิดหลักๆ เลยคือ<br />
<ol type="1" class="mycode_list"><li>คาดเดาก่อนเลยว่าการแก้ปัญหาของเรานั้นเข้าเค้าในส่วนไหนของ script ในฝั่งซ้ายของ script editor ชื่อไฟล์แต่ละ script จะบ่งบอกถึงการทำงานในส่วนนั้น<br />
</li>
<li>เมือเลือก script ฝั่งซ้ายได้แล้วลองคาดเดาว่าโค้ดส่วนไหนทำงานอะไร ลองค้นหาสิ่งที่เกี่ยวข้อง หากโค้ดมีหลายบรรทัด ให้ลองกด Ctrl+F หาข้อความ<br />
</li>
<li>อ่านคอมเมนต์ และคำสั่งของโค้ดให้ดี ทุกอย่างล้วนมีความหมายแฝง<br />
</li>
<li>หากไม่เจอ ให้ลองเปลี่ยนคำค้น หรือเปลี่ยน script ฝั่งซ้ายดู เราอาจเลือกผิดก็เป็นได้<br />
</li>
<li>หากเข้าตาจน หรือแก้ไม่ได้ Google และเว็บบอร์ดต่างประเทศช่วยท่านได้<br />
</li>
</ol>
เรามาลองทายโจทย์ง่ายๆ กันก่อน ^^<br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม</span> อยากแก้ข้อความ Buy, Sell, Cancel ใน shop ทำอย่างไร<br />
<img src="http://upic.me/i/hn/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<span style="font-weight: bold;" class="mycode_b">วิธีการคาดเดา</span> เรารู้ว่าใน Module Vocab นั้นใช้เก็บข้อความในเกมแทบทั้งหมด ฉะนั้นรออยู่ไย ลองเข้าไปหากันเลย แล้วลองสำรวจว่าบรรทัดไหนที่มีข้อความทำนองนั้น ให้แก้โดยพลัน ~<br />
<img src="http://upic.me/i/ij/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม</span> อยากลบเมนูเซฟเกมในหน้าจอเมนูออกไปเลย ให้ไม่แสดงในหน้าจอเมนู<br />
<img src="http://upic.me/i/gv/6capture.jpg" loading="lazy"  alt="[Image: 6capture.jpg]" class="mycode_img" /><br />
<span style="font-weight: bold;" class="mycode_b">วิธีการคาดเดา</span> ก็ต้องดูก่อนว่าคำสั่งเซฟเกมควรจะอยู่ในส่วนไหนของ script ซึ่งแน่นอนว่ามันอยู่ใน window object อะไรสักอย่างแน่ๆ (เพราะมีลักษณะเป็นกล่องๆ) เมื่อไล่ดูแล้วก็จะพอเดาได้ว่าอยู่ใน Window_MenuCommand ต่อมาลองพิจารณาประมาณบรรทัดที่ 40 ซึ่งเขียนว่า add_save_command โอ้โห! โป๊ะเชะ น่าจะอันนี้แหละ แต่จะลบทิ้งก็ยังไงอยู่ แนะนำให้ลองใส่ # ด้านหน้าบรรทัดดังกล่าวเพื่อ comment แทนการลบ จากนั้นลองรันเกมแล้วเปิดเมนูดู ถ้าเมนูเซฟหายไป แปลว่า ท่านเดาถูกแล้วล่ะ <img src="https://irpg.in.th/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" /><br />
<img src="http://upic.me/i/j5/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม</span> เรือ (boat) ในเกมวิ่งช้าจุงเบย อยากให้มันเร็วกว่านี้<br />
<span style="font-weight: bold;" class="mycode_b">วิธีการคาดเดา</span> ในข้อนี้เป็นการแก้ข้อมูลของตัวเกม ดังนั้นมีความเป็นไปได้สูงสุดที่จะอยู่ในส่วนของ Game Objects เราก็ลองไล่ๆ ดู อ๊ะ อันนี้น่าจะเข้าเค้าสุดละ Game_Vehicles นั่นเอง เข้าไปแล้วลองไล่ๆโค้ดดูอย่างใจเย็นๆ บรรทัดประมาณ 34 จะเห็นโค้ด @move_speed = 4 if @type == :boat อ่านแล้วค่อนข้างเข้าใจง่ายมากๆ ว่าแล้วก็ลองแก้จาก 4 เป็น 10 แล้วลองวางเรือ เข้าเกมไปลองขึ้นเรือดู ว้าว เห็นผล วิ่งเร็วยังกับจรวด!!!<br />
<img src="http://upic.me/i/rt/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
ในช่วงแรกๆ อาจจะยังเดาได้ไม่คล่อง หรือรู้สึกยาก อย่าท้อครับ ให้พยายามไปเรื่อยๆ เราจะเริ่มจับทางได้เอง ยิ่งใครเคยเขียนโปรแกรมมาก่อน ยิ่งได้เปรียบเลยครับ<br />
 <br />
จากโจทย์ด้านบน สังเกตว่าเราแก้ปัญหาโดยไปเปลี่ยนโค้ดในส่วนต่างๆ ที่ต้องการ ซึ่งในการใช้จริงในอนาคต <span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">การแก้แบบด้านบนเป็นตัวอย่างที่ไม่ดี และไม่แนะนำเป็นอย่างยิ่ง</span></span> เหตุผลและวิธีการแก้ปัญหาอยู่ในหัวข้อถัดไปเลยจ้า<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">เข้าใจการ alias method และ overwrite method สิ่งสำคัญที่หลายคนมองข้าม!</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #FF0000;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">ขอบอกล่วงหน้าว่าหัวข้อนี้ค่อนข้างยาวและซับซ้อน ค่อยๆ อ่านใจเย็นๆ นะครับ มันสำคัญมากๆๆๆ สำหรับผู้ที่ต้องการเขียน script อย่างจริงจังในอนาคต หากเข้าใจทั้งหมด มันคือกำไรชีวิตแน่นอนครับผมการันตี</span></span></span><br />
<br />
ในหัวข้อก่อนหน้าเรามีคำแนะนำทิ้งท้ายว่าวิธีการแก้โค้ดในส่วนต่างๆ นั้น ไม่แนะนำอย่างยิ่ง สิ่งที่ผมต้องการจะสื่อจริงๆ นั่นคือ <span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">ไม่ควรเพิ่ม / ลบ / แก้ไข โค้ดต้นฉบับที่มีอยู่แล้วนั่นเอง</span></span> (ยกเว้น module Vocab ที่พออนุโลมได้) เพราะมันมีผลกระทบดังนี้<br />
<ol type="1" class="mycode_list"><li>สมมุติท่านแก้ส่วนต่างๆ ของสคริปต์เยอะมากกกกกกกกกกกกกก วันดีคืนดีอยู่ดีๆ เกมพัง รันแล้วแฮงก์ หาสาเหตุไม่ได้ ไม่รู้จะไปแก้ที่ไหน จะเอาโค้ดต้นฉบับมาทับโค้ดที่แก้ไปแล้วก็ไม่ได้ เพราะสิ่งที่เคยแก้ไว้ก็หาย ในวันนั้นเกมของท่านอาจได้ลงสุสานทันที<br />
</li>
<li>สมมุติท่านสร้างเกมหลายๆ เกม แล้วต้องการเอาระบบที่ท่านแก้บางส่วนไปใช้ในเกมอื่นๆ ของท่าน ท่านก็จะไม่รู้ว่าต้องเอาจาก script ไหนบ้าง<br />
</li>
<li>อนาคตหาก RPG Maker มีการอัพเดทแพทช์ (หวังว่านะ 555+) มีแก้สคริปต์ต่างๆ บางแห่ง ในวันนั้นท่านจะต้องเอา script ของเวอร์ชั่นใหม่มาทับของเก่า แต่ของเก่าท่านปรับแต่งแก้ไขไว้เยอะแยะ ดังนั้นจึงยากที่จะจัดการสิ่งที่ท่านได้แก้ไว้<br />
</li>
</ol>
อ้าว แล้วไม่แก้ที่โค้ดที่มี แล้วจะไปแก้ที่ไหน? คำถามนี้ต้องผุดในหัวของท่านแน่นอน<br />
ซึ่งคำตอบมีอยู่สองหนทางก็คือ <ul class="mycode_list"><li>การ overwrite script<br />
</li>
<li>การ overwrite script ด้วยวิธีการ alias method<br />
</li>
</ul>
ก่อนที่จะรู้จักทั้งสองอย่างด้านบน ต้องเข้าใจว่า class และ method คืออะไรเสียก่อน ซึ่งจะอธิบายให้เข้าใจคร่าวๆ เน้นเอาไปใช้งาน เพราะจริงๆ แล้วมันเป็นเรื่องที่ค่อนข้างซับซ้อนและเปิดคอร์สเรียนได้เป็นเทอมๆ เลย *0* [คนที่เขียนโปรแกรมเป็นอ่านแล้วอย่าเพิ่งหงุดหงิดนะครับ ผมเน้นอธิบายให้นำไปใช้ง่ายคร้าบ] <br />
<br />
ให้พิจารณาโค้ดด้านล่างนี้<br />
<img src="http://upic.me/i/4f/class.png" loading="lazy"  alt="[Image: class.png]" class="mycode_img" /><br />
<br />
โค้ดใน RGSS มักจะอยู่ในรูปแบบนี้เสมอ (ยกเว้นในส่วนของ Module จะเปลี่ยนจากคำว่า class เป็น module แทน) ซึ่งชั้นนอกจะเรียกว่า class และในคลาสจะประกอบไปด้วยสิ่งที่เรียกว่า method <br />
<br />
ตัวอย่างเช่น โค้ดบรรทัดที่ 9 โค้ด @energy = -20 นั้นอยู่ใน method ชื่อ run และอยู่ใน class ชื่อ Person หรือโค้ดบรรทัดที่ 21 นั้นอยู่ใน method ชื่อ go_forward และอยู่ใน class ชื่อ Car เป็นต้น พอจะดูออกแล้วใช่ไหมครับ ทีนี้อยากให้ท่านลองดู script ต่างๆ ที่มีใน script editor สังเกตว่าแทบทุกไฟล์จะมีรูปแบบเหมือนกับภาพตัวอย่างเลยใช่ไหมครับ นั่นคือมี class มี method<br />
<br />
ต่อมาอยากให้ท่านกด F11 แล้วในฝั่งซ้าย เลื่อนลงมาล่างๆ จะเจอกับส่วนที่เรียกว่า Materials ลองคลิกขวา ตรงคำว่า ( Insert here ) แล้วเลือก Insert จะได้ช่องเปล่าเพิ่มขึ้นมา 1 ช่อง ในส่วนของ Name ให้ตั้งชื่ออะไรก็ได้ จากตัวอย่างนี้ ให้ตั้งเป็น My Script ละกันครับ<br />
<br />
สิ่งที่ท่านได้ทำไปคือการสร้างไฟล์ใหม่ขึ้นมานั่นเอง ซึ่งเป็นไฟล์เปล่าๆ ที่จะใช้เขียน script อะไรก็ได้ลงไป เราจะใช้ที่ว่างใหม่นี้ในการเขียนโค้ดเพิ่มเติมโดยไม่ไปยุ่งกับโค้ดส่วนเก่าอีกเลย<br />
<br />
เมื่อเข้าใจกระจ่างแล้ว ย้อนกลับไปที่การ overwrite script และการ alias method ดีกว่า<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">การ Overwrite Script</span></span><br />
วิธีการนี้จะเป็นการเขียนโค้ดทับโค้ดเก่าแบบดื้อๆ เพื่อให้ตัวเกมอ่านโค้ดใหม่ของเราเป็นหลักแทนที่จะอ่านโค้ดเดิมที่มีอยู่ ซึ่งการที่จะ overwrite script ได้นั้นจำเป็นต้องรู้ว่าอยู่ใน method ไหนและอยู่ใน class อะไรเสมอ <br />
<br />
ตัวอย่างจากคำถามข้อ 2 ในหัวข้อที่ผ่านมา<br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม</span> อยากลบเมนูเซฟเกมในหน้าจอเมนูออกไปเลย ให้ไม่แสดงในหน้าจอเมนู<br />
<br />
เราจะไม่ลบ add_save_command เหมือนที่ผ่านมาแล้ว แต่ให้ท่านสังเกตว่า add_save_command นั้นอยู่ใน method อะไร และใน class  อะไร (อย่าเพิ่งอ่านต่อนะ ลองคิดเองก่อน หุหุ)<br />
<br />
ซึ่งจะพบว่าอยู่ใน method make_command_list และ class Window_MenuCommand &lt; Window_Command ใช่ไหมครับ (เครื่องหมาย &lt; คืออะไรไม่ต้องสนใจในจุดนี้ เอามันมาทั้งบรรทัด เหมือนเดิม อธิบายที่นี่ยาวแน่นอน *0*)<br />
<br />
ให้เราไปที่ script ที่เพิ่งสร้างขึ้นใน Materials เมื่อตะกี๊ แล้วเขียนโค้ดดังนี้<br />
[shcode=rails]<br />
class Window_MenuCommand &lt; Window_Command<br />
  def make_command_list<br />
    add_main_commands<br />
    add_formation_command<br />
    add_original_commands<br />
    add_game_end_command<br />
  end<br />
end<br />
[/shcode]<br />
<br />
สังเกตว่าเราดึง class และ method มาเขียนลงไฟล์ใหม่นั่นเอง และใน method ที่เขียนใหม่ของเรานั้นมีโค้ดเหมือนอันเก่าทุกประการ แต่ได้เอา add_save_command ออกไป (ต้องมีโค้ดใน method ส่วนเดิมให้ครบนำ สำคัญมาก เพราะเกมจะไม่อ่านโค้ดเดิมอีกแล้ว)<br />
<br />
เมื่อเรารันเกม เกมก็จะมาอ่าน method make_command_list ใน class Window_MenuCommand &lt; Window_Command ที่เราเขียนใหม่ แทนที่จะไปอ่านของเดิม<br />
<br />
ผลลัพธ์การรันเกมจะเหมือนตัวอย่างที่ทำอันที่แล้วทุกประการ<br />
<br />
นี่แหละที่เรียกว่า การ overwrite script ซึ่งการเขียน overwrite ใหม่นั้น ไม่จำเป็นว่าในคลาสต้องมีเพียง method เดียว อาจจะ overwrite โดยเขียนหลายๆ method ไว้ใน class เดียวเลยก็ได้ (หากแก้หลายที่) และที่สำคัญ อาจสถาปนา method ขึ้นใหม่ด้วยชื่อใหม่เองก็ได้ (แต่การเขียน method ขึ้นใหม่เองอาจยังไม่เหมาะกับมือใหม่ จะไม่กล่าวในบทความนี้)<br />
<br />
<span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">แล้วโค้ดเดิมไปไหน ทำไมจึงเป็นเช่นนั้น?</span></span><br />
<br />
หลักการของภาษา Ruby นั่นคือ หากเจอ class ซ้ำกัน หรือ method ซ้ำกันที่อยู่ใน class เดียวกัน มันจะใช้งานโค้ดที่อยู่ด้านล่างเป็นหลัก ซึ่งหากเราพิจารณาแล้ว script ส่วนของ Materials ที่เราเขียนเพิ่ม มันแทบจะอยู่ล่างสุดเลยใช่ไหมครับ มันจึงเป็นเหตุผลว่าทำไมโปรแกรมถึงจัดวางที่เขียนโค้ดให้เราด้านล่างนั่นเอง ^^<br />
<br />
นอกจากนี้ยังสามารถ overwrite โค้ดใน class นอก method ได้อีกด้วย แต่ช่างมันเต๊อะ ไว้จะเขียนให้ในบทความที่ advance กว่านี้นะคับ แหะๆ<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">การ Alias Method</span></span><br />
หลังจากที่รู้จักการ overwrite script ไปแล้ว ยังมีอีกสิ่งหนึ่งเรียกว่า การ alias method ซึ่งขอเกริ่นนำด้วยตัวอย่างโจทย์เลยละกันครับ<br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม:</span> อยากให้เลเวลอัพแล้วฟื้นฟูเลือดจนเต็ม<br />
ลองหาวิธีก่อนนะครับ อาจจะยังทำไม่ได้ไม่เป็นไร ลองมาดูเฉลยครับ<br />
<br />
ขอทำด้วยวิธีการ overwrite เหมือนอันที่แล้วเพื่อให้เห็นภาพก่อนครับ<br />
<br />
ข้อนี้มี keyword ตรง level up ลองนึกดูว่าอะไรที่สามารถ level up ได้ นั่นก็คือตัวละครนั่นเอง ซึ่งตัวละครใน RPG Maker จะใช้คำว่า Actor ซึ่งมี script ที่เข้าเค้าคือ Game_Actor (ไม่ใช่ Game_Actors นะ ดูดีๆ) เข้าไปแล้วหากโค้ดมีหลายบรรทัดลองกด Ctrl+F เพื่อหาเอาเลยครับ ลอง search ว่า level แล้วไล่ดูเรื่อยๆ จะพบ method ที่น่าสนใจคือ method level_up ประมาณบรรทัดที่ 426 งวดนี้จะไม่ได้แก้ข้อมูลด้านใน แต่ละเพิ่มคำสั่งเข้าไปใน method แทน ให้ทำการหา class ของ method นี้ด้วย เพื่อจะทำการเขียนโค้ด overwrite ใหม่<br />
<br />
ไปที่ โค้ดที่สร้างขึ้นใน Materials เหมือนเดิม ไฟล์เดิมก็ได้ครับ จากนั้นก็อปโค้ดส่วน method level_up ที่เราหามาได้ แล้วอย่าลืมใส่ class ที่หามาครอบด้วยนะ เขียนต่อโค้ดเก่าที่มีได้เลย (ไฟล์นึงจะมีกี่ overwrite ก็ได้ แต่หากเขียนโค้ดเยอะขึ้น แยกให้เป็นหมวดหมู่ก็ดีครับ) <br />
<br />
ทำแล้วได้เหมือนผมไหมครับ<br />
<br />
[shcode=rails]<br />
class Game_Actor &lt; Game_Battler<br />
  def level_up<br />
<br />
    # โค้ดเดิมก็อปมาใส่ใหม่<br />
    @level += 1<br />
    self.class.learnings.each do |learning|<br />
      learn_skill(learning.skill_id) if learning.level == @level<br />
    end<br />
<br />
    # โค้ดใหม่<br />
    @hp = mhp   #ตั้ง hp ของเรา ให้มีค่าเท่ากับ max hp <br />
    @mp = mmp   #ตั้ง mp ของเรา ให้มีค่าเท่ากับ max mp<br />
<br />
  end <br />
end <br />
[/shcode]<br />
<br />
@hp กับ @mp เป็นตัวแปรที่ใช้แทน hp, mp ปัจจุบันของตัวละครดังกล่าว ส่วน mhp, mmp เป็นตัวแปรอ้างถึง max hp, max mp ครับ (ส่วนรู้ได้ยังไงว่าหาจากไหน อาศัยประสบการณ์การแกะโค้ดและการหาข้อมูลจาก google เอาครับ หาเรื่อยๆ อ่านเรื่อยๆ เดี๋ยวก็เข้าสมองเองครับ หุหุ)<br />
<br />
สังเกตว่าการ overwrite นั้นจำเป็นต้องใส่โค้ดเก่าด้วยเสมอ (เพราะอย่าลืม มันไม่อ่านโค้ดเดิมอีกแล้ว) แล้วในข้อนี้เราแค่เติมโค้ดเพิ่มเข้าไปสองบรรทัด ซึ่งในการทำ overwrite นั้น มีข้อเสียอยู่เช่นกัน (แต่ยังไงก็ดีกว่าแก้โค้ดเดิมแน่นอนครับ)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ข้อเสียของการเขียน overwrite</span><br />
<ol type="1" class="mycode_list"><li>เราต้องเขียนโค้ดเก่าซ้ำๆ ซึ่งอาจเกิดปัญหาหากเผลอไปแก้โค้ดเก่าที่มี (ยกเว้นเจตนาแก้)<br />
</li>
<li>ในกรณีที่โหลดโค้ดของคนอื่นมาใช้ โค้ดอาจตีกันกับของเราได้<br />
</li>
</ol>
อธิบายข้อที่สองสักหน่อยละกัน ว่ามันตีกันยังไง สมมุติเราแก้โค้ดเลเวลอัพของเราให้มีเลือดเต็มตามตัวอย่างเมื่อกี๊ แล้วเรามีโค้ดของคนอื่นที่โหลดมาลงใน Material ด้วย แต่บังเอิ๊ญญญ โค้ดของคนอื่นที่โหลดมานั้นดันมีส่วนที่เขียนว่า หากเลเวลอัพแล้วได้ตัง 5000G ดังนี้<br />
<br />
[shcode=rails]<br />
class Game_Actor &lt; Game_Battler<br />
  def level_up<br />
    @level += 1<br />
    self.class.learnings.each do |learning|<br />
      learn_skill(learning.skill_id) if learning.level == @level<br />
    end<br />
    &#36;game_party.gain_gold(5000) # คนอื่นใส่โค้ดนี้เพิ่มมา<br />
  end <br />
end <br />
[/shcode]<br />
<br />
ลองทายดูสิครับว่า หากมีทั้งโค้ดของเรา และโค้ดของคนอื่นดังกล่าว ผลจะเป็นอย่างไรครับ...<br />
แน่นอนว่า จากกฎการ overwrite มันจะทำงานเฉพาะอันที่อยู่ล่างสุดใช่ไหมครับ ^^<br />
ดังนั้น หากโค้ดของเราอยู่ด้านล่าง เมื่อเลเวลอัพตัวละครก็จะเลือดเต็มเท่านั้น และหากโค้ดของคนอื่นอยู่ด้านล่าง เมื่อเลเวลอัพก็จะได้เงินเพิ่ม 5000G เท่านั้น...<br />
<br />
วิธีการ alias method จะมาแก้ปัญหาข้างบนนี้<br />
<br />
การประกาศ alias method หมายถึงการสร้าง method ใหม่ขึ้นมาให้มีโค้ดเหมือน method เดิม และสามารถตั้งชื่อ method ใหม่ที่ก็อปมาได้ โดยมีรูปแบบการเขียนดังนี้<br />
alias_method :copied_method_name, :current_method_name<br />
<br />
เช่น<br />
[shcode=rails]<br />
def run<br />
  p "Go go!"<br />
  p "Wow, very quickly."<br />
  p "Run Run Run!"<br />
end<br />
[/shcode]<br />
<br />
จากนั้นบรรทัดถัดมาผมเพิ่ม<br />
<br />
[shcode=rails]<br />
alias_method :run_copied, :run<br />
[/shcode]<br />
<br />
จากโค้ดด้านบน เป็นการ copy method run_copied เพิ่มมาอีกอัน และมีคำสั่งด้านในเหมือน method run ในปัจจุบัน ดังนั้น มันจะแอบไปเพิ่มโค้ดด้านล่างนี้ขึ้นมาเอง (เราไม่ต้องเขียนนะ)<br />
<br />
[shcode=rails]<br />
def run_copied<br />
  p "Go go!"<br />
  p "Wow, very quickly."<br />
  p "Run Run Run!"<br />
end<br />
[/shcode]<br />
<br />
แล้วมีประโยชน์อย่างไร<br />
สมมุติผมมีโค้ดด้านบนแล้ว ผมต้องการ overwrite method run ด้านบน ปรกติผมเขียนแบบนี้ใช่ไหม<br />
<br />
[shcode=rails]<br />
def run<br />
  p "Go go!"<br />
  p "Wow, very quickly."<br />
  p "Run Run Run!"<br />
  p "YEAHHHHHHHHHH!!!" # เพิ่มเข้ามา<br />
end<br />
[/shcode]<br />
<br />
เนื่องจากมีการ copy method ไปใส่ใน run_copied แล้ว ผมสามารถเขียนใหม่เป็นแบบนี้ได้<br />
<br />
[shcode=rails]<br />
def run<br />
  run_copied  # เรียก method ชื่อ run_copied<br />
  p "YEAHHHHHHHHHH!!!" # เพิ่มเข้ามา<br />
end<br />
[/shcode]<br />
<br />
ซึ่งหลักการทำงานจะเป็นดังนี้<br />
<img src="http://upic.me/i/4o/9untitled-3.jpg" loading="lazy"  alt="[Image: 9untitled-3.jpg]" class="mycode_img" /><br />
<br />
ในครั้งนี้ เราได้ทำการ override method run โดยใช้การเรียก method run_copied ด้านใน แล้วต่อด้วยคำสั่งที่ต้องการเพิ่ม ทำให้การ overwrite เราไม่จำเป็นต้องพิมพ์คำสั่งทั้งหมดที่อยู่ใน method run เดิมอีกต่อไป ซึ่งทำให้ลดความซ้ำซ้อนลงได้เป็นอย่างมาก<br />
<br />
ทีนี้มันแก้ปัญหาโค้ดตีกันกับชาวบ้านได้อย่างไร มาดูกันครับ<br />
กลับมาที่โค้ดเลเวลอัพเหมือนเดิม ผมแก้โค้ดของผมจากโค้ดเดิมเป็นอันนี้<br />
<br />
[shcode=rails]<br />
class Game_Actor &lt; Game_Battler<br />
  alias_method :level_up_copied, :level_up<br />
  def level_up<br />
    level_up_copied<br />
    # โค้ดใหม่<br />
    @hp = mhp   #ตั้ง hp ของเรา ให้มีค่าเท่ากับ max hp <br />
    @mp = mmp   #ตั้ง mp ของเรา ให้มีค่าเท่ากับ max mp<br />
  end <br />
end <br />
[/shcode]<br />
<br />
แล้วผมเอาไปไว้ใต้โค้ดของคนอื่น (ที่เลเวลอัพแล้วเพิ่ม 5000G) <span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">ย้ำว่าเอาไว้ข้างใต้นะครับ!</span></span><br />
ลองรันเกมดู จะพบว่าเมื่อเลเวลอัพ เราจะได้ทั้งเงิน 5000G และเลือดตัวละครที่เลเวลอัพเต็มไปพร้อมกัน<br />
<br />
เพราะอะไร ฝากไปคิดเป็นการบ้านนะครับ <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /> <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /> <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
ฝากการบ้านอีกข้อครับ ถ้าหากเราเอาโค้ดของเราไว้ด้านบนโค้ดของคนอื่น (ที่เลเวลอัพแล้วเพิ่ม 5000G)  แทนล่ะ จะเกิดอะไรขึ้น เพราะอะไร <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
โอโหวววว alias method ดีขนาดนี้ ทำไมไม่ใช้มันทุกครั้งไปเลย<br />
แม้ว่าการแก้ปัญหาด้วยวิธีการ alias method นั้นจะเป็นไปได้ด้วยดี แต่ว่ามันมีข้อจำกัดคือ เราสามารถใช้วิธีได้ หากเป็นกรณีที่เราแทรกโค้ดเพิ่มเท่านั้น เราไม่สามารถลบของได้เลย<br />
<br />
เช่น จากคำถามเมื่อปีมะโว้ ถ้าเราต้องการเอาเมนูเซฟออก ก็ไม่สามารถใช้วิธี alias method ได้ เพราะเราต้อง ลบโค้ดบางส่วนออกจากของเดิมนั่นเอง (แต่จริงๆ มันก็ได้แหละ แต่อาจจะตองใช้กระบวนท่าซับซ้อน)<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">สรุปข้อดีของการ overwrite script</span></span><ul class="mycode_list"><li>ง่ายต่อการตรวจบั๊ก<br />
</li>
<li>หากเจอ error ในเกม จนเกมพัง หาสาเหตุไม่เจอ อย่างมากก็แค่นำ script ในส่วน material ออกให้หมด หรือเอาออกเป็นตัวๆ เพื่อหาสาเหตุ<br />
</li>
<li>เพียงแค่ Copy Paste ไฟล์ที่ท่านเขียนเพิ่มใน Materials ก็สามารถเอาไปใช้กี่เกมก็ได้<br />
</li>
<li>หากเขียนจนคล่องแล้ว สามารถรวบรวมสคริปต์เป็นไฟล์เดียวแล้วแจกคนอื่นได้ เหมือนกับที่คนอื่นเขียน script แจกทุกวันนี้นั่นเอง<br />
</li>
<li>ไม่ต้องกลัวปัญหาเรื่อง RPG Maker อัพเดต (แต่อาจมีปัญหาหาก RPG Maker ดันไปแก้ script ที่เรา overwrite แต่ถ้าใช้ alias method ได้จะปราศจากปัญหาทั้งปวง)<br />
</li>
</ul>
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">สรุป</span></span><ul class="mycode_list"><li>หากเป็นไปได้ ให้ใช้ alias method เอาไว้ก่อนเลย เพราะนอกจากโค้ดจะสะอาด ไม่ตีกันแล้ว ยังแสดงถึงมารยาทที่ดีในการเขียนโค้ดเพื่อนำไปแจกผู้อื่นด้วย เพราะเราการันตีได้ว่าโค้ดของเราจะไม่ไปทับของคนอื่นอย่างแน่นอน<br />
</li>
<li>ถ้าใช้ไม่ได้จริงๆ ค่อยเขียน overwrite แบบธรรมดา แม้อาจจะเกิดปัญหาโค้ดตีกันกับโค้ดคนอื่นหากนำไปแจกผู้อื่น แต่มันก็เป็นเรื่องช่วยไม่ได้จริงๆ<br />
</li>
<li>จงจำเอาไว้ว่าไม่ควรไปแตะต้องโค้ดเหนือส่วน Material (ยกเว้น module Vocab พออนุโลม) ควรใช้วิธี overwrite ให้ติดเป็นนิสัยนะครับ อย่าคิดว่าแก้นิดหน่อยแก้ทับโค้ดเดิมก็ได้ เพราะมันจะทำให้ปัญหาบานปลายภายหลัง ลองสังเกตบอร์ดต่างประเทศดูครับ มีคนมาขอ script แม้จะแก้บรรทัดเดียวเขาก็ตอบด้วยการใช้วิธี overwrite แล้วไปใส่ใน Materials ครับ<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">สรุปทั้งหมด</span></span><br />
สิ่งที่บทความนี่ต้องการสื่อคือ บอกแนวทางการโม script และการเขียน script ให้เป็นระเบียบ ดังนั้นหากอ่านจบแล้วยังรู้สึกว่าโมอะไรไม่ได้เลย อย่าเสียใจหรือท้อแท้นะครับ เพราะสิ่งที่ท่านได้รับในบทความนี้คือพื้นฐาน แนวทางและทฤษฎี ยังไม่ได้ลองปฏิบัติก็ไม่แปลกที่ยังทำไม่ได้ครับ อนึ่ง สังเกตว่าสิ่งที่แก้ในบทความนี้นั้น มักจะเป็นการ เดา เดา และเดา ใช่ครับ <span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">การแก้โค้ดของคนอื่นไม่ใช่เรื่องง่าย</span></span> ไม่ว่าจะเป็น RGSS หรือโค้ดภาษาอะไรในโลกก็ตาม ดังนั้นหากเป็นครั้งแรกที่ท่านทำอะไรแบบนี้แล้วไม่รู้เรื่อง งง ก็อย่าแปลกใจครับ อาศัยประสบการณ์ฝึกฝนเอาครับ เราฟันธงไม่ได้หรอกว่าโค้ดส่วนไหนคืออะไร แต่เนื่องจากโครงสร้างที่ผู้สร้าง RGSS ออกแบบมาดีมาก รวมถึงมีคอมเมนต์สีเขียวที่อ่านเข้าใจง่าย เชื่อผมว่า ฝึกไม่นานครับ ^^<br />
<br />
และแน่นอนว่า ท่านก็อาจไม่รู้เหมือนกันว่าจะเก็บประสบการณ์จากไหน เพราะไม่รู้จะฝึกอย่างไร ในจุดนี้หากมีคนสนใจบทความนี้เป็นจำนวนหนึ่ง ผมจะตั้งกระทู้ใหม่เรื่อยๆ เป็น WORKSHOP ให้ทำ ตั้งแต่การตั้งโจทย์ แนวคิด วิธีแก้ไขปัญหา ไปจนถึงการเขียนโค้ดทุกขั้นตอน ดังนั้นไม่ต้องกลัวครับ ผมมีโจทย์มาให้ฝึกแน่นอน ^^<br />
<br />
และผมยังคงบอกได้คำเดิมว่า เนื้อหาในบทความนี้เป็นเพียงเนื้อหาเบื้องต้นเท่านั้น ในการฝึกช่วงแรกๆ อย่าไปโมอะไรที่มันหลุดโลกเกินไป เพราะในบางเคสนั้น การเดาโค้ดอาจต้องกระโดดไปมาดู 4-5 ไฟล์ถึงจะเข้าใจว่าโค้ดทำงานอย่างไร ทำไม่ได้จะท้อเปล่าๆ ซึ่งหากมีเวลาว่างพอ ผมจะมาเขียนบทความในส่วนของเทคนิคการเดาโค้ดแบบกระโดดข้ามไฟล์อีกครั้งครับ ตอนนี้เอาส่วนนี้ให้แม่นก่อนละกันนะคร้าบ<br />
<br />
แต่ถ้ามั่นใจว่าทำได้ ลุยเลยครับผม!<br />
<br />
สุดท้ายนี้ ขอให้สนุกกับการเขียนโค้ดทุกคนครับ <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">แบบฝึกหัด</span></span><br />
ทุกข้อต้องใช้วิธีการ overwrite / alias method ตามความเหมาะสม<br />
ให้สร้างโปรเจกต์ใหม่ขึ้นมา โดยไม่ต้องใส่ script อื่นใด<br />
<ol type="1" class="mycode_list"><li>จากคำถามสามข้อที่ผ่านมาในหัวข้อ "แนวคิดในการโม script" จงทำให้อยู่ในรูป overwrite / alias method ตามความเหมาะสม<br />
</li>
<li>ในหน้าจอโหลดเกม เซฟเกม จะมีการไล่ไฟล์โดยมีข้อความ File 1, File 2, ... อยากเปลี่ยนเป็น Slot 1, Slot 2, ... ต้องทำอย่างไร<br />
</li>
<li>จำนวนช่องเซฟเกมมีมากเกินไป อยากให้เหลือ 8 ช่องพอ<br />
</li>
<li>โดยปกติแล้ว การขายไอเท็มจะขายได้ในราคาครึ่งหนึ่งของราคาซื้อ รู้สึกว่ามันน้อยเกินไปจังเลย อยากให้ขายได้ในราคา 75% ของราคาซื้อ แก้อย่างไรดีน้า...<br />
</li>
<li>ในหน้าจอเปลี่ยนชื่อตัวละคร เมื่อกดปุ่ม Page แล้วมันจะพาไปยังหน้าภาษา Latin อื่นๆ ที่ไม่ใช่ภาษาอังกฤษ (ลองดูได้) ไม่อยากได้หน้านั้นเลย ต้องทำอย่างไร<br />
</li>
<li>ในฉากต่อสู้ทั่วไป สามารถกด Escape เพื่อหนีศัตรู ซึ่งเดิมจะมีโอกาสที่จะหนีไม่พ้น อยากทราบว่าการหนีพ้นหรือไม่พ้นขึ้นกับปัจจัยใด และถ้าหากต้องการให้โอกาสหนีเป็น 100% จะต้องทำอย่างไร<br />
</li>
<li>อยากให้ตัวละครเดินกลับทิศกับลูกศรคีย์บอร์ด (กดขึ้นเดินลง กดซ้ายเดินขวา เป็นต้น) ทำอย่างไร<br />
</li>
<li>อยากให้การแสดงชื่อแผนที่เป็นแบบนี้ ทำอย่างไร (ปกติจะอยู่ริมซ้าย) (เฉพาะ RGSS3)<br />
<img src="http://upic.me/i/qb/10capture.jpg" loading="lazy"  alt="[Image: 10capture.jpg]" class="mycode_img" /><br />
</li>
</ol>
]]></description>
			<content:encoded><![CDATA[<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">พื้นฐานการโม Script เบื้องต้น</span></span><br />
<br />
บทความนี้เป็นบทความเบื้องต้น อย่างไรก็ตาม เนื้อหามีความยาวถึงยาวที่สุด เหมาะสำหรับผู้ที่ต้องการเขียน script อย่างจริงจังในอนาคต <br />
<br />
บทความนี้ตั้งใจเขียนมาก พยายามอธิบายให้ง่ายที่สุด อย่างไรก็ตาม หากไม่เข้าใจ มีข้อสงสัยหรือข้อเสนอแนะ โปรดคอมเมนต์ด้วยนะครับ หรือถ้าไม่รู้เรื่องตรงไหนบอกได้เลยครับ หรือหากมีข้อผิดพลาด แจ้งได้เลยนะครับ<br />
<br />
แม้ในบทความนี้จะใช้ RGSS3 เป็นหลัก แต่หลักการสอนในบทความนี้สามารถนำไปประยุกต์ใช้ได้ทุกเวอร์ชันครับ หรือแม้แต่นำหลักการไปใช้ทำอย่างอื่นนอกจากใช้ใน RPG Maker ก็ได้ครับ<br />
<br />
<hr class="mycode_hr" />
<br />
เคยไหม บางทีอยากได้ระบบตามที่ต้องการ ในบางกรณีการแก้ด้วย event หรือ database นั้นยังมีขีดจำกัดอยู่ จึงไม่สามารถเปลี่ยนแปลงได้ดั่งใจ ทำให้ต้องหวังพึ่งการใช้ script ในการทำระบบที่ต้องการ ซึ่งหลายๆ คนเมื่อเปิดหน้าจอ script editor ดูก็รู้สึกเอียน มึนหัว ตาลาย ไม่อยากไปแตะต้องเลย...<br />
<br />
ถ้าโชคดี เจอ script ที่มีคนเขียนมาก่อน ก็โหลดมาลงแล้วใช้งานได้เลย แต่ถ้าเราต้องการ script ที่มันเฉพาะเจาะจงจริงๆ ทักษะการโม script ก็ทำให้เราได้เปรียบไม่ใช่น้อย<br />
<br />
จริงๆ แล้วก่อนที่จะทำการโม script นั้น แนะนำให้ศึกษาพื้นฐานการเขียน Ruby script ก่อน เพราะจะทำให้เราเข้าใจ script ได้อย่างรวดเร็วมากขึ้น แต่อย่างไรก็ตาม ในบทความนี้จะพยายามยกตัวอย่างที่ทุกท่านเข้าใจได้ไม่ยาก<br />
<br />
ซึ่งบทเรียนจะมีดังนี้ครับ จะมาราธอนสอนตั้งแต่ต้นจนจบในกระทู้นี้เลยครับ<ul class="mycode_list"><li>เข้าใจส่วนต่างๆ ในหน้าจอ script ของ RGSS3<br />
</li>
<li>RPG Maker VX Ace Database Module<br />
</li>
<li>แนวคิดในการโม script<br />
</li>
<li>เข้าใจการ alias method และ overwrite script สิ่งสำคัญก่อนจะเป็นนักเขียน script ตัวยง!<br />
</li>
<li>แบบฝึกหัด<br />
</li>
</ul>
ทำความเข้าใจก่อนว่าอ่านบทความนี้จบ ท่านจะได้แนวคิดและหลักในการโมโค้ด แต่ไม่ถึงกับทำ script แจกเป็นเรื่องเป็นราวได้ อย่างไรก็ตาม บทความนี้เป็นการปูพื้นฐานที่ดีในการยืนอยู่จุดนั้นครับ ^^<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">เข้าใจส่วนต่างๆ ในหน้าจอ script ของ RGSS3</span></span><br />
สิ่งสำคัญที่ต้องรู้เป็นอันดับแรกเลยนั่นคือ ต้องรู้ว่าส่วนต่างๆ ของ script ในหน้า script editor นั้นมีหน้าที่อะไรบ้าง เพื่อจะนำไปสู่การคาดเดาเพื่อโม script ในอนาคต<br />
<br />
ใน RGSS3 นั้น ทีมพัฒนาได้เขียนโค้ดอ่านเข้าใจง่าย และเป็นระเบียบมากๆ มีการพัฒนาจากรุ่นก่อนๆ อย่างเห็นได้ชัด ให้ท่านลองปุ่ม F11 ดู จะมีหน้าจอ script editor ปรากฎขึ้นมา มองไปทางซ้าย สังเกตว่ามันจะแบ่งเป็นส่วนๆ ชัดเจน ให้ลองดูตามไปเลยนะครับ<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. ส่วนของ Modules</span></span><br />
ส่วนนี้จะอยู่ด้านบนซ้ายสุดของหน้าจอ แบ่งเป็นสองส่วนย่อย<br />
<br />
<span style="font-weight: bold;" class="mycode_b">1.1 ส่วนของการจัดการข้อมูลที่ใช้ในเกม</span><ul class="mycode_list"><li>Vocab: เก็บข้อความในเกมแทบทั้งหมด ซึ่งมีทั้งข้อความที่แก้ใน script และข้อความที่ดึงมาจาก database ในหน้า Terms<br />
</li>
<li>Sound: เสียงประกอบต่างๆ ที่ดังข้อมูลมาจาก database ที่เราตั้งไว้ในหน้า System<br />
</li>
<li>Cache: การดึงข้อมูลที่อ่านไปใส่ลงหน่วยความจำหลัก เพื่อทำให้เกมทำงานเร็วขึ้น (เรื่องมันยาว หากอยากเข้าใจส่วนนี้จริงๆ หลังไมค์ได้ครับ)<br />
</li>
</ul>
<span style="font-weight: bold;" class="mycode_b">1.2 ส่วนของการควบคุมโดยรวมของเกม</span><br />
ส่วนนี้จะส่วนที่คอยควบคุมข้อมูลต่างๆ ในเกมครับ เทียบได้กับ "ผู้จัดการ" ที่สั่งพนักงานทำงานต่างๆ นั่นเอง<ul class="mycode_list"><li>DataManager: ในส่วนนี้จะควบคุมการใช้งานข้อมูลในเกมเป็นหลัก เช่น ข้อมูลเซฟ ข้อมูลจาก database ข้อมูลระหว่างการเล่นเกมอยู่ เป็นต้น<br />
</li>
<li>SceneManager: ใช้ควบคุมการเข้าถึงฉากต่างๆ ของเกม เช่น เมื่อกดเข้าเมนู SceneManager ก็จะมีหน้าสั่งให้เปลี่ยนจาก หน้าจอเกม (Scene_Map) เป็นหน้าจอเมนู (Scene_Menu) เป็นต้น<br />
</li>
<li>BattleManager: ส่วนควบคุมในกระบวนการต่อสู้แทบทั้งหมดตั้งแต่เริ่มเข้าฉากยันจบการต่อสู้ได้ exp ได้ของ<br />
</li>
</ul>
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. ส่วนของ Game Objects</span></span><br />
ในส่วนนี้จะเป็นส่วนของการเก็บข้อมูลต่างๆ ในเกมในขณะที่เล่นอยู่ เช่น ข้อมูลปาร์ตี้ ข้อมูลศัตรู หรืออื่นๆ โดยข้อมูลจะเป็นข้อมูลที่ถูกสร้างระหว่างที่อยู่ในเกม ไม่เกี่ยวข้องกับข้อมูลในฐานข้อมูลแต่อย่างใด เช่น เมื่อเดินเจอศัตรูปุ๊บ ข้อมูลศัตรูที่เจอก็จะถูกสร้าง แล้วก็มีข้อมูล hp, mp, atk, เป็นต้น ซึ่งสังเกตว่าข้อมูลบางอย่างจะมีการเปลี่ยนแปลงได้ตลอดเวลา เช่น เราโจมตี มอนสเตอร์ hp ลด เป็นต้น ในส่วนนี้แบ่งออกเป็นไฟล์ต่างๆ มากมาย และจะขึ้นต้นด้วย Game_ เพื่อแบ่งแยกประเภทชัดเจน<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. ส่วนของ Sprites</span></span><br />
ในส่วนนี้จะเป็นส่วนของการจัดการสิ่งของในเกมที่เกี่ยวกับภาพทั้งหมด ไม่ว่าจะเป็นท่าเดินของตัวละคร ภาพตัวละคร ภาพศัตรู รูปภาพ ฉากต่างๆ หรือเอฟเฟกต์ต่อสู้ เป็นต้น<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. ส่วนของ Windows</span></span><br />
ในส่วนนี้จะเป็นส่วนของหน้าต่างที่ใช้สื่อสารกับผูเล่นทั้งหมดในเกม ไม่ว่าจะเป็น กล่องข้อความ หน้าต่างตัวเลือก หรือหน้าต่างแสดงรายการเมนู หน้าหน้าต่างแสดงรายละเอียดผู้เล่น หน้าต่างแสดงข้อมูลเครื่องสวมใส่ เป็นต้น พูดง่ายๆ อะไรที่เป็นกล่องๆ มีเส้นขอบขาวๆ พื้นหลังสีน้ำเงิน (ในกรณีที่ไม่ได้ปรับแต่งอะไรเพิ่มเติม) มีข้อความข้างใน จะอยู่ในส่วนของ Windows หมด<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. ส่วนของ Scenes</span></span><br />
ในส่วนนี้จะเป็นส่วนของการเก็บฉากต่างๆ ในเกม ไม่ว่าจะเป็นฉาก Title, ฉาก Map (ฉากขณะเล่นเกม), ฉากเมนู, ฉากต่อสู้, ฉาก Game Over เป็นต้น <br />
<br />
อย่าสับสนกับส่วนของ Windows นะ หลายคนงงว่าทำไมส่วนของ Windows ก็มี Menu ส่วนของ Scene ก็มี Menu ในที่นี้ส่วนของ Scene จะหมายถึงการเข้าฉากที่เป็นเมนูเกม ซึ่งในเมนูเกมนั้นจะประกอบไปด้วย หน้าต่างเลือกเมนู หน้าต่างแสดงข้อมูลปาร์ตี้ หน้าต่าง หน้าต่างแสดงจำนวนเงิน ซึ่งหน้าต่างทั้งหลายเหล่านี้จะอยู่ใน ฉากของ Menu อีกทีนั่นเอง<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">RPG Maker VX Ace Database Module</span></span><br />
นอกจากส่วนที่อยู่ในหน้าจอ script editor แล้ว ยังมีข้อมูลอีกส่วนหนึ่งที่สามารถเรียกใช้ได้เช่นกัน แต่ไม่มีบอกในหน้าจอดังกล่าว นั่นคือ RPG Module ซึ่งเป็นโมดูลที่เก็บข้อมูล Database เกมทั้งหมด และส่วนใหญ่จะดึงข้อมูลจาก database editor (F9) เมื่อนำไปใช้ในเกม ในส่วนนี้จะเป็นค่าที่เรียกใช้ข้อมูลอย่างเดียว ไม่สามารถเปลี่ยนแปลงแก้ไขขณะอยู่ในเกมได้เลย<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">แนวคิดในการโม script</span></span><br />
เอาล่ะ เมื่อรู้ข้อมูลเบื้องต้นแล้ว ในตอนนี้เราจะสามารถคาดเดาได้บ้างแล้ว ว่าอยากแก้แบบนี้ ควรจะไปแก้ที่ไหน ทุกส่วนที่กล่าวมาล้วนมีความจำเป็นในการโม script ทั้งสิ้น แนวคิดหลักๆ เลยคือ<br />
<ol type="1" class="mycode_list"><li>คาดเดาก่อนเลยว่าการแก้ปัญหาของเรานั้นเข้าเค้าในส่วนไหนของ script ในฝั่งซ้ายของ script editor ชื่อไฟล์แต่ละ script จะบ่งบอกถึงการทำงานในส่วนนั้น<br />
</li>
<li>เมือเลือก script ฝั่งซ้ายได้แล้วลองคาดเดาว่าโค้ดส่วนไหนทำงานอะไร ลองค้นหาสิ่งที่เกี่ยวข้อง หากโค้ดมีหลายบรรทัด ให้ลองกด Ctrl+F หาข้อความ<br />
</li>
<li>อ่านคอมเมนต์ และคำสั่งของโค้ดให้ดี ทุกอย่างล้วนมีความหมายแฝง<br />
</li>
<li>หากไม่เจอ ให้ลองเปลี่ยนคำค้น หรือเปลี่ยน script ฝั่งซ้ายดู เราอาจเลือกผิดก็เป็นได้<br />
</li>
<li>หากเข้าตาจน หรือแก้ไม่ได้ Google และเว็บบอร์ดต่างประเทศช่วยท่านได้<br />
</li>
</ol>
เรามาลองทายโจทย์ง่ายๆ กันก่อน ^^<br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม</span> อยากแก้ข้อความ Buy, Sell, Cancel ใน shop ทำอย่างไร<br />
<img src="http://upic.me/i/hn/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<span style="font-weight: bold;" class="mycode_b">วิธีการคาดเดา</span> เรารู้ว่าใน Module Vocab นั้นใช้เก็บข้อความในเกมแทบทั้งหมด ฉะนั้นรออยู่ไย ลองเข้าไปหากันเลย แล้วลองสำรวจว่าบรรทัดไหนที่มีข้อความทำนองนั้น ให้แก้โดยพลัน ~<br />
<img src="http://upic.me/i/ij/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม</span> อยากลบเมนูเซฟเกมในหน้าจอเมนูออกไปเลย ให้ไม่แสดงในหน้าจอเมนู<br />
<img src="http://upic.me/i/gv/6capture.jpg" loading="lazy"  alt="[Image: 6capture.jpg]" class="mycode_img" /><br />
<span style="font-weight: bold;" class="mycode_b">วิธีการคาดเดา</span> ก็ต้องดูก่อนว่าคำสั่งเซฟเกมควรจะอยู่ในส่วนไหนของ script ซึ่งแน่นอนว่ามันอยู่ใน window object อะไรสักอย่างแน่ๆ (เพราะมีลักษณะเป็นกล่องๆ) เมื่อไล่ดูแล้วก็จะพอเดาได้ว่าอยู่ใน Window_MenuCommand ต่อมาลองพิจารณาประมาณบรรทัดที่ 40 ซึ่งเขียนว่า add_save_command โอ้โห! โป๊ะเชะ น่าจะอันนี้แหละ แต่จะลบทิ้งก็ยังไงอยู่ แนะนำให้ลองใส่ # ด้านหน้าบรรทัดดังกล่าวเพื่อ comment แทนการลบ จากนั้นลองรันเกมแล้วเปิดเมนูดู ถ้าเมนูเซฟหายไป แปลว่า ท่านเดาถูกแล้วล่ะ <img src="https://irpg.in.th/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" /><br />
<img src="http://upic.me/i/j5/7capture.jpg" loading="lazy"  alt="[Image: 7capture.jpg]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม</span> เรือ (boat) ในเกมวิ่งช้าจุงเบย อยากให้มันเร็วกว่านี้<br />
<span style="font-weight: bold;" class="mycode_b">วิธีการคาดเดา</span> ในข้อนี้เป็นการแก้ข้อมูลของตัวเกม ดังนั้นมีความเป็นไปได้สูงสุดที่จะอยู่ในส่วนของ Game Objects เราก็ลองไล่ๆ ดู อ๊ะ อันนี้น่าจะเข้าเค้าสุดละ Game_Vehicles นั่นเอง เข้าไปแล้วลองไล่ๆโค้ดดูอย่างใจเย็นๆ บรรทัดประมาณ 34 จะเห็นโค้ด @move_speed = 4 if @type == :boat อ่านแล้วค่อนข้างเข้าใจง่ายมากๆ ว่าแล้วก็ลองแก้จาก 4 เป็น 10 แล้วลองวางเรือ เข้าเกมไปลองขึ้นเรือดู ว้าว เห็นผล วิ่งเร็วยังกับจรวด!!!<br />
<img src="http://upic.me/i/rt/8capture.jpg" loading="lazy"  alt="[Image: 8capture.jpg]" class="mycode_img" /><br />
<br />
ในช่วงแรกๆ อาจจะยังเดาได้ไม่คล่อง หรือรู้สึกยาก อย่าท้อครับ ให้พยายามไปเรื่อยๆ เราจะเริ่มจับทางได้เอง ยิ่งใครเคยเขียนโปรแกรมมาก่อน ยิ่งได้เปรียบเลยครับ<br />
 <br />
จากโจทย์ด้านบน สังเกตว่าเราแก้ปัญหาโดยไปเปลี่ยนโค้ดในส่วนต่างๆ ที่ต้องการ ซึ่งในการใช้จริงในอนาคต <span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">การแก้แบบด้านบนเป็นตัวอย่างที่ไม่ดี และไม่แนะนำเป็นอย่างยิ่ง</span></span> เหตุผลและวิธีการแก้ปัญหาอยู่ในหัวข้อถัดไปเลยจ้า<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">เข้าใจการ alias method และ overwrite method สิ่งสำคัญที่หลายคนมองข้าม!</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #FF0000;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">ขอบอกล่วงหน้าว่าหัวข้อนี้ค่อนข้างยาวและซับซ้อน ค่อยๆ อ่านใจเย็นๆ นะครับ มันสำคัญมากๆๆๆ สำหรับผู้ที่ต้องการเขียน script อย่างจริงจังในอนาคต หากเข้าใจทั้งหมด มันคือกำไรชีวิตแน่นอนครับผมการันตี</span></span></span><br />
<br />
ในหัวข้อก่อนหน้าเรามีคำแนะนำทิ้งท้ายว่าวิธีการแก้โค้ดในส่วนต่างๆ นั้น ไม่แนะนำอย่างยิ่ง สิ่งที่ผมต้องการจะสื่อจริงๆ นั่นคือ <span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">ไม่ควรเพิ่ม / ลบ / แก้ไข โค้ดต้นฉบับที่มีอยู่แล้วนั่นเอง</span></span> (ยกเว้น module Vocab ที่พออนุโลมได้) เพราะมันมีผลกระทบดังนี้<br />
<ol type="1" class="mycode_list"><li>สมมุติท่านแก้ส่วนต่างๆ ของสคริปต์เยอะมากกกกกกกกกกกกกก วันดีคืนดีอยู่ดีๆ เกมพัง รันแล้วแฮงก์ หาสาเหตุไม่ได้ ไม่รู้จะไปแก้ที่ไหน จะเอาโค้ดต้นฉบับมาทับโค้ดที่แก้ไปแล้วก็ไม่ได้ เพราะสิ่งที่เคยแก้ไว้ก็หาย ในวันนั้นเกมของท่านอาจได้ลงสุสานทันที<br />
</li>
<li>สมมุติท่านสร้างเกมหลายๆ เกม แล้วต้องการเอาระบบที่ท่านแก้บางส่วนไปใช้ในเกมอื่นๆ ของท่าน ท่านก็จะไม่รู้ว่าต้องเอาจาก script ไหนบ้าง<br />
</li>
<li>อนาคตหาก RPG Maker มีการอัพเดทแพทช์ (หวังว่านะ 555+) มีแก้สคริปต์ต่างๆ บางแห่ง ในวันนั้นท่านจะต้องเอา script ของเวอร์ชั่นใหม่มาทับของเก่า แต่ของเก่าท่านปรับแต่งแก้ไขไว้เยอะแยะ ดังนั้นจึงยากที่จะจัดการสิ่งที่ท่านได้แก้ไว้<br />
</li>
</ol>
อ้าว แล้วไม่แก้ที่โค้ดที่มี แล้วจะไปแก้ที่ไหน? คำถามนี้ต้องผุดในหัวของท่านแน่นอน<br />
ซึ่งคำตอบมีอยู่สองหนทางก็คือ <ul class="mycode_list"><li>การ overwrite script<br />
</li>
<li>การ overwrite script ด้วยวิธีการ alias method<br />
</li>
</ul>
ก่อนที่จะรู้จักทั้งสองอย่างด้านบน ต้องเข้าใจว่า class และ method คืออะไรเสียก่อน ซึ่งจะอธิบายให้เข้าใจคร่าวๆ เน้นเอาไปใช้งาน เพราะจริงๆ แล้วมันเป็นเรื่องที่ค่อนข้างซับซ้อนและเปิดคอร์สเรียนได้เป็นเทอมๆ เลย *0* [คนที่เขียนโปรแกรมเป็นอ่านแล้วอย่าเพิ่งหงุดหงิดนะครับ ผมเน้นอธิบายให้นำไปใช้ง่ายคร้าบ] <br />
<br />
ให้พิจารณาโค้ดด้านล่างนี้<br />
<img src="http://upic.me/i/4f/class.png" loading="lazy"  alt="[Image: class.png]" class="mycode_img" /><br />
<br />
โค้ดใน RGSS มักจะอยู่ในรูปแบบนี้เสมอ (ยกเว้นในส่วนของ Module จะเปลี่ยนจากคำว่า class เป็น module แทน) ซึ่งชั้นนอกจะเรียกว่า class และในคลาสจะประกอบไปด้วยสิ่งที่เรียกว่า method <br />
<br />
ตัวอย่างเช่น โค้ดบรรทัดที่ 9 โค้ด @energy = -20 นั้นอยู่ใน method ชื่อ run และอยู่ใน class ชื่อ Person หรือโค้ดบรรทัดที่ 21 นั้นอยู่ใน method ชื่อ go_forward และอยู่ใน class ชื่อ Car เป็นต้น พอจะดูออกแล้วใช่ไหมครับ ทีนี้อยากให้ท่านลองดู script ต่างๆ ที่มีใน script editor สังเกตว่าแทบทุกไฟล์จะมีรูปแบบเหมือนกับภาพตัวอย่างเลยใช่ไหมครับ นั่นคือมี class มี method<br />
<br />
ต่อมาอยากให้ท่านกด F11 แล้วในฝั่งซ้าย เลื่อนลงมาล่างๆ จะเจอกับส่วนที่เรียกว่า Materials ลองคลิกขวา ตรงคำว่า ( Insert here ) แล้วเลือก Insert จะได้ช่องเปล่าเพิ่มขึ้นมา 1 ช่อง ในส่วนของ Name ให้ตั้งชื่ออะไรก็ได้ จากตัวอย่างนี้ ให้ตั้งเป็น My Script ละกันครับ<br />
<br />
สิ่งที่ท่านได้ทำไปคือการสร้างไฟล์ใหม่ขึ้นมานั่นเอง ซึ่งเป็นไฟล์เปล่าๆ ที่จะใช้เขียน script อะไรก็ได้ลงไป เราจะใช้ที่ว่างใหม่นี้ในการเขียนโค้ดเพิ่มเติมโดยไม่ไปยุ่งกับโค้ดส่วนเก่าอีกเลย<br />
<br />
เมื่อเข้าใจกระจ่างแล้ว ย้อนกลับไปที่การ overwrite script และการ alias method ดีกว่า<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">การ Overwrite Script</span></span><br />
วิธีการนี้จะเป็นการเขียนโค้ดทับโค้ดเก่าแบบดื้อๆ เพื่อให้ตัวเกมอ่านโค้ดใหม่ของเราเป็นหลักแทนที่จะอ่านโค้ดเดิมที่มีอยู่ ซึ่งการที่จะ overwrite script ได้นั้นจำเป็นต้องรู้ว่าอยู่ใน method ไหนและอยู่ใน class อะไรเสมอ <br />
<br />
ตัวอย่างจากคำถามข้อ 2 ในหัวข้อที่ผ่านมา<br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม</span> อยากลบเมนูเซฟเกมในหน้าจอเมนูออกไปเลย ให้ไม่แสดงในหน้าจอเมนู<br />
<br />
เราจะไม่ลบ add_save_command เหมือนที่ผ่านมาแล้ว แต่ให้ท่านสังเกตว่า add_save_command นั้นอยู่ใน method อะไร และใน class  อะไร (อย่าเพิ่งอ่านต่อนะ ลองคิดเองก่อน หุหุ)<br />
<br />
ซึ่งจะพบว่าอยู่ใน method make_command_list และ class Window_MenuCommand &lt; Window_Command ใช่ไหมครับ (เครื่องหมาย &lt; คืออะไรไม่ต้องสนใจในจุดนี้ เอามันมาทั้งบรรทัด เหมือนเดิม อธิบายที่นี่ยาวแน่นอน *0*)<br />
<br />
ให้เราไปที่ script ที่เพิ่งสร้างขึ้นใน Materials เมื่อตะกี๊ แล้วเขียนโค้ดดังนี้<br />
[shcode=rails]<br />
class Window_MenuCommand &lt; Window_Command<br />
  def make_command_list<br />
    add_main_commands<br />
    add_formation_command<br />
    add_original_commands<br />
    add_game_end_command<br />
  end<br />
end<br />
[/shcode]<br />
<br />
สังเกตว่าเราดึง class และ method มาเขียนลงไฟล์ใหม่นั่นเอง และใน method ที่เขียนใหม่ของเรานั้นมีโค้ดเหมือนอันเก่าทุกประการ แต่ได้เอา add_save_command ออกไป (ต้องมีโค้ดใน method ส่วนเดิมให้ครบนำ สำคัญมาก เพราะเกมจะไม่อ่านโค้ดเดิมอีกแล้ว)<br />
<br />
เมื่อเรารันเกม เกมก็จะมาอ่าน method make_command_list ใน class Window_MenuCommand &lt; Window_Command ที่เราเขียนใหม่ แทนที่จะไปอ่านของเดิม<br />
<br />
ผลลัพธ์การรันเกมจะเหมือนตัวอย่างที่ทำอันที่แล้วทุกประการ<br />
<br />
นี่แหละที่เรียกว่า การ overwrite script ซึ่งการเขียน overwrite ใหม่นั้น ไม่จำเป็นว่าในคลาสต้องมีเพียง method เดียว อาจจะ overwrite โดยเขียนหลายๆ method ไว้ใน class เดียวเลยก็ได้ (หากแก้หลายที่) และที่สำคัญ อาจสถาปนา method ขึ้นใหม่ด้วยชื่อใหม่เองก็ได้ (แต่การเขียน method ขึ้นใหม่เองอาจยังไม่เหมาะกับมือใหม่ จะไม่กล่าวในบทความนี้)<br />
<br />
<span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">แล้วโค้ดเดิมไปไหน ทำไมจึงเป็นเช่นนั้น?</span></span><br />
<br />
หลักการของภาษา Ruby นั่นคือ หากเจอ class ซ้ำกัน หรือ method ซ้ำกันที่อยู่ใน class เดียวกัน มันจะใช้งานโค้ดที่อยู่ด้านล่างเป็นหลัก ซึ่งหากเราพิจารณาแล้ว script ส่วนของ Materials ที่เราเขียนเพิ่ม มันแทบจะอยู่ล่างสุดเลยใช่ไหมครับ มันจึงเป็นเหตุผลว่าทำไมโปรแกรมถึงจัดวางที่เขียนโค้ดให้เราด้านล่างนั่นเอง ^^<br />
<br />
นอกจากนี้ยังสามารถ overwrite โค้ดใน class นอก method ได้อีกด้วย แต่ช่างมันเต๊อะ ไว้จะเขียนให้ในบทความที่ advance กว่านี้นะคับ แหะๆ<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">การ Alias Method</span></span><br />
หลังจากที่รู้จักการ overwrite script ไปแล้ว ยังมีอีกสิ่งหนึ่งเรียกว่า การ alias method ซึ่งขอเกริ่นนำด้วยตัวอย่างโจทย์เลยละกันครับ<br />
<br />
<span style="font-weight: bold;" class="mycode_b">คำถาม:</span> อยากให้เลเวลอัพแล้วฟื้นฟูเลือดจนเต็ม<br />
ลองหาวิธีก่อนนะครับ อาจจะยังทำไม่ได้ไม่เป็นไร ลองมาดูเฉลยครับ<br />
<br />
ขอทำด้วยวิธีการ overwrite เหมือนอันที่แล้วเพื่อให้เห็นภาพก่อนครับ<br />
<br />
ข้อนี้มี keyword ตรง level up ลองนึกดูว่าอะไรที่สามารถ level up ได้ นั่นก็คือตัวละครนั่นเอง ซึ่งตัวละครใน RPG Maker จะใช้คำว่า Actor ซึ่งมี script ที่เข้าเค้าคือ Game_Actor (ไม่ใช่ Game_Actors นะ ดูดีๆ) เข้าไปแล้วหากโค้ดมีหลายบรรทัดลองกด Ctrl+F เพื่อหาเอาเลยครับ ลอง search ว่า level แล้วไล่ดูเรื่อยๆ จะพบ method ที่น่าสนใจคือ method level_up ประมาณบรรทัดที่ 426 งวดนี้จะไม่ได้แก้ข้อมูลด้านใน แต่ละเพิ่มคำสั่งเข้าไปใน method แทน ให้ทำการหา class ของ method นี้ด้วย เพื่อจะทำการเขียนโค้ด overwrite ใหม่<br />
<br />
ไปที่ โค้ดที่สร้างขึ้นใน Materials เหมือนเดิม ไฟล์เดิมก็ได้ครับ จากนั้นก็อปโค้ดส่วน method level_up ที่เราหามาได้ แล้วอย่าลืมใส่ class ที่หามาครอบด้วยนะ เขียนต่อโค้ดเก่าที่มีได้เลย (ไฟล์นึงจะมีกี่ overwrite ก็ได้ แต่หากเขียนโค้ดเยอะขึ้น แยกให้เป็นหมวดหมู่ก็ดีครับ) <br />
<br />
ทำแล้วได้เหมือนผมไหมครับ<br />
<br />
[shcode=rails]<br />
class Game_Actor &lt; Game_Battler<br />
  def level_up<br />
<br />
    # โค้ดเดิมก็อปมาใส่ใหม่<br />
    @level += 1<br />
    self.class.learnings.each do |learning|<br />
      learn_skill(learning.skill_id) if learning.level == @level<br />
    end<br />
<br />
    # โค้ดใหม่<br />
    @hp = mhp   #ตั้ง hp ของเรา ให้มีค่าเท่ากับ max hp <br />
    @mp = mmp   #ตั้ง mp ของเรา ให้มีค่าเท่ากับ max mp<br />
<br />
  end <br />
end <br />
[/shcode]<br />
<br />
@hp กับ @mp เป็นตัวแปรที่ใช้แทน hp, mp ปัจจุบันของตัวละครดังกล่าว ส่วน mhp, mmp เป็นตัวแปรอ้างถึง max hp, max mp ครับ (ส่วนรู้ได้ยังไงว่าหาจากไหน อาศัยประสบการณ์การแกะโค้ดและการหาข้อมูลจาก google เอาครับ หาเรื่อยๆ อ่านเรื่อยๆ เดี๋ยวก็เข้าสมองเองครับ หุหุ)<br />
<br />
สังเกตว่าการ overwrite นั้นจำเป็นต้องใส่โค้ดเก่าด้วยเสมอ (เพราะอย่าลืม มันไม่อ่านโค้ดเดิมอีกแล้ว) แล้วในข้อนี้เราแค่เติมโค้ดเพิ่มเข้าไปสองบรรทัด ซึ่งในการทำ overwrite นั้น มีข้อเสียอยู่เช่นกัน (แต่ยังไงก็ดีกว่าแก้โค้ดเดิมแน่นอนครับ)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ข้อเสียของการเขียน overwrite</span><br />
<ol type="1" class="mycode_list"><li>เราต้องเขียนโค้ดเก่าซ้ำๆ ซึ่งอาจเกิดปัญหาหากเผลอไปแก้โค้ดเก่าที่มี (ยกเว้นเจตนาแก้)<br />
</li>
<li>ในกรณีที่โหลดโค้ดของคนอื่นมาใช้ โค้ดอาจตีกันกับของเราได้<br />
</li>
</ol>
อธิบายข้อที่สองสักหน่อยละกัน ว่ามันตีกันยังไง สมมุติเราแก้โค้ดเลเวลอัพของเราให้มีเลือดเต็มตามตัวอย่างเมื่อกี๊ แล้วเรามีโค้ดของคนอื่นที่โหลดมาลงใน Material ด้วย แต่บังเอิ๊ญญญ โค้ดของคนอื่นที่โหลดมานั้นดันมีส่วนที่เขียนว่า หากเลเวลอัพแล้วได้ตัง 5000G ดังนี้<br />
<br />
[shcode=rails]<br />
class Game_Actor &lt; Game_Battler<br />
  def level_up<br />
    @level += 1<br />
    self.class.learnings.each do |learning|<br />
      learn_skill(learning.skill_id) if learning.level == @level<br />
    end<br />
    &#36;game_party.gain_gold(5000) # คนอื่นใส่โค้ดนี้เพิ่มมา<br />
  end <br />
end <br />
[/shcode]<br />
<br />
ลองทายดูสิครับว่า หากมีทั้งโค้ดของเรา และโค้ดของคนอื่นดังกล่าว ผลจะเป็นอย่างไรครับ...<br />
แน่นอนว่า จากกฎการ overwrite มันจะทำงานเฉพาะอันที่อยู่ล่างสุดใช่ไหมครับ ^^<br />
ดังนั้น หากโค้ดของเราอยู่ด้านล่าง เมื่อเลเวลอัพตัวละครก็จะเลือดเต็มเท่านั้น และหากโค้ดของคนอื่นอยู่ด้านล่าง เมื่อเลเวลอัพก็จะได้เงินเพิ่ม 5000G เท่านั้น...<br />
<br />
วิธีการ alias method จะมาแก้ปัญหาข้างบนนี้<br />
<br />
การประกาศ alias method หมายถึงการสร้าง method ใหม่ขึ้นมาให้มีโค้ดเหมือน method เดิม และสามารถตั้งชื่อ method ใหม่ที่ก็อปมาได้ โดยมีรูปแบบการเขียนดังนี้<br />
alias_method :copied_method_name, :current_method_name<br />
<br />
เช่น<br />
[shcode=rails]<br />
def run<br />
  p "Go go!"<br />
  p "Wow, very quickly."<br />
  p "Run Run Run!"<br />
end<br />
[/shcode]<br />
<br />
จากนั้นบรรทัดถัดมาผมเพิ่ม<br />
<br />
[shcode=rails]<br />
alias_method :run_copied, :run<br />
[/shcode]<br />
<br />
จากโค้ดด้านบน เป็นการ copy method run_copied เพิ่มมาอีกอัน และมีคำสั่งด้านในเหมือน method run ในปัจจุบัน ดังนั้น มันจะแอบไปเพิ่มโค้ดด้านล่างนี้ขึ้นมาเอง (เราไม่ต้องเขียนนะ)<br />
<br />
[shcode=rails]<br />
def run_copied<br />
  p "Go go!"<br />
  p "Wow, very quickly."<br />
  p "Run Run Run!"<br />
end<br />
[/shcode]<br />
<br />
แล้วมีประโยชน์อย่างไร<br />
สมมุติผมมีโค้ดด้านบนแล้ว ผมต้องการ overwrite method run ด้านบน ปรกติผมเขียนแบบนี้ใช่ไหม<br />
<br />
[shcode=rails]<br />
def run<br />
  p "Go go!"<br />
  p "Wow, very quickly."<br />
  p "Run Run Run!"<br />
  p "YEAHHHHHHHHHH!!!" # เพิ่มเข้ามา<br />
end<br />
[/shcode]<br />
<br />
เนื่องจากมีการ copy method ไปใส่ใน run_copied แล้ว ผมสามารถเขียนใหม่เป็นแบบนี้ได้<br />
<br />
[shcode=rails]<br />
def run<br />
  run_copied  # เรียก method ชื่อ run_copied<br />
  p "YEAHHHHHHHHHH!!!" # เพิ่มเข้ามา<br />
end<br />
[/shcode]<br />
<br />
ซึ่งหลักการทำงานจะเป็นดังนี้<br />
<img src="http://upic.me/i/4o/9untitled-3.jpg" loading="lazy"  alt="[Image: 9untitled-3.jpg]" class="mycode_img" /><br />
<br />
ในครั้งนี้ เราได้ทำการ override method run โดยใช้การเรียก method run_copied ด้านใน แล้วต่อด้วยคำสั่งที่ต้องการเพิ่ม ทำให้การ overwrite เราไม่จำเป็นต้องพิมพ์คำสั่งทั้งหมดที่อยู่ใน method run เดิมอีกต่อไป ซึ่งทำให้ลดความซ้ำซ้อนลงได้เป็นอย่างมาก<br />
<br />
ทีนี้มันแก้ปัญหาโค้ดตีกันกับชาวบ้านได้อย่างไร มาดูกันครับ<br />
กลับมาที่โค้ดเลเวลอัพเหมือนเดิม ผมแก้โค้ดของผมจากโค้ดเดิมเป็นอันนี้<br />
<br />
[shcode=rails]<br />
class Game_Actor &lt; Game_Battler<br />
  alias_method :level_up_copied, :level_up<br />
  def level_up<br />
    level_up_copied<br />
    # โค้ดใหม่<br />
    @hp = mhp   #ตั้ง hp ของเรา ให้มีค่าเท่ากับ max hp <br />
    @mp = mmp   #ตั้ง mp ของเรา ให้มีค่าเท่ากับ max mp<br />
  end <br />
end <br />
[/shcode]<br />
<br />
แล้วผมเอาไปไว้ใต้โค้ดของคนอื่น (ที่เลเวลอัพแล้วเพิ่ม 5000G) <span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">ย้ำว่าเอาไว้ข้างใต้นะครับ!</span></span><br />
ลองรันเกมดู จะพบว่าเมื่อเลเวลอัพ เราจะได้ทั้งเงิน 5000G และเลือดตัวละครที่เลเวลอัพเต็มไปพร้อมกัน<br />
<br />
เพราะอะไร ฝากไปคิดเป็นการบ้านนะครับ <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /> <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /> <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
ฝากการบ้านอีกข้อครับ ถ้าหากเราเอาโค้ดของเราไว้ด้านบนโค้ดของคนอื่น (ที่เลเวลอัพแล้วเพิ่ม 5000G)  แทนล่ะ จะเกิดอะไรขึ้น เพราะอะไร <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
โอโหวววว alias method ดีขนาดนี้ ทำไมไม่ใช้มันทุกครั้งไปเลย<br />
แม้ว่าการแก้ปัญหาด้วยวิธีการ alias method นั้นจะเป็นไปได้ด้วยดี แต่ว่ามันมีข้อจำกัดคือ เราสามารถใช้วิธีได้ หากเป็นกรณีที่เราแทรกโค้ดเพิ่มเท่านั้น เราไม่สามารถลบของได้เลย<br />
<br />
เช่น จากคำถามเมื่อปีมะโว้ ถ้าเราต้องการเอาเมนูเซฟออก ก็ไม่สามารถใช้วิธี alias method ได้ เพราะเราต้อง ลบโค้ดบางส่วนออกจากของเดิมนั่นเอง (แต่จริงๆ มันก็ได้แหละ แต่อาจจะตองใช้กระบวนท่าซับซ้อน)<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">สรุปข้อดีของการ overwrite script</span></span><ul class="mycode_list"><li>ง่ายต่อการตรวจบั๊ก<br />
</li>
<li>หากเจอ error ในเกม จนเกมพัง หาสาเหตุไม่เจอ อย่างมากก็แค่นำ script ในส่วน material ออกให้หมด หรือเอาออกเป็นตัวๆ เพื่อหาสาเหตุ<br />
</li>
<li>เพียงแค่ Copy Paste ไฟล์ที่ท่านเขียนเพิ่มใน Materials ก็สามารถเอาไปใช้กี่เกมก็ได้<br />
</li>
<li>หากเขียนจนคล่องแล้ว สามารถรวบรวมสคริปต์เป็นไฟล์เดียวแล้วแจกคนอื่นได้ เหมือนกับที่คนอื่นเขียน script แจกทุกวันนี้นั่นเอง<br />
</li>
<li>ไม่ต้องกลัวปัญหาเรื่อง RPG Maker อัพเดต (แต่อาจมีปัญหาหาก RPG Maker ดันไปแก้ script ที่เรา overwrite แต่ถ้าใช้ alias method ได้จะปราศจากปัญหาทั้งปวง)<br />
</li>
</ul>
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">สรุป</span></span><ul class="mycode_list"><li>หากเป็นไปได้ ให้ใช้ alias method เอาไว้ก่อนเลย เพราะนอกจากโค้ดจะสะอาด ไม่ตีกันแล้ว ยังแสดงถึงมารยาทที่ดีในการเขียนโค้ดเพื่อนำไปแจกผู้อื่นด้วย เพราะเราการันตีได้ว่าโค้ดของเราจะไม่ไปทับของคนอื่นอย่างแน่นอน<br />
</li>
<li>ถ้าใช้ไม่ได้จริงๆ ค่อยเขียน overwrite แบบธรรมดา แม้อาจจะเกิดปัญหาโค้ดตีกันกับโค้ดคนอื่นหากนำไปแจกผู้อื่น แต่มันก็เป็นเรื่องช่วยไม่ได้จริงๆ<br />
</li>
<li>จงจำเอาไว้ว่าไม่ควรไปแตะต้องโค้ดเหนือส่วน Material (ยกเว้น module Vocab พออนุโลม) ควรใช้วิธี overwrite ให้ติดเป็นนิสัยนะครับ อย่าคิดว่าแก้นิดหน่อยแก้ทับโค้ดเดิมก็ได้ เพราะมันจะทำให้ปัญหาบานปลายภายหลัง ลองสังเกตบอร์ดต่างประเทศดูครับ มีคนมาขอ script แม้จะแก้บรรทัดเดียวเขาก็ตอบด้วยการใช้วิธี overwrite แล้วไปใส่ใน Materials ครับ<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">สรุปทั้งหมด</span></span><br />
สิ่งที่บทความนี่ต้องการสื่อคือ บอกแนวทางการโม script และการเขียน script ให้เป็นระเบียบ ดังนั้นหากอ่านจบแล้วยังรู้สึกว่าโมอะไรไม่ได้เลย อย่าเสียใจหรือท้อแท้นะครับ เพราะสิ่งที่ท่านได้รับในบทความนี้คือพื้นฐาน แนวทางและทฤษฎี ยังไม่ได้ลองปฏิบัติก็ไม่แปลกที่ยังทำไม่ได้ครับ อนึ่ง สังเกตว่าสิ่งที่แก้ในบทความนี้นั้น มักจะเป็นการ เดา เดา และเดา ใช่ครับ <span style="color: #FF0000;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">การแก้โค้ดของคนอื่นไม่ใช่เรื่องง่าย</span></span> ไม่ว่าจะเป็น RGSS หรือโค้ดภาษาอะไรในโลกก็ตาม ดังนั้นหากเป็นครั้งแรกที่ท่านทำอะไรแบบนี้แล้วไม่รู้เรื่อง งง ก็อย่าแปลกใจครับ อาศัยประสบการณ์ฝึกฝนเอาครับ เราฟันธงไม่ได้หรอกว่าโค้ดส่วนไหนคืออะไร แต่เนื่องจากโครงสร้างที่ผู้สร้าง RGSS ออกแบบมาดีมาก รวมถึงมีคอมเมนต์สีเขียวที่อ่านเข้าใจง่าย เชื่อผมว่า ฝึกไม่นานครับ ^^<br />
<br />
และแน่นอนว่า ท่านก็อาจไม่รู้เหมือนกันว่าจะเก็บประสบการณ์จากไหน เพราะไม่รู้จะฝึกอย่างไร ในจุดนี้หากมีคนสนใจบทความนี้เป็นจำนวนหนึ่ง ผมจะตั้งกระทู้ใหม่เรื่อยๆ เป็น WORKSHOP ให้ทำ ตั้งแต่การตั้งโจทย์ แนวคิด วิธีแก้ไขปัญหา ไปจนถึงการเขียนโค้ดทุกขั้นตอน ดังนั้นไม่ต้องกลัวครับ ผมมีโจทย์มาให้ฝึกแน่นอน ^^<br />
<br />
และผมยังคงบอกได้คำเดิมว่า เนื้อหาในบทความนี้เป็นเพียงเนื้อหาเบื้องต้นเท่านั้น ในการฝึกช่วงแรกๆ อย่าไปโมอะไรที่มันหลุดโลกเกินไป เพราะในบางเคสนั้น การเดาโค้ดอาจต้องกระโดดไปมาดู 4-5 ไฟล์ถึงจะเข้าใจว่าโค้ดทำงานอย่างไร ทำไม่ได้จะท้อเปล่าๆ ซึ่งหากมีเวลาว่างพอ ผมจะมาเขียนบทความในส่วนของเทคนิคการเดาโค้ดแบบกระโดดข้ามไฟล์อีกครั้งครับ ตอนนี้เอาส่วนนี้ให้แม่นก่อนละกันนะคร้าบ<br />
<br />
แต่ถ้ามั่นใจว่าทำได้ ลุยเลยครับผม!<br />
<br />
สุดท้ายนี้ ขอให้สนุกกับการเขียนโค้ดทุกคนครับ <img src="https://irpg.in.th/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">แบบฝึกหัด</span></span><br />
ทุกข้อต้องใช้วิธีการ overwrite / alias method ตามความเหมาะสม<br />
ให้สร้างโปรเจกต์ใหม่ขึ้นมา โดยไม่ต้องใส่ script อื่นใด<br />
<ol type="1" class="mycode_list"><li>จากคำถามสามข้อที่ผ่านมาในหัวข้อ "แนวคิดในการโม script" จงทำให้อยู่ในรูป overwrite / alias method ตามความเหมาะสม<br />
</li>
<li>ในหน้าจอโหลดเกม เซฟเกม จะมีการไล่ไฟล์โดยมีข้อความ File 1, File 2, ... อยากเปลี่ยนเป็น Slot 1, Slot 2, ... ต้องทำอย่างไร<br />
</li>
<li>จำนวนช่องเซฟเกมมีมากเกินไป อยากให้เหลือ 8 ช่องพอ<br />
</li>
<li>โดยปกติแล้ว การขายไอเท็มจะขายได้ในราคาครึ่งหนึ่งของราคาซื้อ รู้สึกว่ามันน้อยเกินไปจังเลย อยากให้ขายได้ในราคา 75% ของราคาซื้อ แก้อย่างไรดีน้า...<br />
</li>
<li>ในหน้าจอเปลี่ยนชื่อตัวละคร เมื่อกดปุ่ม Page แล้วมันจะพาไปยังหน้าภาษา Latin อื่นๆ ที่ไม่ใช่ภาษาอังกฤษ (ลองดูได้) ไม่อยากได้หน้านั้นเลย ต้องทำอย่างไร<br />
</li>
<li>ในฉากต่อสู้ทั่วไป สามารถกด Escape เพื่อหนีศัตรู ซึ่งเดิมจะมีโอกาสที่จะหนีไม่พ้น อยากทราบว่าการหนีพ้นหรือไม่พ้นขึ้นกับปัจจัยใด และถ้าหากต้องการให้โอกาสหนีเป็น 100% จะต้องทำอย่างไร<br />
</li>
<li>อยากให้ตัวละครเดินกลับทิศกับลูกศรคีย์บอร์ด (กดขึ้นเดินลง กดซ้ายเดินขวา เป็นต้น) ทำอย่างไร<br />
</li>
<li>อยากให้การแสดงชื่อแผนที่เป็นแบบนี้ ทำอย่างไร (ปกติจะอยู่ริมซ้าย) (เฉพาะ RGSS3)<br />
<img src="http://upic.me/i/qb/10capture.jpg" loading="lazy"  alt="[Image: 10capture.jpg]" class="mycode_img" /><br />
</li>
</ol>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ภาษาไทยเป็นกล่องสี่เหลี่ยม]]></title>
			<link>https://irpg.in.th/thread-2424.html</link>
			<pubDate>Thu, 04 Jun 2015 19:56:30 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2892">Last0rder</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2424.html</guid>
			<description><![CDATA[เอาสคริปต์ของต่างชาติมาใส่แล้วตรงไหนที่เป็นภาษาไทยมันเป็นสี่เหลี่ยมหมดเลยค่ะ<br />
ตามรูปเป็นสคริปต์ MOG Scene Status Eva V1.2 ของ Moghunter <br />
<br />
<img src="http://i7.tagstat.com/p1/0/SVfb8BwwCuaBfw4QGg1sxGnbXMm0qAHPgWE0TOwBFTPAQcZfIt6Oug==.png" loading="lazy"  alt="[Image: SVfb8BwwCuaBfw4QGg1sxGnbXMm0qAHPgWE0TOwB...6Oug==.png]" class="mycode_img" /><br />
<br />
<br />
แต่ตอนที่ใช้คำสั่งแสดงข้อความก็เป็นปกติดี <br />
<br />
<img src="http://i7.tagstat.com/p1/0/kvKDrrOxHZ0T0dm5kP4LUeIQqdC8Mws6bbY7mMWpZdmP3BVb7tsL1Q==.png" loading="lazy"  alt="[Image: kvKDrrOxHZ0T0dm5kP4LUeIQqdC8Mws6bbY7mMWp...sL1Q==.png]" class="mycode_img" /><br />
<br />
<br />
------------------------------------<br />
<br />
หาทางแก้เบื้องต้นตามกระทู้ <a href="http://irpg.in.th/thread-393.html" target="_blank" rel="noopener" class="mycode_url">รวมปัญหาเกี่ยวกับ ภาษา ( พิมพ์ไทยไม่ได้ ไม่เห็นตัวหนังสือ สระไม่ครบ)</a> มาแล้วแต่ก็ไม่ได้ผลค่ะ <br />
(สำหรับวิธีแก้ในข้อที่ 1.พิมพ์ภาษาไทยแล้วไม่มีอักษรขึ้น ไม่มีสระ หรือสระลอย ลิงค์เสียนะคะ)<br />
<br />
รบกวนใครพอมีทางแก้ช่วยแนะนำหน่อยนะคะ <img src="https://i.imgur.com/TkF5Szv.gif" alt="ตายยย" title="ตายยย" class="smilie smilie_166" /><br />
ตัวโปรแกรมที่ใช้เป็น Version 1.03]]></description>
			<content:encoded><![CDATA[เอาสคริปต์ของต่างชาติมาใส่แล้วตรงไหนที่เป็นภาษาไทยมันเป็นสี่เหลี่ยมหมดเลยค่ะ<br />
ตามรูปเป็นสคริปต์ MOG Scene Status Eva V1.2 ของ Moghunter <br />
<br />
<img src="http://i7.tagstat.com/p1/0/SVfb8BwwCuaBfw4QGg1sxGnbXMm0qAHPgWE0TOwBFTPAQcZfIt6Oug==.png" loading="lazy"  alt="[Image: SVfb8BwwCuaBfw4QGg1sxGnbXMm0qAHPgWE0TOwB...6Oug==.png]" class="mycode_img" /><br />
<br />
<br />
แต่ตอนที่ใช้คำสั่งแสดงข้อความก็เป็นปกติดี <br />
<br />
<img src="http://i7.tagstat.com/p1/0/kvKDrrOxHZ0T0dm5kP4LUeIQqdC8Mws6bbY7mMWpZdmP3BVb7tsL1Q==.png" loading="lazy"  alt="[Image: kvKDrrOxHZ0T0dm5kP4LUeIQqdC8Mws6bbY7mMWp...sL1Q==.png]" class="mycode_img" /><br />
<br />
<br />
------------------------------------<br />
<br />
หาทางแก้เบื้องต้นตามกระทู้ <a href="http://irpg.in.th/thread-393.html" target="_blank" rel="noopener" class="mycode_url">รวมปัญหาเกี่ยวกับ ภาษา ( พิมพ์ไทยไม่ได้ ไม่เห็นตัวหนังสือ สระไม่ครบ)</a> มาแล้วแต่ก็ไม่ได้ผลค่ะ <br />
(สำหรับวิธีแก้ในข้อที่ 1.พิมพ์ภาษาไทยแล้วไม่มีอักษรขึ้น ไม่มีสระ หรือสระลอย ลิงค์เสียนะคะ)<br />
<br />
รบกวนใครพอมีทางแก้ช่วยแนะนำหน่อยนะคะ <img src="https://i.imgur.com/TkF5Szv.gif" alt="ตายยย" title="ตายยย" class="smilie smilie_166" /><br />
ตัวโปรแกรมที่ใช้เป็น Version 1.03]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ต้องการscriptหาค่าตัวแปรครับ]]></title>
			<link>https://irpg.in.th/thread-2423.html</link>
			<pubDate>Wed, 03 Jun 2015 15:55:53 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2887">Boyss</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2423.html</guid>
			<description><![CDATA[ยกตัวอย่างเช่น <br />
&#36;game_player.x<br />
&#36;game_player.y<br />
จะได้ค่าตำแหน่ง x และ y ใน map ซึ่งนำมาเก็บในตัวแปรได้<br />
<br />
ผมต้องการหาค่าตัวแปรดังนี้ครับ<br />
<br />
-ชื่อของอาวุธที่ฮีโร่ใส่อยู่ปัจจุบัน<br />
-ชื่อของเกราะที่ฮีโร่ใส่อยู่ปัจจุบัน<br />
<br />
ขอบคุณมากครับ]]></description>
			<content:encoded><![CDATA[ยกตัวอย่างเช่น <br />
&#36;game_player.x<br />
&#36;game_player.y<br />
จะได้ค่าตำแหน่ง x และ y ใน map ซึ่งนำมาเก็บในตัวแปรได้<br />
<br />
ผมต้องการหาค่าตัวแปรดังนี้ครับ<br />
<br />
-ชื่อของอาวุธที่ฮีโร่ใส่อยู่ปัจจุบัน<br />
-ชื่อของเกราะที่ฮีโร่ใส่อยู่ปัจจุบัน<br />
<br />
ขอบคุณมากครับ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[บัค หลังจากพยายามปรับแต่งเมนู]]></title>
			<link>https://irpg.in.th/thread-2411.html</link>
			<pubDate>Fri, 29 May 2015 19:41:35 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2892">Last0rder</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2411.html</guid>
			<description><![CDATA[คือลองทดสอบใส่คำสั่งในเมนูลงไปเพิ่ม 1 คำสั่ง ทำตามกระทู้อันนี้สอนค่ะ &gt;&gt; <a href="http://irpg.in.th/thread-299.html" target="_blank" rel="noopener" class="mycode_url">การเพิ่มคำสั่งใหม่ในเมนู</a><br />
พอลองทดสอบเกมปรากฏว่าเกิดบัค <br />
1) คำสั่ง Status กดเข้าไม่ได้ <br />
<br />
2) คำสั่ง Save กับ End พอกดเข้าไปแล้วกดยกเลิกย้อนกลับมา ตัวเคอเซอร์มันจะอยู่ผิดตำแหน่ง<br />
<br />
<br />
ควรจะแก้ยังไงดีคะ<br />
<br />
<a href="http://www.mediafire.com/download/rt9ld8nlgc4uvd9/Project2.rar" target="_blank" rel="noopener" class="mycode_url">โปรเจคที่ลองทดสอบแล้วพบปัญหา</a><br />
<br />
---------------------------------<br />
<br />
<img src="http://i3.tagstat.com/p1/0/9WMjcJUzLU_N7699IfdjuiufObo7mo1OsIawxJCfcBs6-GFdKnWDcw==.png" loading="lazy"  alt="[Image: 9WMjcJUzLU_N7699IfdjuiufObo7mo1OsIawxJCf...WDcw==.png]" class="mycode_img" /><br />
<br />
ขอถามเรื่องเมนูเพิ่มอีก 2 อย่างนะคะ <br />
1) ตามรูปภาพเฉพาะในกรอบสีแดง สามารถขยับปรับตำแหน่ง X,Y ของแต่ละคำสั่งได้มั้ยคะ เพราะเท่าที่ลองผิดลองถูกเองเจอแต่ที่ปรับของ Steps, Play Time, Gold, Status Window แต่ในส่วนที่ตีกรอบสีแดงไว้หาไม่เจอ อยากจะปรับให้แต่ละคำสั่งมันวางอยู่ห่างกันมากกว่านี้<br />
<br />
2) ปรับแต่งฟอร์นและวินโดว์สกินเฉพาะในกรอบสีแดงได้รึเปล่าคะ]]></description>
			<content:encoded><![CDATA[คือลองทดสอบใส่คำสั่งในเมนูลงไปเพิ่ม 1 คำสั่ง ทำตามกระทู้อันนี้สอนค่ะ &gt;&gt; <a href="http://irpg.in.th/thread-299.html" target="_blank" rel="noopener" class="mycode_url">การเพิ่มคำสั่งใหม่ในเมนู</a><br />
พอลองทดสอบเกมปรากฏว่าเกิดบัค <br />
1) คำสั่ง Status กดเข้าไม่ได้ <br />
<br />
2) คำสั่ง Save กับ End พอกดเข้าไปแล้วกดยกเลิกย้อนกลับมา ตัวเคอเซอร์มันจะอยู่ผิดตำแหน่ง<br />
<br />
<br />
ควรจะแก้ยังไงดีคะ<br />
<br />
<a href="http://www.mediafire.com/download/rt9ld8nlgc4uvd9/Project2.rar" target="_blank" rel="noopener" class="mycode_url">โปรเจคที่ลองทดสอบแล้วพบปัญหา</a><br />
<br />
---------------------------------<br />
<br />
<img src="http://i3.tagstat.com/p1/0/9WMjcJUzLU_N7699IfdjuiufObo7mo1OsIawxJCfcBs6-GFdKnWDcw==.png" loading="lazy"  alt="[Image: 9WMjcJUzLU_N7699IfdjuiufObo7mo1OsIawxJCf...WDcw==.png]" class="mycode_img" /><br />
<br />
ขอถามเรื่องเมนูเพิ่มอีก 2 อย่างนะคะ <br />
1) ตามรูปภาพเฉพาะในกรอบสีแดง สามารถขยับปรับตำแหน่ง X,Y ของแต่ละคำสั่งได้มั้ยคะ เพราะเท่าที่ลองผิดลองถูกเองเจอแต่ที่ปรับของ Steps, Play Time, Gold, Status Window แต่ในส่วนที่ตีกรอบสีแดงไว้หาไม่เจอ อยากจะปรับให้แต่ละคำสั่งมันวางอยู่ห่างกันมากกว่านี้<br />
<br />
2) ปรับแต่งฟอร์นและวินโดว์สกินเฉพาะในกรอบสีแดงได้รึเปล่าคะ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ขอความช่วยเหลือเกี่ยวกับ Script หน่อยครับ]]></title>
			<link>https://irpg.in.th/thread-2347.html</link>
			<pubDate>Wed, 29 Apr 2015 22:54:11 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=2786">Aranos</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2347.html</guid>
			<description><![CDATA[มีปัญหาเกี่ยวกับScript อยู่2อย่างอะครับ(ดูได้ที่ Video ด้านล่างครับ)<br />
1.<a href="http://forums.rpgmakerweb.com/index.php?/topic/514-woratana-multiple-fogs-for-ace/" target="_blank" rel="noopener" class="mycode_url">Woratana multiple Fog's</a> - คือเวลากำหนด Fog ในฉากแล้วมันไม่เคลื่อนที่อะครับต้องวาปไปแมพอื่นก่อนมันถึงจะขยับ มีวิธีแก้ไหมครับ<br />
<br />
2.<a href="http://forums.rpgmakerweb.com/index.php?/topic/29231-theolized-sideview-battle-system-version-14-patch/" target="_blank" rel="noopener" class="mycode_url">Theolized Sideview Battle System</a> - เวลาที่เราตีมอนตายอะครับมอนมันจะหายไปก่อนไม่ขึ้นanimation ตอนตาย(แบบที่ตัวมอนมันจะกลายเป็นสีแดงแล้วหายไป) ต้องรอให้Hero กลับไปที่ตำแหน่งเดิมก่อนมันถึงจะขึ้น animation มีวิธีแก้ไหมครับ ตอนลอง Demo ของเขามันก็ไม่เป็นงี้ (สคริปกดดูได้ที่ตัวชื่อScriptเลยนะครับ)(อธิบายเข้าใจไหมหว่า ถ้าไม่เข้าใจ ลองดูที่ Video ได้นะครับ<img src="http://i.imgur.com/zN4NOqu.gif" alt="ทำหน้าเหยาหมิง" title="ทำหน้าเหยาหมิง" class="smilie smilie_38" />)<br />
<br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/Xl0oXfPz868" frameborder="0" allowfullscreen="true"></iframe>]]></description>
			<content:encoded><![CDATA[มีปัญหาเกี่ยวกับScript อยู่2อย่างอะครับ(ดูได้ที่ Video ด้านล่างครับ)<br />
1.<a href="http://forums.rpgmakerweb.com/index.php?/topic/514-woratana-multiple-fogs-for-ace/" target="_blank" rel="noopener" class="mycode_url">Woratana multiple Fog's</a> - คือเวลากำหนด Fog ในฉากแล้วมันไม่เคลื่อนที่อะครับต้องวาปไปแมพอื่นก่อนมันถึงจะขยับ มีวิธีแก้ไหมครับ<br />
<br />
2.<a href="http://forums.rpgmakerweb.com/index.php?/topic/29231-theolized-sideview-battle-system-version-14-patch/" target="_blank" rel="noopener" class="mycode_url">Theolized Sideview Battle System</a> - เวลาที่เราตีมอนตายอะครับมอนมันจะหายไปก่อนไม่ขึ้นanimation ตอนตาย(แบบที่ตัวมอนมันจะกลายเป็นสีแดงแล้วหายไป) ต้องรอให้Hero กลับไปที่ตำแหน่งเดิมก่อนมันถึงจะขึ้น animation มีวิธีแก้ไหมครับ ตอนลอง Demo ของเขามันก็ไม่เป็นงี้ (สคริปกดดูได้ที่ตัวชื่อScriptเลยนะครับ)(อธิบายเข้าใจไหมหว่า ถ้าไม่เข้าใจ ลองดูที่ Video ได้นะครับ<img src="http://i.imgur.com/zN4NOqu.gif" alt="ทำหน้าเหยาหมิง" title="ทำหน้าเหยาหมิง" class="smilie smilie_38" />)<br />
<br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/Xl0oXfPz868" frameborder="0" allowfullscreen="true"></iframe>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ตามหาสคริปต์ครับ Sound STEP 2.5]]></title>
			<link>https://irpg.in.th/thread-2164.html</link>
			<pubDate>Sun, 09 Nov 2014 21:58:24 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=803">jojo741963</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-2164.html</guid>
			<description><![CDATA[<a href="http://community.thaiware.com/index.php/topic/330739-updated-sound-step-20-auoaaueaeoaaoecaeaoui/" target="_blank" rel="noopener" class="mycode_url">http://community.thaiware.com/index.php/...oecaeaoui/</a><br />
<br />
คือยังมีท่านใดครอบครองสคริปต์ Sound STEP เวอร์ชั่น 2.5 อยู่บ้างไหมครับ<br />
เพราะไม่ได้มีการแจกกันโดยตรง เพียง pm ให้กัน<br />
<br />
ถ้าผู้ใดยังมีติดอยู่กับตัว ขอความกรุณาด้วยครับ <img src="http://irpg.in.th/images/smilies/irpg/_mr.gif" alt="แมวร้อง" title="แมวร้อง" class="smilie smilie_22" /><br />
<br />
//ตอนแรกก็ถามในแชทผิดไปรอบหนึ่งล่ะ]]></description>
			<content:encoded><![CDATA[<a href="http://community.thaiware.com/index.php/topic/330739-updated-sound-step-20-auoaaueaeoaaoecaeaoui/" target="_blank" rel="noopener" class="mycode_url">http://community.thaiware.com/index.php/...oecaeaoui/</a><br />
<br />
คือยังมีท่านใดครอบครองสคริปต์ Sound STEP เวอร์ชั่น 2.5 อยู่บ้างไหมครับ<br />
เพราะไม่ได้มีการแจกกันโดยตรง เพียง pm ให้กัน<br />
<br />
ถ้าผู้ใดยังมีติดอยู่กับตัว ขอความกรุณาด้วยครับ <img src="http://irpg.in.th/images/smilies/irpg/_mr.gif" alt="แมวร้อง" title="แมวร้อง" class="smilie smilie_22" /><br />
<br />
//ตอนแรกก็ถามในแชทผิดไปรอบหนึ่งล่ะ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[พอจะมีสคริปต์ซูมเข้าซูมออกในฉากต่อสู้ไหมครับ]]></title>
			<link>https://irpg.in.th/thread-1921.html</link>
			<pubDate>Sat, 31 May 2014 08:52:12 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=1391">motley</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-1921.html</guid>
			<description><![CDATA[เคยเห็นอยู่ในเกมๆนึงครับจำชื่อไม่ได้เเล้ว เพราะเคยเล่นนานมาก เวลาเข้าฉากต่อสู้เลือกคำสั่งโจมตี,ใช้สกิลมันจะซูมมุมกล้อง ซูมเข้า ซูมออกอ่ะครับ พอจะเก็ทไหมเนี่ย <img src="http://i.imgur.com/zN4NOqu.gif" alt="ทำหน้าเหยาหมิง" title="ทำหน้าเหยาหมิง" class="smilie smilie_38" />]]></description>
			<content:encoded><![CDATA[เคยเห็นอยู่ในเกมๆนึงครับจำชื่อไม่ได้เเล้ว เพราะเคยเล่นนานมาก เวลาเข้าฉากต่อสู้เลือกคำสั่งโจมตี,ใช้สกิลมันจะซูมมุมกล้อง ซูมเข้า ซูมออกอ่ะครับ พอจะเก็ทไหมเนี่ย <img src="http://i.imgur.com/zN4NOqu.gif" alt="ทำหน้าเหยาหมิง" title="ทำหน้าเหยาหมิง" class="smilie smilie_38" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[XS - Quick Items ใช้ยังไงครับ]]></title>
			<link>https://irpg.in.th/thread-1834.html</link>
			<pubDate>Fri, 02 May 2014 20:14:01 +0700</pubDate>
			<dc:creator><![CDATA[<a href="https://irpg.in.th/member.php?action=profile&uid=738">Accretia</a>]]></dc:creator>
			<guid isPermaLink="false">https://irpg.in.th/thread-1834.html</guid>
			<description><![CDATA[<a href="http://forums.rpgmakerweb.com/index.php?/topic/6073-xs-quick-items/" target="_blank" rel="noopener" class="mycode_url">http://forums.rpgmakerweb.com/index.php?...ick-items/</a><br />
<br />
ช่วยสอนวิธีใช้สคริปต์นี้กับ SASIV หน่อยครับ]]></description>
			<content:encoded><![CDATA[<a href="http://forums.rpgmakerweb.com/index.php?/topic/6073-xs-quick-items/" target="_blank" rel="noopener" class="mycode_url">http://forums.rpgmakerweb.com/index.php?...ick-items/</a><br />
<br />
ช่วยสอนวิธีใช้สคริปต์นี้กับ SASIV หน่อยครับ]]></content:encoded>
		</item>
	</channel>
</rss>