high_impact: JavaScript गेम इंजन को C में पोर्ट करना
सारांश
- high_impact 2D एक्शन गेम्स के लिए एक छोटा गेम इंजन है, जिसे C में लिखा गया है और जिसे Windows, Mac, Linux और वेब के लिए WASM में compile किया जा सकता है
- यह 2010 के JavaScript गेम इंजन Impact से प्रेरित है और MIT लाइसेंस के तहत उपलब्ध है
- सोर्स कोड: GitHub
प्राचीन इतिहास
- अप्रैल 2010 में Steve Jobs ने "Thoughts on Flash" नामक एक खुला पत्र जारी कर घोषणा की कि iOS पर Flash को सपोर्ट नहीं किया जाएगा
- Flash वेब पर एक बेहद महत्वपूर्ण browser plugin था, और कई वेबसाइटें Flash गेम्स और animations पर निर्भर थीं
- Android Flash को सपोर्ट करता था, लेकिन उसका performance अच्छा नहीं था, और Apple का यह फैसला Flash के अंत का संकेत था
- यह साबित करने के लिए कि Flash के बिना भी JavaScript Canvas2D API का उपयोग करके वेब गेम बनाए जा सकते हैं, Biolab Disaster विकसित किया गया
C ही क्यों?
- C एक सरल लेकिन गहराई वाली भाषा है, जो गेम डेवलपमेंट के लिए उपयुक्त है
- JavaScript MPEG1 decoder को C में पोर्ट करने, VR implementation, image और audio format development जैसे कामों के जरिए C के प्रति लगाव फिर से जागा
- Impact को C में दोबारा लिखना एक मजेदार अभ्यास होगा
अवधारणा
- high_impact को न्यूनतम कोड के साथ लागू किया गया है और यह tile map loading, game object creation, update और drawing की सुविधाएँ देता है
- यह physics और collision detection संभालता है, और इसमें simple sprite sheet animation, text drawing, sound effects और music playback शामिल हैं
- high_impact एक library नहीं बल्कि एक framework है, इसलिए users को business logic खुद लिखना होता है
- इसे SDL या Sokol platform backend के साथ compile किया जा सकता है
एंटिटी
- सभी entities एक ही
entity_t struct साझा करती हैं, जिसमें position, velocity, size जैसी properties होती हैं
- macros के जरिए base entity struct को extend किया जा सकता है
- हर entity type को function pointers देने वाला
entity_vtab_t उपलब्ध कराना होता है
- यह अधिकतम 64k active entities संभाल सकता है
collision detection और response
- tile map के साथ collision की गणना कर सटीक collision point खोजा जाता है
- entities के बीच collision अलग से संभाले जाते हैं, और हर entity यह परिभाषित करती है कि वह दूसरी entities से कैसे टकराएगी
rendering
- यह OpenGL और software renderer दोनों प्रदान करता है
- सारा rendering एक single function call के जरिए किया जाता है, और textures को मिलाने के लिए texture atlas का उपयोग होता है
sound
- sound output को SDL2 या Sokol के जरिए संभाला जाता है
- एक fixed संख्या में sources लोड किए जा सकते हैं, और fixed संख्या में sounds चलाए जा सकते हैं
- sounds अपने-आप discard हो जाते हैं और दोबारा उपयोग किए जा सकते हैं
memory management
- memory management के लिए "hunk" नाम का एक single byte array उपयोग किया जाता है
- memory allocation के लिए bump allocator और temp allocator का उपयोग होता है
- memory release अपने-आप संभाला जाता है, इसलिए users को memory management की चिंता नहीं करनी पड़ती
level editor
- इसमें मूल Impact level editor "Weltmeister" शामिल है
- इसे JavaScript में लिखा गया था और आधुनिक browser features का उपयोग कर update किया गया है
- files को load और save करने के लिए File System API का उपयोग किया जाता है
demo game
- Biolab Disaster और Drop, इन दो गेम्स को C में पोर्ट करके high_impact की क्षमताओं को सत्यापित किया गया
विस्तार क्षमता
- high_impact एक पारंपरिक गेम इंजन है, जिसमें game-specific code अलग से जोड़ा जाता है
- platform और renderer को अन्य systems के समर्थन के लिए बढ़ाया जा सकता है
GN⁺ का संक्षेप
- high_impact, C में लिखा गया एक 2D गेम इंजन है, जो सरल लेकिन शक्तिशाली सुविधाएँ प्रदान करता है
- यह JavaScript गेम इंजन Impact का उत्तराधिकारी है और कई platforms पर चल सकता है
- memory management और collision detection जैसी गेम डेवलपमेंट की मुख्य सुविधाओं को यह सरल तरीके से लागू करता है
- level editor और demo games के जरिए यह वास्तविक उपयोग के उदाहरण देता है
- Unity या Unreal जैसे बड़े इंजनों की तुलना में यह हल्के और सरल प्रोजेक्ट्स के लिए अधिक उपयुक्त है
1 टिप्पणियां
Hacker News राय
कई web games Impact game engine से बनाए गए थे, और यह Cross Code, Eliot Quest, XType Plus जैसे commercial cross-platform titles की नींव रहा है
"Thoughts on Flash" ने web platform को बचाया हो सकता था
गेम बहुत साफ़-सुथरा दिखता है
high_impact एक "library" नहीं बल्कि एक "framework" है
काफ़ी समय बाद HN account में लॉग इन करके Biolab Disaster को फिर से देखना अच्छा लगा
UNION का उपयोग करके polymorphic entity data structure बनाना प्रभावशाली था
QOI lossless file format और 7Zip को मिलाकर lossless PNG से बेहतर performance मिलती है
शायद यह player की battery life का सम्मान करने के लिए हो
मज़ेदार idea, अधिकतम learning value के लिए open source, बेहतरीन execution, और बिना दिखावे की स्पष्ट writing—यह एक शानदार योगदान है
3000 license holders में से एक होने के नाते, Impact का फिर से उभरना देखकर खुशी है
यह एक बेहतरीन game engine जैसा लगता है