代码之家  ›  专栏  ›  技术社区  ›  Ross Light

如何与食人魔一起使用SDL?

  •  5
  • Ross Light  · 技术社区  · 16 年前

    OGRE SDL (如中所述) this article ),我似乎对出现在主渲染窗口后面的第二个窗口有问题。基本上,我使用的代码是:

    SDL_init(SDL_INIT_VIDEO);
    SDL_Surface *screen = SDL_SetVideoMode(640, 480, 0, SDL_OPENGL);
    
    Ogre::Root *root = new Ogre::Root();
    root->restoreConfig();
    root->initialise(false);
    
    Ogre::NameValuePairList windowSettings;
    windowSettings["currentGLContext"] = Ogre::String("True");
    Ogre::RenderWindow *window = root->createRenderWindow("MainRenderWindow", 640, 480, false, &windowSettings);
    window->setVisible(true);
    

    问题是,我如何摆脱额外的窗口?

    为了子孙后代,我正在使用OGRE1.6.4、MacOSX10.6.2和SDL1.2.14。

    2 回复  |  直到 16 年前
        1
  •  7
  •   Ross Light    16 年前

    最后我自己解决了这个问题。问题是食人魔的MacGL后端不尊重 currentGLContext SDL_CreateWindowFrom 调用从OGRE创建的窗口开始获取事件。还应该注意的是,食人魔窗口需要 macAPI 着手 cocoa

        2
  •  2
  •   c6burns    9 年前

    我看到你已经解决了你的问题,但不是所有的用户都会满足于将SDL降级到1.3。您可以使用SDL2和通过SDL_CreateWindow与OGRE创建的SDL2窗口。代码如下所示:

    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Cannot initialize SDL2!",
            "BaseApplication::setup");
    }
    
    Ogre::Root *root = new Ogre::Root();
    root->restoreConfig();
    root->initialise(false);
    
    Ogre::NameValuePairList params; // ogre window / render system params
    SDL_Window *sdlWindow = SDL_CreateWindow("myWindow", posX, posY, width, height, vflags);
    // see SDL_CreateWindow docs / examples for how to populate posX, posY, width, height, and vflags according to your needs
    
    SDL_SysWMinfo wmInfo;
    SDL_VERSION(&wmInfo.version);
    if (SDL_GetWindowWMInfo(sdlWindow, &wmInfo) == SDL_FALSE) {
        OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR,
            "Couldn't get WM Info! (SDL2)",
            "BaseApplication::setup");
    }
    
    params.insert(std::make_pair("macAPI", "cocoa"));
    params.insert(std::make_pair("macAPICocoaUseNSView", "true"));
    
    // grab a string representing the NSWindow pointer
    Ogre::String winHandle = Ogre::StringConverter::toString((unsigned long)wmInfo.info.cocoa.window);
    
    // assign the NSWindow pointer to the parentWindowHandle parameter
    params.insert(std::make_pair("parentWindowHandle", winHandle));
    
    Ogre::RenderWindow *ogreWindow = root->createRenderWindow("myWindowTitle", width, height, isFullscreen, &params);
    // see OGRE documentation on how to populate width, height, and isFullscreen to suit your needs
    
    // create OGRE scene manager, camera, viewports, etc