से उछाल वाली वस्तुओं की कक्षा की जानकारी को बनाए रखना ठीक है, एक ऐसा कीवर्ड है जिसे मैंने जानबूझकर टैग और शीर्षक से दूर रखा है। यह "एंड्रॉइड" है, लेकिन ऐसा इसलिए है क्योंकि परियोजना एंड्रॉइड में है, लेकिन मुझे नहीं लगता कि मेरे प्रश्न के साथ कुछ भी करने के लिए कुछ भी नहीं है, और मैं एंड्रॉइड में अनुभव के बिना लोगों को डराना नहीं चाहता।एसआईजीआईजी जावा सी ++
तो, स्विग के साथ सामान्य समस्या। मेरे पास एक सी ++ कक्षा में वर्चुअल विधि है, जिसे मैंने कक्षा में director
सुविधा जोड़कर जावा में अधिभारित किया है और यह काम करता है। समस्या यह है कि विधि को एक पॉलिमॉर्फिक तर्क प्राप्त होता है जिसे जावा पक्ष पर भी बढ़ाया जाता है, और जावा में आभासी विधि कॉल के दौरान, ऑब्जेक्ट सभी पॉलिमॉर्फिक सूचनाओं के साथ आता है।
सटीक स्थिति प्रस्तुत करने के लिए; मैं सी ++ में एक गेम इंजन लिख रहा हूं, और मैं इसे जावा में खुशी से उपयोग करना चाहता हूं। गेम इंजन में GameObject
वर्ग है, जो CollisionListener
एस पंजीकृत करता है और जब टकराव इंजन टकराव की घटना का पता लगाता है, तो यहसभी पंजीकृत collisionListener
की विधि को उन ऑब्जेक्ट्स से गुजरता है जो उन्हें टकराते हैं।
class CollisionListener {
public:
virtual bool collidedWith(GameObject &){};
~CollisionListener(){} // I know this needs to be virtual but let's forget about that now
};
मैं जावा के लिए इस वर्ग को उजागर कर रहा हूँ, GameObject
वर्ग के साथ निम्न इंटरफ़ेस फ़ाइल Bridge.i
%module(directors="1") Bridge
%feature("director") CollisionListener;
%include "CollisionListener";
%feature("director") GameObject;
%include "GameObject.h"
अब का उपयोग कर, जब मैं जावा और अधिभार collidedWith
में CollisionListener
से विरासत है, यह कहा जाता है के मिल जावा पक्ष GameObject
ऑब्जेक्ट के साथ। उदाहरण के लिए, यदि मैं जावा पक्ष GameObject
कक्षा से उत्तराधिकारी हूं और Bullet
कक्षा को परिभाषित करता हूं, जब यह बुलेट श्रोता के साथ किसी अन्य ऑब्जेक्ट के साथ टकराता है, collidedWith
विधि कॉल में, मुझे प्राप्त होता है यह एक नंगे GameObject
है, ताकि (object instanceof Bullet)
काम न करे। कोई आश्चर्य की बात है, मैं बड़ा घूँट में खोदे गए हैं BridgeJNI.java
उत्पन्न होते हैं और यह पाया:
public static boolean SwigDirector_CollisionListener_collidedWith(CollisionListener self, long arg0) {
return self.collidedWith(new GameObject(arg0, false));
}
तो यह जावा भार के कॉल करने से पहले सूचक के चारों ओर एक नई वस्तु गिर्द घूमती है।
तो, मुख्य प्रश्न यह है कि टकराव होने पर Bullet
ऑब्जेक्ट कैसे प्राप्त करें?
मैं आसानी से इसे प्राप्त करने के लिए एक रास्ता लेकर आया हूं, लेकिन मुझे ऑटो-जेनरेट की गई फ़ाइलों को संशोधित करने की आवश्यकता है, जो एक बुरा विचार है। तो मुझे उम्मीद है कि कुछ स्विग मास्टर मुझे स्विग जेनरेट की गई फ़ाइलों में संशोधन को इंजेक्ट करने में मदद कर सकता है।
मेरी छोटी हैक हर सी ++ पक्ष GameObject
वस्तु में एक jobject * self
रखने के लिए, और वास्तविक जावा पक्ष GameObject
(और नहीं एक है कि केवल सूचक लपेटता) के निर्माण के दौरान वास्तविक जावा वस्तु का पता असाइन करने के लिए है। इस तरह, मैं सी ++ पक्ष GameObject
में एक पॉलिमॉर्फिक getSelf
विधि को परिभाषित कर सकता हूं और जावा में खुशी से परिणाम का उपयोग कर सकता हूं। क्या स्विग जेनरेट की गई फाइलों के लिए जरूरी कोड इंजेक्ट करने का कोई तरीका है?
धन्यवाद
नोट: यदि आप Android पर निर्देशकों की कोशिश की और वे काम नहीं किया है, तो ऐसा वर्तमान स्थिर संस्करण इसका समर्थन नहीं करता है। स्विग वेबसाइट से ब्लडिंग एज डाउनलोड करें। लेकिन मैं इसे 22/03/2012 में लिख रहा हूं और यह नोट जल्द ही अनावश्यक होगा। विनाशक वर्चुअल नहीं होने का कारण यह है कि रक्तस्राव एज संस्करण विनाशक में प्रोग्राम क्रैश करता है, और इसे गैर वर्चुअल बनाने के लिए इसे अभी नियंत्रण में रखना प्रतीत होता है।
तो आपके प्रश्न का संक्षिप्त संस्करण यह है कि आप जावा में 'GameObject' प्राप्त करने में सक्षम होना चाहते हैं और फिर भी जावा के भीतर डालने में सक्षम होना चाहिए जब उस व्युत्पन्न प्रकार को' टक्कर के साथ 'जावा कार्यान्वयन में पारित किया जाता है? अगर यह मामला है तो निश्चित रूप से आपके छोटे हैक को टाइपमैप में लपेटा जा सकता है। – Flexo
निश्चित रूप से! मैंने सोचा कि स्विग कोड को इंजेक्शन देने का एक तरीका होगा, लेकिन मैं स्विंग करने के लिए काफी नया हूं। मैं टाइपमैप की जांच करूंगा। – enobayram
कल उम्मीद है कि मैं कल एक उत्तर लिखूंगा। – Flexo