1

SDL と C++ を使用してゲームを作成していますが、ビットマップをレンダリングしようとすると、実行時に「OpenGL がアクティブです。SDL_GL_SwapBuffers() を使用してください」というエラーが表示されます。しかし問題は、私は SDL_GL_SwapBuffers() を使っているということです。コードは次のとおりです。

描画機能:

bool d2Sprite::Draw(SDL_Surface *dest, SDL_Surface *src, int x, int y)
{
if(dest == NULL || src == NULL)
{
    cout << "Unable draw sprite! " << SDL_GetError() << endl;
    return false;
}

SDL_Rect destR;
destR.x = x;
destR.y = y;

SDL_BlitSurface(src, NULL, dest, &destR);

return true;
}

ゲーム ループ: void d2Main::GameLoop() { cout << "ゲーム ループ実行中!" << endl;

d2Main::Load();
while(d2Main::gameRunning)
{
    while(SDL_PollEvent(&event))
    {
        d2Main::HandleEvents(&event);
    }

    d2Main::Update();

    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();

    d2Main::Render();
    SDL_UpdateRect(screen, 0, 0, 0, 0);
    glPopMatrix();
    SDL_GL_SwapBuffers(); // <-- I AM USING IT
    SDL_Delay(0.8);
}

SDL_Quit();
}
4

1 に答える 1

1

SDL ソースでエラー メッセージを検索します。

http://svn.libsdl.org/tags/SDL/release-1.2.10/src/video/SDL_video.c

ここで発生します:

void SDL_UpdateRects (SDL_Surface *screen, int numrects, SDL_Rect *rects)
{
    int i;
    SDL_VideoDevice *video = current_video;
    SDL_VideoDevice *this = current_video;

    if ( (screen->flags & (SDL_OPENGL | SDL_OPENGLBLIT)) == SDL_OPENGL ) {
        SDL_SetError("OpenGL active, use SDL_GL_SwapBuffers()");
        return;
    }

    //...

そのため、おそらく への呼び出しを取り除く必要があります。フラグSDL_UpdateRectsを使用していない限り、OpenGL を使用している場合はサポートされていません。SDL_OPENGLBLITしたがって、代わりにフラグを設定することもできます。ただし、(a)遅く、(b)公式にサポートされなくなっていることに注意してください。

于 2013-01-02T14:17:13.420 に答える