high_impact: พอร์ตเอนจินเกม JavaScript ไปเป็น C
สรุป
- high_impact เป็นเอนจินเกมขนาดเล็กสำหรับเกมแอ็กชัน 2D เขียนด้วย C และคอมไพล์ได้สำหรับ Windows, Mac, Linux และเว็บผ่าน WASM
- ได้แรงบันดาลใจจากเอนจินเกม JavaScript ชื่อ Impact ในปี 2010 และเผยแพร่ภายใต้สัญญาอนุญาต MIT
- ซอร์สโค้ด: GitHub
ประวัติยุคบุกเบิก
- ในเดือนเมษายน 2010 Steve Jobs ได้ประกาศผ่านจดหมายเปิดผนึกชื่อ "Thoughts on Flash" ว่า iOS จะไม่รองรับ Flash
- Flash เคยเป็นปลั๊กอินเบราว์เซอร์ที่สำคัญมากบนเว็บ และมีเว็บไซต์จำนวนมากที่พึ่งพาเกมและแอนิเมชันบน Flash
- Android รองรับ Flash แต่ประสิทธิภาพไม่ดีนัก และการตัดสินใจของ Apple ก็เป็นสัญญาณบอกจุดจบของ Flash
- จึงพัฒนา Biolab Disaster ขึ้นมาเพื่อพิสูจน์ว่าสามารถสร้างเกมบนเว็บได้โดยไม่ต้องใช้ Flash ด้วย JavaScript Canvas2D API
ทำไมต้อง C?
- C เป็นภาษาที่เรียบง่ายแต่ลุ่มลึก และเหมาะกับการพัฒนาเกม
- หลังจากพอร์ตตัวถอดรหัส JavaScript MPEG1 ไปเป็น C รวมถึงทำงานด้าน VR และพัฒนาฟอร์แมตรูปภาพกับเสียงต่างๆ ก็ทำให้กลับมาค้นพบความชอบที่มีต่อ C อีกครั้ง
- การเขียน Impact ขึ้นใหม่ด้วย C จึงน่าจะเป็นแบบฝึกหัดที่สนุก
แนวคิด
- high_impact ถูกสร้างขึ้นด้วยโค้ดในระดับขั้นต่ำ และมีความสามารถในการโหลดไทล์แมป สร้างอ็อบเจ็กต์ในเกม อัปเดต และวาดผลลัพธ์
- จัดการฟิสิกส์และการตรวจจับการชน รวมถึงมีแอนิเมชันสไปรต์ชีตแบบง่าย การวาดข้อความ เอฟเฟกต์เสียง และการเล่นเพลง
- high_impact ไม่ใช่ไลบรารีแต่เป็นเฟรมเวิร์ก โดยผู้ใช้ต้องเขียน business logic เอง
- สามารถคอมไพล์โดยใช้แพลตฟอร์มแบ็กเอนด์ SDL หรือ Sokol
เอนทิตี
- เอนทิตีทั้งหมดใช้โครงสร้าง
entity_t ร่วมกัน โดยมีคุณสมบัติเช่น ตำแหน่ง ความเร็ว และขนาด
- สามารถขยายโครงสร้างเอนทิตีพื้นฐานได้ผ่านแมโคร
- เอนทิตีแต่ละประเภทต้องมี
entity_vtab_t ที่ให้ฟังก์ชันพอยน์เตอร์ที่จำเป็น
- รองรับเอนทิตีที่แอ็กทีฟได้สูงสุด 64k ตัว
การตรวจจับและตอบสนองต่อการชน
- คำนวณการชนกับไทล์แมปเพื่อหาจุดชนที่แม่นยำ
- การชนกันระหว่างเอนทิตีจะถูกจัดการแยกต่างหาก และเอนทิตีแต่ละตัวสามารถกำหนดได้ว่าจะชนกับเอนทิตีอื่นอย่างไร
การเรนเดอร์
- มีทั้ง OpenGL และซอฟต์แวร์เรนเดอเรอร์
- การเรนเดอร์ทั้งหมดทำผ่านการเรียกฟังก์ชันเพียงครั้งเดียว และใช้ texture atlas เพื่อรวมเท็กซ์เจอร์เข้าด้วยกัน
เสียง
- ใช้ SDL2 หรือ Sokol ในการจัดการเอาต์พุตเสียง
- โหลดแหล่งกำเนิดเสียงตามจำนวนที่กำหนดไว้ และเล่นเสียงได้ตามจำนวนคงที่
- เสียงจะถูกทิ้งโดยอัตโนมัติเพื่อให้สามารถนำกลับมาใช้ซ้ำได้
การจัดการหน่วยความจำ
- จัดการหน่วยความจำด้วย "hunk" ซึ่งเป็นอาร์เรย์ไบต์เพียงก้อนเดียว
- ใช้ bump allocator และ temp allocator สำหรับการจัดสรรหน่วยความจำ
- จัดการการคืนหน่วยความจำให้อัตโนมัติ ทำให้ผู้ใช้ไม่ต้องกังวลเรื่องการจัดการหน่วยความจำ
เครื่องมือแก้ไขเลเวล
- มาพร้อมกับ "Weltmeister" ซึ่งเป็นเครื่องมือแก้ไขเลเวลต้นฉบับของ Impact
- เขียนด้วย JavaScript และอัปเดตให้ใช้ความสามารถของเบราว์เซอร์สมัยใหม่
- ใช้ File System API ในการโหลดและบันทึกไฟล์
เกมเดโม
- มีการพอร์ตเกมสองเกมคือ Biolab Disaster และ Drop มาเป็น C เพื่อยืนยันความสามารถของ high_impact
การขยายความสามารถ
- high_impact เป็นเอนจินเกมแบบดั้งเดิม โดยโค้ดเฉพาะของแต่ละเกมจะเขียนเพิ่มแยกต่างหาก
- แพลตฟอร์มและเรนเดอเรอร์สามารถขยายเพื่อรองรับระบบอื่นได้
สรุปโดย GN⁺
- high_impact เป็นเอนจินเกม 2D ที่เขียนด้วย C ซึ่งให้ความสามารถที่เรียบง่ายแต่ทรงพลัง
- เป็นภาคต่อเชิงแนวคิดของเอนจินเกม JavaScript ชื่อ Impact และสามารถทำงานได้บนหลายแพลตฟอร์ม
- ฟังก์ชันแกนหลักที่จำเป็นต่อการพัฒนาเกม เช่น การจัดการหน่วยความจำและการตรวจจับการชน ถูกทำให้ง่ายต่อการใช้งาน
- มีทั้งเครื่องมือแก้ไขเลเวลและเกมเดโมให้ดูเป็นตัวอย่างการใช้งานจริง
- เหมาะกับโปรเจ็กต์ที่เบาและเรียบง่ายมากกว่าเอนจินขนาดใหญ่อย่าง Unity หรือ Unreal
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เกมบนเว็บจำนวนมากสร้างด้วยเอนจินเกม Impact และมันยังเป็นพื้นฐานของเกมเชิงพาณิชย์ข้ามแพลตฟอร์มอย่าง Cross Code, Eliot Quest และ XType Plus
"Thoughts on Flash" อาจเป็นสิ่งที่ช่วยกอบกู้แพลตฟอร์มเว็บไว้ได้
เกมดูเรียบร้อยมาก
high_impact ไม่ใช่ "ไลบรารี" แต่เป็น "เฟรมเวิร์ก"
ดีใจที่ได้ล็อกอินเข้า HN อีกครั้งหลังจากนานมาก แล้วได้กลับมาพบ Biolab Disaster อีกครั้ง
ประทับใจที่ใช้ UNION เพื่อสร้างโครงสร้างข้อมูลเอนทิตีแบบพหุสัณฐาน
ถ้านำไฟล์ฟอร์แมตแบบไม่สูญเสียข้อมูล QOI มารวมกับ 7Zip ก็ให้ประสิทธิภาพดีกว่า PNG แบบไม่สูญเสียข้อมูล
อาจเป็นไปเพื่อเคารพอายุการใช้งานแบตเตอรี่ของผู้เล่น
ไอเดียน่าสนใจ, โอเพนซอร์สเพื่อให้ได้คุณค่าด้านการเรียนรู้สูงสุด, การดำเนินการที่สมบูรณ์แบบ, และงานเขียนที่ชัดเจนโดยไม่มีความโอ้อวด—เป็นผลงานที่ยอดเยี่ยม
ในฐานะหนึ่งในผู้ถือไลเซนส์ 3000 คน รู้สึกยินดีกับการกลับมาของ Impact
ดูเหมือนเป็นเกมเอนจินที่ยอดเยี่ยม