2015-09-23 9 views
6

मैं अपने सी ++ गेम इंजन में स्क्रिप्टिंग क्षमताओं को जोड़ना चाहता हूं।रैकेट एक गेम इंजन में स्क्रिप्टिंग भाषा के रूप में

मैं Engine.exe, Physics.dll, Audio.dll है और मैं Scripting.dll जो एक उच्च स्तरीय रैकेट आवरण है जोड़ रहा।

Engine.exePhysics.dll लोड करता है और भौतिकी दुनिया सेट करता है, Audio.dll लोड करता है और ऑडियो दुनिया सेट करता है। यह Physics.dll, Audio.dll पर बाइंडिंग सेट करने और गेम स्क्रिप्ट लोड करने के लिए Scripting.dll लोड करना है।

AFAIK वहाँ एक सी ++ प्रोग्राम में रैकेट एम्बेड करने के लिए दो संभव तरीके हैं:

Foreign Interface का उपयोग Physics.dll, Audio.dll दो बार लोड करने के लिए आवश्यकता के कारण विचित्र लगता है: पहले Engine.exe और फिर गेम स्क्रिप्ट से।

लेखन Extensions अधिक आकर्षक लग रहा है, क्योंकि यह सी ++ पक्ष पर स्क्रिप्ट बाइंडिंग करने की अनुमति देता है। दूसरी तरफ आपको raco ctool के साथ अपना एक्सटेंशन बनाना होगा, इसे mzdyn ऑब्जेक्ट फ़ाइल से लिंक करें - जो अजीब दिखता है: क्यों mzdyn एक स्थिर लाइब्रेरी नहीं बनाते?

मैं एक विधि को लागू करना चाहता हूं, उदा। setupScriptBindings(), Physics.dll और Audio.dll दोनों में, और इसे स्टार्टअप पर Engine.exe से कॉल करने के लिए।

क्या ऐसा करने का कोई सीधा तरीका है?

+0

एचएम, शायद [यह] (http://docs.racket-lang.org/inside/embedding.html) विवरण मदद करता है। –

+0

एचएम ... आपके द्वारा प्रदान किए गए लिंक सी/अन्य कोड ** को ** रैकेट प्रोग्राम में एम्बेड करने के बारे में बात करते हैं। आपके विवरण से, मुझे लगता है कि आप इसे दूसरी तरफ चाहते हैं, उदा। रैकेट को अपने सी ++ एप्लिकेशन में एम्बेड करना: http://docs.racket-lang.org/inside/embedding.html हालांकि सबसे आसान और संभवतः सबसे साफ समाधान आपके गेम इकाइयों को नियंत्रित करने के लिए कुछ प्रकार के प्रोटोकॉल को परिभाषित करना होगा, और फिर रैकेट शुरू करना होगा एक नई प्रक्रिया के रूप में, सॉकेट या कुछ अन्य आईपीसी तंत्र का उपयोग करके संचार। –

+0

ऑफटॉपिक: रैकेट का सफलतापूर्वक शरारती कुत्ते द्वारा वीडियो गेम उत्पादन में उपयोग किया गया है। देखें [«प्लेस्टेशन 3 पर रैकेट]] (http://www.youtube.com/watch?v=oSmqbnhHp1c) और [« अनचाहे 2 में राज्य-आधारित स्क्रिप्टिंग: चोरों के बीच »] (http: //www.gameenginebook .com/संसाधन/gdc09-statescripting-uncharted2.pdf)। –

उत्तर

3

रैकेट से सी कोड को जोड़ने के विस्तार और एफएफआई विधियों दोनों का उपयोग करने के बाद, मुझे कहना है कि एफएफआई दृष्टिकोण अधिक निसर है। रैकेट में सी कार्यों में बाइंडिंग अच्छी तरह से निर्दिष्ट और मजबूत हैं और रैकेट में सी प्रकारों से निपटना बहुत अच्छा है। एफएफआई दृष्टिकोण का उपयोग करने में एकमात्र कमी यह है कि, AFAIK, आपका रैकेट प्रोग्राम ड्राइवर आवेदन होना चाहिए।

एम्बेडिंग दृष्टिकोण के साथ आपका सी/सी ++ निष्पादन योग्य ड्राइवर है, लेकिन रैकेट कोड के साथ इंटरफ़ेस घोषित करना अधिक मैन्युअल और त्रुटि प्रवण है। उल्लेख नहीं है कि आपको या तो रैको कटोल को समझना है और इसे दोहराना है या रैकेट की बिल्ड सिस्टम को अपना लेना है। हमारे उद्देश्यों के लिए हम रैकेट स्रोतों को निकालने और इसे स्वयं बनाने के लिए घायल हो गए। मैं वास्तव में उस दृष्टिकोण की सिफारिश नहीं करता हूं।

आखिरकार मेरे आवेदन के लिए मेरे आवेदन के लिए एक विदेशी के साथ रैकेट आवेदन होना चाहिए। डीएलएल/.so फ़ाइल जो सी कार्यों के लिए लोड की गई है, वह सबसे अच्छा काम करती है, लेकिन ऐसा लगता है जैसे आप एम्बेडिंग दृष्टिकोण से फंस सकते हैं।

+0

धन्यवाद। हाँ, मुझे एक एम्बेडेड समाधान की आवश्यकता है। यद्यपि आप कहते हैं कि यह कठिन हो सकता है, स्रोत से रैकेट बनाना मेरे लिए अधिक आकर्षक लग रहा है। यदि आप अपने एम्बेडिंग-आधारित दृष्टिकोण से बाध्यकारी «मूल» ↔ «स्क्रिप्ट» का उदाहरण प्रदान कर सकते हैं, तो यह बहुत उपयोगी होगा। आपने किस प्रकार का स्क्रिप्ट निष्पादन चुना था: सादा पाठ, [बाइटकोड] (http://docs.racket-lang.org/raco/make.html) या [स्टैंडअलोन निष्पादन योग्य] (http: //docs.racket-lang। org/Raco/exe.html)? –

+2

हम सादे पाठ या बाइटकोड का उपयोग करेंगे। बाइटकोड काफी तेज़ है, लेकिन आपको ध्यान रखना होगा कि यह अपडेट किया गया है या जब आवश्यक हो तो रैकेट इसे संकलित करता है। –

+2

और हमारे मूल <-> स्क्रिप्ट बाइंडिंग दस्तावेज़ों में उदाहरण की तरह दिखता है ... कुछ खास नहीं। –

संबंधित मुद्दे