2008-09-23 17 views
21

मैं विंडोज में भौतिकी सिमुलेशन इंजन और संपादक का निर्माण कर रहा हूं। मैं क्यूटी का उपयोग करके संपादक भाग बनाना चाहता हूं और मैं ओपनजीएल के साथ एसडीएल का उपयोग कर इंजन चलाने के लिए चाहता हूं।मैं क्यूटी और एसडीएल का एक साथ कैसे उपयोग करूं?

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

तो, मेरा सवाल यह है: क्या एसडीएल का उपयोग करके ओपनजीएल को क्यूटी विंडो में प्रस्तुत करने का कोई तरीका है?

मैंने वेब पर पढ़ा है कि एसडीएल को एक विंडो हैंडल के साथ आपूर्ति करना संभव हो सकता है जिसमें प्रस्तुत करना है। किसी को भी डोंग अनुभव है?

इसके अलावा, सिम्युलेटर के थ्रेडेड हिस्से में समस्या उत्पन्न हो सकती है क्योंकि यह एसडीएल धागे का उपयोग करती है।

+0

है यह एक खुला स्रोत परियोजना है कि मैं अभी शुरू कर लिए है। परियोजना के प्रगति के रूप में मैं अपने वास्तुकला/समाधान पोस्ट करूंगा। – bineteri

+0

जिस कार्य को आप पूरा करना चाहते हैं उसके आधार पर मुझे विश्वास है कि आप सीधे क्यूटी के लिए जा सकते हैं और एसडीएल को पूरी तरह से डंप कर सकते हैं। क्यूटी के पास ओपनजीएल समर्थन साफ ​​है, इनपुट हैंडलिंग प्रदान करता है, बहुत बेहतर (कोई अपराध, एसडीएल लोग) यूजर इंटरफेस क्षमताओं इत्यादि। ओपनजीएल क्यूटी विजेट का उपयोग नरक के रूप में छोटा है और क्यूटी फ्रेमवर्क द्वारा प्रस्तावित थ्रेडिंग मॉडल भी उपयोग करने में बहुत आसान हैं (आप मानक थ्रेडिंग, concurrency आदि + सिग्नल/स्लॉट अवधारणा है)। यदि थ्रेडिंग मॉडल आपकी पसंद के हिसाब से नहीं है तो आप उदाहरण के लिए बढ़ावा देने जैसे कुछ का उपयोग कर सकते हैं। किसी भी तरह से मुझे वास्तव में आपके परिदृश्य में एसडीएल + क्यूटी का उपयोग करने का कोई कारण नहीं दिखता है। – rbaleksandar

उत्तर

11

जबकि आप इसे पहले जवाब की तरह काम करने के लिए प्राप्त कर सकते हैं सुझाव है कि आप थ्रेडिंग के कारण समस्याओं में भाग लेंगे। थ्रेडिंग की बात आती है जब कोई आसान समाधान नहीं होता है, और यहां आपके पास एसडीएल क्यूटी और ओपनजीएल मेनलोप इंटरैक्टिंग होगा। मज़ा नहीं।

सबसे आसान और सबसे स्वच्छ समाधान दोनों भागों को कम करना होगा। ताकि एसडीएल और क्यूटी अलग प्रक्रियाओं में चल सकें और उन्हें संवाद करने के लिए किसी प्रकार की संदेश का उपयोग कर सकें (मैं यहां डी-बस की सिफारिश करता हूं)। आप एसडीएल सीमाहीन खिड़की में प्रस्तुत कर सकते हैं और आपका संपादक संदेश के माध्यम से आदेश भेजता है।

+0

