2011-09-20 15 views
9

:लुआबिंद: कक्षा के विशिष्ट उदाहरण को लुआ से कैसे बांधें?

का उपयोग कर LuaBind आसान है लुआ करने के लिए पूरे वर्गों बाइंडिंग (sidenote यह खेल प्रोग्रामिंग है):

class test 
{ 
    test() 
    { 
     std::cout<<"constructed!"<<std::endl; 
    } 

    void print() 
    { 
     std::cout<<"works!"<<std::endl; 
    } 
} 

// कहीं और

module[some_lua_state] 
    [ 
     class_<test>("test") 
     .def(constructor<>()) 
     .def("print",&test::print) 
    ]; 

अब मैं वर्ग के उदाहरण बना सकते हैं लुआ में और इसका उपयोग करें:

lua_example.lua

foo = test() //will print "constructed!" on the console 
foo:print() //will print "works!" on the console 

हालांकि, अब मैं लुआ को परीक्षण का एक विशिष्ट उदाहरण बांधना चाहता हूं। इससे मुझे लुआ को ऑब्जेक्ट पास करने में मदद मिलेगी, उदा। प्लेयर श्रेणी का एक उदाहरण और की तरह कुछ कार्य करें:

Player:SetPosition(200,300) 

मुश्किल तरीके से जा रहा है और जैसे

SetPosition("Player",200,300) 

कुछ जहां इसी सी ++ SetPosition समारोह एक एसटीडी को देखने के लिए की जरूरत है होने के लिए विरोध के रूप में: : खिलाड़ी को खोजने के लिए मानचित्र।

क्या यह भी संभव है और यदि हां, तो मैं इसे लुआइंड में कैसे कर सकता हूं?

उत्तर

18

आप लुआ को कक्षाओं के उदाहरणों को बाध्य नहीं करते हैं। कक्षाओं के उदाहरण केवल डेटा हैं, और आप सामान्य साधनों के माध्यम से लुआ को डेटा पास कर सकते हैं। सी ++ ऑब्जेक्ट्स विशेष हैं हालांकि; क्योंकि वे लुबाइंड के माध्यम से पंजीकृत हैं, आपको लुआ स्क्रिप्ट को प्रदान करने के लिए लुबाइंड विधियों का उपयोग करना होगा।

लुआ को डेटा देने के कई तरीके हैं, और लुबाइंड उन सभी को शामिल करता है। उदाहरण के लिए, यदि आपके पास ऑब्जेक्ट x है, जो क्लाउड X पर पॉइंटर है जो लुबाइंड के साथ पंजीकृत है, तो आप लुआ x दे सकते हैं।

आप x का मान वैश्विक चर में सेट कर सकते हैं। यह Luabind के object इंटरफेस के माध्यम से किया जाता है और globals समारोह:

luabind::globals(L)["NameOfVariable"] = x; 

जाहिर है, यदि आप किसी अन्य तालिका, जो किसी अन्य तालिका में रहता है, आदि, जो वैश्विक राज्य से पहुँचा जा सकता है में है कि डाल सकते हैं। लेकिन आपको यह सुनिश्चित करना होगा कि सभी टेबल मौजूद हैं।

लुआ को इस डेटा को पास करने का एक और तरीका लुआ फ़ंक्शन को कॉल करना और पैरामीटर के रूप में पास करना है। आप ऑब्जेक्ट के रूप में फ़ंक्शन प्राप्त करने के लिए luabind::object इंटरफ़ेस का उपयोग कर सकते हैं, फिर इसे कॉल करने के लिए luabind::call_function का उपयोग करें। आप फ़ंक्शन के पैरामीटर के रूप में बस x पास कर सकते हैं। वैकल्पिक रूप से, यदि आप lua_pcall -स्टाइल वाक्यविन्यास पसंद करते हैं, तो आप को luabind::object में लपेट सकते हैं और इसे luabind::object::push के साथ स्टैक में दबा सकते हैं।

+1

आपने इसका जवाब देने के कुछ घंटों बाद किया है, लेकिन फिर से धन्यवाद। लुबिंद :: ग्लोबल्स इसे सब बहुत आसान बनाता है। इसके अलावा लुइबिंड ने सी ++ में टेम्पलेट मेटाप्रोग्रामिंग के लिए एक नए स्तर पर अपना सम्मान बढ़ाया है। – TravisG

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