2010-08-28 14 views
25

के भीतर OpenGL glutDisplayFunc का उपयोग करके मैंने OpenGL GLUT टूलकिट द्वारा किए गए कार्यों को समाहित करने के लिए एक C++ क्लास (myPixmap) बनाया है। कक्षा के display() सदस्य फ़ंक्शन में GLUT सेट अप करने के लिए आवश्यक अधिकांश कोड शामिल हैं।कक्षा


void myPixmap::display() 
{ 
    // open an OpenGL window if it hasn't already been opened 
    if (!openedWindow) 
    { 
     // command-line arguments to appease glut 
     char *argv[] = {"myPixmap"}; 
     int argc = 1; 
     glutInit(&argc, argv); 
     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
     glutInitWindowSize(640, 480); 
     glutInitWindowPosition(30, 30); 
     glutCreateWindow("Experiment"); 
     glutDisplayFunc(draw); 
     glClearColor(0.9f, 0.9f, 0.9f, 0.0); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glutMainLoop(); 

     openedWindow = true; 
    } 
} 

प्रदर्शन समारोह glutDisplayFunc() के लिए पारित वर्ग के एक अन्य सदस्य समारोह है: पर मैक ओएस एक्स 10.6.4


void myPixmap::draw(void) 
{ 
    glDrawPixels(m,n,GL_RGB,GL_UNSIGNED_BYTE, pixel); 
} 

हालांकि, जीसीसी 4.2.1 कि यह दावा करते हुए, इस कोड को संकलित करने के लिए मना कर दिया:

argument of type 'void (myPixmap::)()' does not match 'void (*)()'

वहाँ एक वर्ग के एक सदस्य समारोह के अंदर भरमार टूलकिट का उपयोग करने का कोई तरीका है, या मैं सभी भरमार कार्यात्मक कॉल करना होगा कार्यक्रम के main समारोह के भीतर एनएस?

उत्तर

30

समस्या यह है कि एक उदाहरण बाध्य सदस्य फ़ंक्शन के लिए सूचक को this पॉइंटर शामिल करना होगा। ओपनजीएल एक सी एपीआई है, और this पॉइंटर्स के बारे में कुछ भी नहीं जानता है। आपको glutDisplayFunc का उपयोग करने के लिए एक स्थिर सदस्य फ़ंक्शन (जिसे किसी उदाहरण की आवश्यकता नहीं है, और इस प्रकार this) का उपयोग करना होगा, और कुछ स्थिर डेटा सदस्यों (उदाहरण तक पहुंचने के लिए) सेट करना होगा।

class myPixmap 
{ 
private: 
    static myPixmap* currentInstance; 

    static void drawCallback() 
    { 
    currentInstance->draw(); 
    } 

    void setupDrawCallback() 
    { 
    currentInstance = this; 
    ::glutDisplayFunc(myPixmap::drawCallback); 
    } 
}; 

तुम भी सी लिंकेज बनाम सी ++ लिंकेज, जिस स्थिति में आप extern "C" के साथ चारों ओर खेलने के लिए होगा के साथ समस्या हो सकती है। यदि ऐसा है, तो आपको अपने कॉलबैक के रूप में स्थिर सदस्य फ़ंक्शन के बजाय वैश्विक फ़ंक्शन का उपयोग करना पड़ सकता है, और है कि कॉल myPixmap::draw पर कॉल करें। की तरह कुछ:

class myPixmap 
{ 
public: 
    void draw(); 

private: 
    void setupDrawCallback(); 
}; 

myPixmap* g_CurrentInstance; 

extern "C" 
void drawCallback() 
{ 
    g_CurrentInstance->draw(); 
} 

void myPixmap::setupDrawCallback(); 
{ 
    ::g_CurrentInstance = this; 
    ::glutDisplayFunc(::drawCallback); 
} 
इस सब के साथ

,, संभव के रूप में कुछ परिवर्तन करने की कोशिश के बाद से यह वास्तव में एक तरह से w/ओपन एक सी एपीआई जा रहा है निपटने के लिए एक kludge है।

यदि आप कई उदाहरण चाहते हैं (मुझे नहीं लगता कि जीएलयूटी का उपयोग करने वाले अधिकांश लोग कई उदाहरण बनाते हैं, लेकिन शायद आप हैं), तो आपको उदाहरण प्राप्त करने के लिए std :: map का उपयोग करके समाधान पता लगाना होगा:

static std::map<int, myPixmap> instanceMap; 

आप intजो उदाहरण, मैं नहीं यकीन है कि :)

FYI हूँ को हल करने के लिए, आप कार्यों कि कोई पैरामीटर इस तरह से ले परिभाषित करना चाहिए कहां से मिल चाहते हैं:

void some_function() { } 

नहीं

void some_function(void) { } 
+0

धन्यवाद Merlyn; यह एक उत्कृष्ट समाधान है। मैंने पाया कि मेरे मामले में, मुझे सी लिंकेज बनाम सी ++ लिंकेज के साथ समस्याएं थीं, इसलिए मुझे उदाहरण के कोड के दूसरे ब्लॉक में दिखाए गए वैश्विक कार्य का उपयोग करना पड़ा। अंत में मैं कार्यक्रम संकलित करने में सक्षम था। मुझे कई उदाहरणों की आवश्यकता नहीं है, इसलिए यह अभी तक मेरे लिए कोई मुद्दा नहीं है। –

4

इस ट्यूटोरियल की जांच करें, मुझे लगता है कि यह आपके लिए क्या देख रहे है: मेरे लिए http://paulsolt.com/2010/08/glut-object-oriented-framework-on-github/

+0

धन्यवाद; यह एक दिलचस्प ट्यूटोरियल है। –

2

Merlyn समाधान फ्लॉप काम, तो मैं के बाहर currentInstance लाकर एक छोटे संशोधन किए गए कक्षा और यह काम किया:

Class myPixmap; 
static myPixmap* currentInstance; 
Class myPixmap { 
... 
} 
+0

अन्य सभी विकल्प मेरे लिए काम नहीं करते थे, लेकिन यह पूरी तरह से भाग गया। –

1

मुझे मेरलीन से सही उत्तर को समझने में परेशानी थी, इसलिए यहां यह सरलीकृत संस्करण है :

में myPixmap.h प्रदर्शन को बदलने कार्य करने के लिए स्थिर सदस्य कार्य करते हैं। कार्य करना चाहिए।

class myPixmap 
{ 
    //... 
    static void display(); 
    //... 
};