01-06-2016, 10:05 PM
บทความนี้เกิดจากการเรียบเรียง ผสมแนวคิดส่วนของผู้เขียน หากผิดพลาดประการใดขออภัย ณ ที่นี้ด้วยครับ
DS Homebrew คืออะไร
DS Homebrew เป็นซอร์ฟแวร์สำหรับเครื่องเล่นเกม นินเทนโดดีเอส ที่พัฒนาโดยไม่ใช้ Official Development Tools ของนิน จึงไม่สามารถนำมาใช้งานในเชิงพาณิชย์ได้ เนื่องจากไม่มี Official License จากทางนิน ส่วนใหญ่ถูกพัฒนาในลักษณะเป็นงานอดิเรกของโปรแกรมเมอร์ เมื่อตอบสนองความต้องการในฐานะแฟนเกม เพื่อเรียนรู้ระบบ หรือแม้แต่เพื่อเปิดช่องโหว่ของระบบก็มี
วิวัฒนาการการพัฒนา DS Homebrew
ช่วงแรกเริ่มนั้นไม่มีอะไรเลยจึงใช้วิธีการแกะชุดคำสั่งออกมาใช้อย่างเดียว(Re assembler) จากนั้นได้มีการรวบรวมคำสั่งต่างๆเข้าด้วยกันจนกลายมาเป็น Devkit Pro ในปัจจุบัน แต่ว่าตัว Devkit Pro นั้นเป็นเพียง Library เท่านั้น การพัฒนา DS Homebrew จึงมีแต่โปรแกรมเมอร์ที่ทำเป็นส่วนใหญ่ จนกระทั่งการมาของ
DS Game Maker (ปัจจุบัน Homebrew ส่วนใหญ่ก็ยังคงใช้ Devkit Pro อย่างเดียวอยู่ดี)
แนะนำ DS Game Maker
dsgamemaker.com
DS Game Maker เป็นซอร์ฟแวร์สำหรับพัฒนา DS Homebrew มีรูปแบบโปรแกรมเป็นแบบกราฟฟิก คล้าย Game Maker รุ่นเก่า เดิมทีขายในราคา 14.99$ ปัจจุบันตัวเต็มแจกฟรีในเว็บเลย
โปรแกรมจะเป็นแบบคลิก/ลาก/วาง ทำให้ผู้สร้างที่ไม่เคยใช้มาก่อนหรือไม่มีทักษะด้านโปรแกรมมิ่งสามารถใช้งานได้
ผลลัพธ์ที่ได้หลังจาก compile จะเป็นไฟล์ .nds ซึ่งสามารถนำไปใส่ตลับ Flash เพื่อเล่นบนเครื่องดีเอส หรือเล่น emulator อย่าง no$gba ก็ได้
ข้อมูลจำเพาะโดยย่อ ของ DS
1.จอล่างและบนของ DS มีความละเอียดเพียง 256x192
2.จอล่างเท่านั้นที่สามารถ Touch screen ได้
3.CPU เป็น ARM7 33 MHz (ในตระกูล DSi เป็น ARM9 67 MHz) โดยมี Ram 4 MB
4.ไฟล์ save ของตลับมีความจุ 256 KB
5.มี WiFi ในตัว
รายละเอียดเพิ่มเติม
หาอ่านวิธีใช้ได้ที่ dsgamemaker.com/help
หัวข้อพิเศษ (ตาม Request)
0.ปัญหาที่พบและข้อเสนอ
1.การเคลื่อนที่ตัวละคร (Request โดย ท่านอาร์ค)
การอ่านค่าตำแหน่ง x,y ของแต่ละ object นั้นสามารถทำได้ง่ายๆโดยการใช้ [X] และ [Y]
มาดูวิธีการกันดีกว่า
เคลื่อนที่ Player ด้วยปุ่มขึ้น/ลง/ซ้าย/ขวา
1.สร้าง Sprite Player ขึ้นมา
2.สร้าง Object Player
3.สร้าง Room
4.ทดลองรัน
DS Homebrew คืออะไร
DS Homebrew เป็นซอร์ฟแวร์สำหรับเครื่องเล่นเกม นินเทนโดดีเอส ที่พัฒนาโดยไม่ใช้ Official Development Tools ของนิน จึงไม่สามารถนำมาใช้งานในเชิงพาณิชย์ได้ เนื่องจากไม่มี Official License จากทางนิน ส่วนใหญ่ถูกพัฒนาในลักษณะเป็นงานอดิเรกของโปรแกรมเมอร์ เมื่อตอบสนองความต้องการในฐานะแฟนเกม เพื่อเรียนรู้ระบบ หรือแม้แต่เพื่อเปิดช่องโหว่ของระบบก็มี
วิวัฒนาการการพัฒนา DS Homebrew
ช่วงแรกเริ่มนั้นไม่มีอะไรเลยจึงใช้วิธีการแกะชุดคำสั่งออกมาใช้อย่างเดียว(Re assembler) จากนั้นได้มีการรวบรวมคำสั่งต่างๆเข้าด้วยกันจนกลายมาเป็น Devkit Pro ในปัจจุบัน แต่ว่าตัว Devkit Pro นั้นเป็นเพียง Library เท่านั้น การพัฒนา DS Homebrew จึงมีแต่โปรแกรมเมอร์ที่ทำเป็นส่วนใหญ่ จนกระทั่งการมาของ
DS Game Maker (ปัจจุบัน Homebrew ส่วนใหญ่ก็ยังคงใช้ Devkit Pro อย่างเดียวอยู่ดี)
แนะนำ DS Game Maker
dsgamemaker.com
DS Game Maker เป็นซอร์ฟแวร์สำหรับพัฒนา DS Homebrew มีรูปแบบโปรแกรมเป็นแบบกราฟฟิก คล้าย Game Maker รุ่นเก่า เดิมทีขายในราคา 14.99$ ปัจจุบันตัวเต็มแจกฟรีในเว็บเลย
โปรแกรมจะเป็นแบบคลิก/ลาก/วาง ทำให้ผู้สร้างที่ไม่เคยใช้มาก่อนหรือไม่มีทักษะด้านโปรแกรมมิ่งสามารถใช้งานได้
ผลลัพธ์ที่ได้หลังจาก compile จะเป็นไฟล์ .nds ซึ่งสามารถนำไปใส่ตลับ Flash เพื่อเล่นบนเครื่องดีเอส หรือเล่น emulator อย่าง no$gba ก็ได้
ข้อมูลจำเพาะโดยย่อ ของ DS
1.จอล่างและบนของ DS มีความละเอียดเพียง 256x192
2.จอล่างเท่านั้นที่สามารถ Touch screen ได้
3.CPU เป็น ARM7 33 MHz (ในตระกูล DSi เป็น ARM9 67 MHz) โดยมี Ram 4 MB
4.ไฟล์ save ของตลับมีความจุ 256 KB
5.มี WiFi ในตัว
รายละเอียดเพิ่มเติม
หาอ่านวิธีใช้ได้ที่ dsgamemaker.com/help
หัวข้อพิเศษ (ตาม Request)
0.ปัญหาที่พบและข้อเสนอ
- DS Game Maker และ Devkit Pro ต้องติดตั้งใน Drive C เท่านั้น
- DS Game Maker จะต้องรันในโหมด admin เท่านั้น (run as administrator)
- หากพบ error: too few arguments to function 'nitroFSInit'
สาเหตุ: เกิดจาก bug ใน toolchain version ใหม่ของ Devkit Pro
วิธีแก้: ไปที่เมนู Tools เลือก Game Setting... จากนั้นจะปรากฏหน้าต่าง ให้เอาเครื่องหมาย ถูก ออกจากตัวเลือก Perform NitroFS Initialize จากนั้นกด OK เป็นอันเสร็จ
- หากพบ In function `PA_WaitForVBL': หรือ In function `Set_Sprite': และ undefined reference to `DSGMPal0_Pal'
สาเหตุ: เกิดจากมีการเพิ่มหรือเปลี่ยนรูป Sprite แล้ว compiler หาไม่เจอ จึงทำการ link ไม่ได้
วิธีแก้: ไปที่เมนู Tools เลือก Advance จากนั้นเลือก Signify Graphics Change
- ทุกครั้งที่ทำการเพิ่มหรือเปลี่ยนไฟล์รูปภาพ/เสียง ของ Sprite, Background และ Sound
ต้องทำการ Signify Graphics/Sound Change ทุกครั้งเพื่อให้ compiler หาเจอ (จะทำก่อน compile หรือ test game ครั้งเดียวเลยก็ได้)
1.การเคลื่อนที่ตัวละคร (Request โดย ท่านอาร์ค)
การอ่านค่าตำแหน่ง x,y ของแต่ละ object นั้นสามารถทำได้ง่ายๆโดยการใช้ [X] และ [Y]
มาดูวิธีการกันดีกว่า
เคลื่อนที่ Player ด้วยปุ่มขึ้น/ลง/ซ้าย/ขวา
1.สร้าง Sprite Player ขึ้นมา
Show ContentSpoiler:
1.1 คลิกขวาที่รูป Folder Sprite เลือก Add Sprite จะปรากฎหน้าต่างสร้าง Sprite
คลิก File ถ้า 1 รูปแทน 1 เฟรม หรือคลิก Sheet ถ้าเป็น Sprite sheet (หลายๆเฟรมในภาพเดียว)
ในที่นี้จะใช้แบบ Sprite sheet
ภาพ Sprite โดย Antifarea Opengameart.org:Antifarea-RPG-Sprite
1.2 ถ้าเลือกแบบ Sheet จะมีหน้าต่างสำหรับตั้งค่า ขนาดและจำนวนเฟรม ตั้งแล้วกด Accept
1.3 จะปรากฎ Sprite ที่แบ่งเป็นเฟรมแล้ว กด Accept เพื่อบันทึก Sprite
คลิก File ถ้า 1 รูปแทน 1 เฟรม หรือคลิก Sheet ถ้าเป็น Sprite sheet (หลายๆเฟรมในภาพเดียว)
ในที่นี้จะใช้แบบ Sprite sheet
ภาพ Sprite โดย Antifarea Opengameart.org:Antifarea-RPG-Sprite
1.2 ถ้าเลือกแบบ Sheet จะมีหน้าต่างสำหรับตั้งค่า ขนาดและจำนวนเฟรม ตั้งแล้วกด Accept
1.3 จะปรากฎ Sprite ที่แบ่งเป็นเฟรมแล้ว กด Accept เพื่อบันทึก Sprite
Show ContentSpoiler:
2.1 คลิกขวาที่รูป Folder Object เลือก Add Object จะปรากฎหน้าต่างสร้าง Object ตั้งชื่อ Object (ตรงนี้เป็นความผิดพลาดของผมเองที่ลืมไปว่าทุกอย่างชื่อซ้ำกันไม่ได้) ตรง Sprite เลือก Sprite ที่สร้างมาและเลือกเฟรมเริ่มต้นที่ต้องการ(กดปุ่มลูกศรเพื่อเลือก)
2.2 มาที่ด้านล่างกด Add Event จะปรากฎหน้าต่าง Add Event เลือก Button Press (จะเป็นการตรวจสอบการกดปุ่ม โดยเงื่อนไขจะเป็นจริงเมื่อปุ่มถูกกดครั้งแรกครั้งเดีย การกดค้างไม่ทำให้เงื่อนไขนี้เป็นจริงต่อ) จากนั้นเลือก Up เราจะทำปุ่มกดขึ้นก่อน
2.3 มาที่ล่างซ้ายจะเห็นปุ่มคำสั่ง เราจะใช้ Pause Animation วิธีการคือคลิกคำสั่งดังกล่าวค้างไว้
แล้วลากมาวางไว้ที่พื้นที่ว่างด้านบน
2.4 จะปรากฎหน้าต่างตั้งค่าคำสั่ง ให้เลือกตรง Pause? เป็น False แล้วกด Okay (สำหรับเหตุผลที่ว่าทำไมต้องตั้งค่า Pause Animation จะบอกภายหลังนะครับ)
2.5 หากสำเร็จจะปรากฎคำสั่ง Pause Animation ที่พื้นที่ว่างด้านบน
2.6 คราวนี้มาดูคำสั่งตัวถัดไป Animate ใช้วิธีลากไปวางเหมือนเดิม (คำสั่งนี้คืแเหตุผลที่จะอธิบายว่า ทำไทต้องใช้ Button Press และ Pause Animation เนื่่องคำสั่งนี้จะทำให้ Sprite เกิดการ animate แบบวนไปเรื่อยไม่หยุดครับ ดังนั้นจึงไม่มีความจำเป็นในการสั่ง anime ซ้ำขณะกดปุ่มค้างและแน่นอนปัญหาที่ตามมาคือจะสั่งให้มันหยุุดยังไงเมื่อไม่มีการกดปุ่ม ตรงนี้แหละครับ Pause Animation แต่จะอธิบายอีกทีในขั้นตอนหลังๆนะครับ)
2.7 จะปรากฎหน้าต่างตั้งค่าคำสั่ง ให้ตั้งเฟรมเริ่มต้นสิ้นสุด (กลับไปดูที่ Sprite นะครับว่าเป็นเฟรมที่เท่าไหร่ถึงเท่าไหร่) ส่วน FPS แนะนำให้ตั้งเท่ากับจำนวนเฟรมที่ใช้ ในที่นี้คือ 3 เฟรม 0-2 แล้วกด Okay
2.8 หากถูกต้องจะปรากฎคำสั่งที่พื้นที่ว่างด้านบน ตรงนี้หากลำดับคำสั่งวางไม่ถูกต้องสามารถย้ายได้โดยกดที่ Select One (หากต้องการย้ายทีละคำสั่ง) หรือ Select Many (เลือกทีละหลายคำสั่ง)
2.9 ต่อมาสร้าง Event Button Held (ต่างจาก Press ตรงที่่หากกดค้างจะทำเรื่อยๆ)
2.10 ใส่คำสั่ง Set Object Position
2.11 จะปรากฎหน้าต่างตั้งค่าคำสั่ง ตรงนี้จะอธิบายซ้ำอีกครั้งนึง [X] จะใช้สำหรับอ่านค่าตำแหน่งแกน X ของวัตถุ ส่วน [Y] ก็คือแกน Y ประกอบกับตรง Appiles To เลือกเป็น this อยู่ก็คือตำแหน่งของวัตถุปัจจุบันที่เรากำลังสร้าง/แก้ไขอยู่นั่นเอง การกดปุ่มขึ้นจะทำให้วัตถุเคลื่อนที่ขึ้นหรือก็คือค่า Y ลดลงนั่นเอง
ดังนั้นเราจึงให้ X Position เป็น [X] ก็คือค่าเดิมของมัน ส่วน Y Position จะลดลง 1 คือ [Y] - 1
แล้วกด Okay
2.12 ต่อมาสร้าง Event Button Release (ตัวสุดท้ายแล้วครับ) ความหมายของมันคือ จะทำเมื่อปุ่มถูกปล่อย(จะทำครั้งเดียวเหมือน Press)
2.13 ใส่คำสั่ง Pause Animation ครับ ครั้งนี้ให้มีค่าเป็น true (คือให้หยุด animate นั่นเอง)
2.14 ใส่คำสั่ง Set Object Frame จุดประสงค์คือให้ Player กลับมาอยู่ในท่ายืนนิ่งในทิศทางที่มันหันอยู่ครับ
2.15 จะปรากฎหน้าต่างตั้งค่าคำสั่ง ตรงนี้ให้ตั้ง Frame Number เป็นเฟรมที่อยู่ในท่ายืนนิ่งทิศหันหน้าขึ้น (ในที่นี้คือเฟรม 1) แล้วกด Okay
2.16 หากเรียบร้อยจะเป็นดังภาพ
2.17 ทดลองทำจนครบทุกทิศทางดังรูป (การเดินจะเป็น 8 ทิศทางเนื่องจากปุ่มต่างๆ สามารถกดพร้อมกันได้ หากไม่ต้องการอาจตั้งตัวแปรมาตรวจสอบว่ามีปุ่มถูกกดหรือยัง หากมีแล้วจะไม่ทำพร้อมกัน แต่ผมจะไม่อธบายตรงนี้ลองไปประยุกต์เองดูนะครับ) จากนั้นกด Accept เพื่อบันทึก Object
2.2 มาที่ด้านล่างกด Add Event จะปรากฎหน้าต่าง Add Event เลือก Button Press (จะเป็นการตรวจสอบการกดปุ่ม โดยเงื่อนไขจะเป็นจริงเมื่อปุ่มถูกกดครั้งแรกครั้งเดีย การกดค้างไม่ทำให้เงื่อนไขนี้เป็นจริงต่อ) จากนั้นเลือก Up เราจะทำปุ่มกดขึ้นก่อน
2.3 มาที่ล่างซ้ายจะเห็นปุ่มคำสั่ง เราจะใช้ Pause Animation วิธีการคือคลิกคำสั่งดังกล่าวค้างไว้
แล้วลากมาวางไว้ที่พื้นที่ว่างด้านบน
2.4 จะปรากฎหน้าต่างตั้งค่าคำสั่ง ให้เลือกตรง Pause? เป็น False แล้วกด Okay (สำหรับเหตุผลที่ว่าทำไมต้องตั้งค่า Pause Animation จะบอกภายหลังนะครับ)
2.5 หากสำเร็จจะปรากฎคำสั่ง Pause Animation ที่พื้นที่ว่างด้านบน
2.6 คราวนี้มาดูคำสั่งตัวถัดไป Animate ใช้วิธีลากไปวางเหมือนเดิม (คำสั่งนี้คืแเหตุผลที่จะอธิบายว่า ทำไทต้องใช้ Button Press และ Pause Animation เนื่่องคำสั่งนี้จะทำให้ Sprite เกิดการ animate แบบวนไปเรื่อยไม่หยุดครับ ดังนั้นจึงไม่มีความจำเป็นในการสั่ง anime ซ้ำขณะกดปุ่มค้างและแน่นอนปัญหาที่ตามมาคือจะสั่งให้มันหยุุดยังไงเมื่อไม่มีการกดปุ่ม ตรงนี้แหละครับ Pause Animation แต่จะอธิบายอีกทีในขั้นตอนหลังๆนะครับ)
2.7 จะปรากฎหน้าต่างตั้งค่าคำสั่ง ให้ตั้งเฟรมเริ่มต้นสิ้นสุด (กลับไปดูที่ Sprite นะครับว่าเป็นเฟรมที่เท่าไหร่ถึงเท่าไหร่) ส่วน FPS แนะนำให้ตั้งเท่ากับจำนวนเฟรมที่ใช้ ในที่นี้คือ 3 เฟรม 0-2 แล้วกด Okay
2.8 หากถูกต้องจะปรากฎคำสั่งที่พื้นที่ว่างด้านบน ตรงนี้หากลำดับคำสั่งวางไม่ถูกต้องสามารถย้ายได้โดยกดที่ Select One (หากต้องการย้ายทีละคำสั่ง) หรือ Select Many (เลือกทีละหลายคำสั่ง)
2.9 ต่อมาสร้าง Event Button Held (ต่างจาก Press ตรงที่่หากกดค้างจะทำเรื่อยๆ)
2.10 ใส่คำสั่ง Set Object Position
2.11 จะปรากฎหน้าต่างตั้งค่าคำสั่ง ตรงนี้จะอธิบายซ้ำอีกครั้งนึง [X] จะใช้สำหรับอ่านค่าตำแหน่งแกน X ของวัตถุ ส่วน [Y] ก็คือแกน Y ประกอบกับตรง Appiles To เลือกเป็น this อยู่ก็คือตำแหน่งของวัตถุปัจจุบันที่เรากำลังสร้าง/แก้ไขอยู่นั่นเอง การกดปุ่มขึ้นจะทำให้วัตถุเคลื่อนที่ขึ้นหรือก็คือค่า Y ลดลงนั่นเอง
ดังนั้นเราจึงให้ X Position เป็น [X] ก็คือค่าเดิมของมัน ส่วน Y Position จะลดลง 1 คือ [Y] - 1
แล้วกด Okay
2.12 ต่อมาสร้าง Event Button Release (ตัวสุดท้ายแล้วครับ) ความหมายของมันคือ จะทำเมื่อปุ่มถูกปล่อย(จะทำครั้งเดียวเหมือน Press)
2.13 ใส่คำสั่ง Pause Animation ครับ ครั้งนี้ให้มีค่าเป็น true (คือให้หยุด animate นั่นเอง)
2.14 ใส่คำสั่ง Set Object Frame จุดประสงค์คือให้ Player กลับมาอยู่ในท่ายืนนิ่งในทิศทางที่มันหันอยู่ครับ
2.15 จะปรากฎหน้าต่างตั้งค่าคำสั่ง ตรงนี้ให้ตั้ง Frame Number เป็นเฟรมที่อยู่ในท่ายืนนิ่งทิศหันหน้าขึ้น (ในที่นี้คือเฟรม 1) แล้วกด Okay
2.16 หากเรียบร้อยจะเป็นดังภาพ
2.17 ทดลองทำจนครบทุกทิศทางดังรูป (การเดินจะเป็น 8 ทิศทางเนื่องจากปุ่มต่างๆ สามารถกดพร้อมกันได้ หากไม่ต้องการอาจตั้งตัวแปรมาตรวจสอบว่ามีปุ่มถูกกดหรือยัง หากมีแล้วจะไม่ทำพร้อมกัน แต่ผมจะไม่อธบายตรงนี้ลองไปประยุกต์เองดูนะครับ) จากนั้นกด Accept เพื่อบันทึก Object
Show ContentSpoiler:
3.1 ต่อไปทำการสร้าง Room หรือก็คือ Map นั่นเอง โดยสามารถใส่ background ได้ด้วยการกดไปที่ tab General ตรงที่เป็นช่องว่างๆให้เลือก background ที่ต้องการ (ในที่นี้ผมใส่เฉพาะจอล่างนะครับ) background ต้องสร้างมาก่อนแต่ไม่มีอะไรมากจึงไม่ขอพูดถึง
3.2 กดมาที่ tab Design ตรงนี้เราสามารถใส่ Object ที่ต้องการลงในฉากได้ ตรง Object to plot: เลือก Object Player จากนั้นคลิกตำแหน่งที่ต้องการวางในฉาก จะเห็นรูป Sprite ที่ตำแหน่งดังกล่าว
จากนั้นกด Accept เพื่อบันทึก Room
3.2 กดมาที่ tab Design ตรงนี้เราสามารถใส่ Object ที่ต้องการลงในฉากได้ ตรง Object to plot: เลือก Object Player จากนั้นคลิกตำแหน่งที่ต้องการวางในฉาก จะเห็นรูป Sprite ที่ตำแหน่งดังกล่าว
จากนั้นกด Accept เพื่อบันทึก Room
Show ContentSpoiler:
4.1 คลิกที่ปุ่ม Test Game เพื่อทดลองรัน (อีกปุ่มนึงจะเป็นปุ่ม Compile Game ซึ่งจะสร้างไฟล์ .nds ตัวจริงให้)
4.2 โปรแกรมจะ compile code (คนละความหมายกับ Compile Game ข้อกอนหน้า) ตรงนี้ถ้ามี error ให้กลับไปดูข้อ 0.ปัญหาที่พบและข้อเสนอแนะ)
4.3 ถ้าไม่มี error เมื่อกดคีย์ใดๆ โปรแกรมจะเปิด no$gba emulator พร้อมกับรันเกมของเราให้
4.4 ทดลองกดเดินดู หากทำงานถูกต้องเป็นอันเสร็จขั้นตอนการทำ Player เคลื่อนที่ด้วยปุ่มขึ้น/ลง/ซ้าย/ขวา
4.2 โปรแกรมจะ compile code (คนละความหมายกับ Compile Game ข้อกอนหน้า) ตรงนี้ถ้ามี error ให้กลับไปดูข้อ 0.ปัญหาที่พบและข้อเสนอแนะ)
4.3 ถ้าไม่มี error เมื่อกดคีย์ใดๆ โปรแกรมจะเปิด no$gba emulator พร้อมกับรันเกมของเราให้
4.4 ทดลองกดเดินดู หากทำงานถูกต้องเป็นอันเสร็จขั้นตอนการทำ Player เคลื่อนที่ด้วยปุ่มขึ้น/ลง/ซ้าย/ขวา