سؤال

أنا بناء على محاكاة الفيزياء المحرك محرر في ويندوز.أريد بناء المحرر جزء باستخدام Qt و أريد تشغيل المحرك باستخدام SDL مع برنامج OpenGL.

كانت فكرتي الأولى لبناء محرر فقط باستخدام Qt و مشاركة الكثير من التعليمات البرمجية مع محرك (إدارة الموارد ، العارض ، الرياضيات).ولكن أود أيضا أن تكون قادرة على تشغيل المحاكاة داخل المحرر. هذا يعني أيضا أن حصة هذه المحاكاة البرمجية التي تستخدم SDL المواضيع.

لذا سؤالي هو:هل هناك طريقة إلى تقديم برنامج OpenGL إلى Qt النافذة باستخدام SDL?

لقد قرأت على شبكة الإنترنت أنه قد يكون من الممكن أن العرض SDL مع مقبض الإطار الذي لتقديم.أي شخص لديه خبرة دونغ ذلك ؟

كما مترابطة جزء من محاكاة قد يشكل مشكلة لأنه يستخدم SDL المواضيع.

هل كانت مفيدة؟

المحلول

بينما قد تحصل على عمل مثل أول إجابة توحي أنت من المحتمل أن واجهت مشاكل بسبب خيوط.لا توجد حلول بسيطة عندما يتعلق الأمر خيوط, و هنا سيكون لديك SDL Qt و OpenGL mainloop التفاعل.لا متعة.

أسهل و أعقل حل فصل كل أجزاء.بحيث SDL و Qt تشغيل في عمليات منفصلة و يكون لهم استخدام نوع من الرسائل للتواصل (أنصح d-bus هنا ).هل يمكن أن يكون SDL تجعل في حدود نافذة المحرر يرسل الأوامر عن طريق الرسائل.

نصائح أخرى

هذا هو تبسيط ما أقوم به في حياتي المشروع.يمكنك استخدامه تماما مثل العادية القطعة ، ولكن كما تحتاج, يمكنك استخدام الأمر m_Screen كائن أن يوجه SDL سطح وأنها سوف تظهر في القطعة :)

#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;
};

ويساعد هذا الأمل

ملاحظة:فإنه عادة ما يكون من المنطقي أن تعيين كل min و max حجم هذه القطعة إلى SDL سطح الحجم.

التقديم على برنامج opengl من QT تافهة (ويعمل بشكل جيد جدا) لا خبرة مباشرة من SDL ولكن هناك مثال على التطبيق هنا عن الاختلاط بهم.http://www.devolution.com/pipermail/sdl/2003-January/051805.html

هناك مقالة جيدة عن خلط QT widgewts مباشرة مع برنامج opengl هنا http://doc.trolltech.com/qq/qq26-openglcanvas.html قليلا بعد ما كنت بحاجة بدقة بل ذكي!

هل يمكن استخدام هذه المكتبة (انظر التجريبي الدليل):

https://github.com/kronat/libqsdl

وقد لطيفة اليوم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top