Nazgul Temat założony przez niniejszego użytkownika |
OpenGL + GLUT Tworzenie wielu okien, obiektowo » 2017-01-06 23:59:29 Dzień dobry, mam problem z przesłaniem wskaźnika na metodę klasy. Ma to działać mniej więcej w taki sposób. Window::Window() { glutReshapeFunc( this->resize ); glutDisplayFunc( this->display ); glutIdleFunc( this->idle ); glutKeyboardFunc( this->keyDown ); glutKeyboardUpFunc( this->keyUp ); glutSpecialFunc( this->skeyDown ); glutSpecialUpFunc( this->skeyUp ); glutMouseFunc( this->mouseClick ); glutMouseWheelFunc( this->mouseWheel ); glutMotionFunc( this->mouseMotion ); glutPassiveMotionFunc( this->mouseMotion ); }
Próbowałem już to zmontować z szablonami(template <Window* w> ... nie wiedziałem jeszcze że to tak nie działa;P), z zapisaniem gdzieś wskaźnika na obsługiwany obiekt, funktorami itd. (Dobrze, bo wiele się nauczyłem;P , jednak rozwiązania nie znalazłem) Ma ktoś pomysł na rozwiązanie tego problemu? |
|
Gibas11 |
» 2017-01-07 00:19:21 Wstaw tam lambdy przechwytujące this. glutReshapeFunc([ this ]( ) ) { this->resize( ); } ); //edit: Możesz też użyć std::bind . glutReshapeFunc( std::bind( & Window::resize, * this, std::placeholders::_1 ); Ps. Kod pisany od ręki, więc mogą być jakieś drobne błędy. |
|
Nazgul Temat założony przez niniejszego użytkownika |
» 2017-01-07 00:21:44 Wstępnie mi się udało, jednak nie jestem dumny z tego rozwiązania, jakby ktoś umiał to zrobić 'zgrabniej' to byłoby super;P Window::Window() { static Window * window = this; glutReshapeFunc([]( int w, int h )->void { window->resize( w, h ); } ); glutDisplayFunc([]()->void { window->display(); } ); glutIdleFunc([]()->void { window->idle(); } ); glutKeyboardFunc([]( unsigned char key_, int x_, int y_ )->void { window->keyDown( key_, x_, y_ ); } ); glutKeyboardUpFunc([]( unsigned char key_, int x_, int y_ )->void { window->keyUp( key_, x_, y_ ); } ); glutSpecialFunc([]( int key_, int x_, int y_ )->void { window->skeyDown( key_, x_, y_ ); } ); glutSpecialUpFunc([]( int key_, int x_, int y_ )->void { window->skeyUp( key_, x_, y_ ); } ); glutMouseFunc([]( int button_, int state_, int x_, int y_ )->void { window->mouseClick( button_, state_, x_, y_ ); } ); glutMouseWheelFunc([]( int button_, int dir_, int x_, int y_ )->void { window->mouseWheel( button_, dir_, x_, y_ ); } ); glutMotionFunc([]( int x_, int y_ )->void { window->mouseMotion( x_, y_ ); } ); glutPassiveMotionFunc([]( int x_, int y_ )->void { window->mouseMotion( x_, y_ ); } ); }
|
|
Nazgul Temat założony przez niniejszego użytkownika |
» 2017-01-07 00:22:46 oooo w tym samym momencie, ale dzięki;P P.S. faktycznie z tym przechwytywaniem [this], nie będzie tego brzydkiego static |
|
mokrowski |
» 2017-01-07 00:54:08 |
|
Monika90 |
» 2017-01-07 11:55:38 Bez zmiennej globalnej lub statycznej nie da się tego zrobić. Jedyne rozsądne wyjście - nie używać GLUTa. |
|
Nazgul Temat założony przez niniejszego użytkownika |
» 2017-01-07 16:55:52 mmm patent z lambdą nie zadziałał. Okna się otwierają i długo dochodziłem do odpowiedzi czemu program nie działa poprawnie.. ten wskaźnik statyczny który wykorzystywałem w lambdach jak otwierałem pierwsze okno miało wskaźnik do pierwszego okna, potem jak drugie okno otwierałem to miało wskaźnik do drugiego, ale jak się okazało te lambdy co miał obsługiwać pierwsze okno również zmieniły swój wskaźnik na drugie okno przez co w dwóch oknach pojawiało się dokładnie to samo.. przechwytywanie [this] też nie działa, bo jest problem z konwertowaniem lambdy[]blabla na wskaźnik funkcji..
Dzięki Mokrowski za pomysł, jednak zawieranie coraz większej ilości bibliotek nie jest zbyt dobrą praktyką, potem są problemy z optymalizacją itp. także chciałbym to zrobić wykorzystując standard c++, mimo wszystko pięknie dziękuję, przeczytałem o funkcjonalności biblioteki i bardzo prawdopodobne, że kiedyś się przyda;)
Monika90, mógłbym Cię prosić o zaproponowanie czegoś innego zamiast GLUT'a, najlepiej jakby było obiektowe i jakby był jakiś prosty kurs w języku polskim, żeby ogarnąć podstawy, potem to już bez problemu na angielskich mogę jechać(jak tego kursu po polsku nie ma to też jakoś przeżyję;) ) i no zależy mi, żeby działało na wielu platformach |
|
Nazgul Temat założony przez niniejszego użytkownika |
» 2017-01-07 18:01:01 Okej, znalazłem GLFW3, nic jeszcze o niej nie wiem, także zostawię temat jeszcze chwilę otwarty, żeby ktoś mógł skrytykować;) Wszystkim bardzo dziękuję za pomoc;) |
|
« 1 » 2 |