धन्यवाद, यह जानकारी बहुत मूल्यवान है। मुझे लगता है कि मुझे काम को 2 प्रक्रियाओं में अलग करना होगा। ओपनजीएल "संदर्भ" साझा करने से सबसे बड़ी बाधा आती है। क्यूटी के विजेट ओपनजीएल/एसडीएल के साथ अच्छी तरह से खेल नहीं है। क्यूटी और एसडीएल एक ही पुस्तकालय (pthreads, win32 धागे) का उपयोग करने के बाद थ्रेडिंग अच्छी तरह से काम करता प्रतीत होता है। – bineteri

3

क्यूटी से ओपनजीएल पर रेंडरिंग छोटा है (और बहुत अच्छी तरह से काम करता है) एसडीएल का कोई प्रत्यक्ष अनुभव नहीं है लेकिन यहां मिश्रण के बारे में एक उदाहरण ऐप है। http://www.devolution.com/pipermail/sdl/2003-January/051805.html

वहाँ मिश्रण क्यूटी के बारे में एक अच्छा लेख ओपन यहाँ http://doc.trolltech.com/qq/qq26-openglcanvas.html क्या आप सख्ती से जरूरत से परे एक सा बल्कि चालाक के साथ सीधे widgewts है!

+0

ओपनजीएल यहां मुद्दा नहीं है। मुझे पता है कि यह क्यूटी के साथ अच्छी तरह से काम करता है। समस्या ज्यादातर थ्रेडिंग है। – bineteri

+0

मेरी गलती मैंने सोचा कि एसडीएल भौतिकी इंजन पुस्तकालय था! –

18

यह मेरी परियोजना में जो कुछ भी करता है उसका एक सरलीकरण है। आप यह सिर्फ एक साधारण विजेट की तरह उपयोग कर सकते हैं, लेकिन जैसा कि आप की जरूरत है, तो आप का उपयोग कर सकते हैं कि यह वस्तु m_Screen है एसडीएल सतह के लिए आकर्षित करने के लिए है और यह विजेट :)

#include "SDL.h" 
#include <QWidget> 

class SDLVideo : public QWidget { 
    Q_OBJECT 

public: 
    SDLVideo(QWidget *parent = 0, Qt::WindowFlags f = 0) : QWidget(parent, f), m_Screen(0){ 
     setAttribute(Qt::WA_PaintOnScreen); 
     setUpdatesEnabled(false); 

     // Set the new video mode with the new window size 
     char variable[64]; 
     snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId()); 
     putenv(variable); 

     SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); 

     // initialize default Video 
     if((SDL_Init(SDL_INIT_VIDEO) == -1)) { 
      std:cerr << "Could not initialize SDL: " << SDL_GetError() << std::endl; 
     } 

     m_Screen = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF); 
     if (m_Screen == 0) { 
      std::cerr << "Couldn't set video mode: " << SDL_GetError() << std::endl; 
     } 
    } 

    virtual ~SDLVideo() { 
     if(SDL_WasInit(SDL_INIT_VIDEO) != 0) { 
      SDL_QuitSubSystem(SDL_INIT_VIDEO); 
      m_Screen = 0; 
     } 
    } 
private: 
    SDL_Surface *m_Screen; 
}; 

आशा इस मदद करता है

में दिखाता हूँ

नोट: यह आमतौर पर एसडीएल सतह के आकार में इस विजेट के न्यूनतम और अधिकतम आकार को सेट करने के लिए समझ में आता है।

+0

क्या मैक पर विंडो आईडी हैक काम करता है? यह ओएसएक्स पर काम नहीं कर रहा है। मैंने बिना किसी किस्मत के Putenv और SDL_putenv दोनों की कोशिश की है। –

+0

मुझे पता है कि यह वास्तव में देर हो चुकी है, लेकिन क्या कोई यह समझा सकता है कि यह मेरे लिए कैसे काम करता है? – Whyrusleeping

1

आप इस लाइब्रेरी इस्तेमाल कर सकते हैं (डेमो निर्देशिका देखें):

https://github.com/kronat/libqsdl

एक अच्छा दिन

+1

लिंक काम नहीं करता है (अब और?) – mkj

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