5 คะแนน โดย GN⁺ 2024-08-05 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

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 ความคิดเห็น

 
GN⁺ 2024-08-05
ความคิดเห็นจาก Hacker News
  • เกมบนเว็บจำนวนมากสร้างด้วยเอนจินเกม Impact และมันยังเป็นพื้นฐานของเกมเชิงพาณิชย์ข้ามแพลตฟอร์มอย่าง Cross Code, Eliot Quest และ XType Plus

    • Cross Code เป็นเกมที่ยอดเยี่ยม และน่าประทับใจที่ใช้เทคโนโลยีเว็บ
    • คิดว่าเอนจินนี้น่าจะมีส่วนช่วยให้ทำประสิทธิภาพได้สูงบนฮาร์ดแวร์ Nintendo Switch
  • "Thoughts on Flash" อาจเป็นสิ่งที่ช่วยกอบกู้แพลตฟอร์มเว็บไว้ได้

    • น่าจะมีความหงุดหงิดจากการที่ Adobe เลิกสนับสนุนแพลตฟอร์ม MacOS
    • เวอร์ชัน Mac ตามหลังเวอร์ชัน Windows อยู่เสมอ
    • Jobs อาจคิดว่า Adobe คงอยู่ไม่ได้หากไม่มี Apple
  • เกมดูเรียบร้อยมาก

  • high_impact ไม่ใช่ "ไลบรารี" แต่เป็น "เฟรมเวิร์ก"

    • ต้องเขียน business logic ไว้ภายในเฟรมเวิร์ก
    • เฟรมเวิร์กมักถูกเรียกในเชิงลบว่าเป็น "ไลบรารี" ที่เข้ากับอย่างอื่นได้ไม่ดี
    • ได้ยินการพูดถึงในเชิงบวกแบบนี้แล้วรู้สึกดี
  • ดีใจที่ได้ล็อกอินเข้า HN อีกครั้งหลังจากนานมาก แล้วได้กลับมาพบ Biolab Disaster อีกครั้ง

  • ประทับใจที่ใช้ UNION เพื่อสร้างโครงสร้างข้อมูลเอนทิตีแบบพหุสัณฐาน

    • ยังคงชอบภาษา C มาก และมันเป็นภาษาที่ได้เรียนเป็นภาษาแรก
    • C เป็นภาษาที่กระชับ แต่ก็ลงลึกได้มาก
    • เกมให้ความรู้สึกคล้าย Commander Keen และชอบแฟรนไชส์นั้นมาก
  • ถ้านำไฟล์ฟอร์แมตแบบไม่สูญเสียข้อมูล QOI มารวมกับ 7Zip ก็ให้ประสิทธิภาพดีกว่า PNG แบบไม่สูญเสียข้อมูล

  • อาจเป็นไปเพื่อเคารพอายุการใช้งานแบตเตอรี่ของผู้เล่น

  • ไอเดียน่าสนใจ, โอเพนซอร์สเพื่อให้ได้คุณค่าด้านการเรียนรู้สูงสุด, การดำเนินการที่สมบูรณ์แบบ, และงานเขียนที่ชัดเจนโดยไม่มีความโอ้อวด—เป็นผลงานที่ยอดเยี่ยม

    • แค่ได้เห็นอะไรแบบนี้ก็รู้สึกเป็นสิทธิพิเศษแล้ว
  • ในฐานะหนึ่งในผู้ถือไลเซนส์ 3000 คน รู้สึกยินดีกับการกลับมาของ Impact

    • สงสัยว่ามันจะเข้ากับ Zig ได้ดีหรือไม่
  • ดูเหมือนเป็นเกมเอนจินที่ยอดเยี่ยม

    • สงสัยว่าทำไมบทความถึงบอกว่ามันแทบจะหมดอายุขัยแล้ว
    • สงสัยว่ามีเอนจินใหม่ที่ดีกว่าหรือไม่