C SDL-在blit期间不得锁定曲面

C SDL-在blit期间不得锁定曲面,c,linux,sdl,sdl-2,sdl-image,C,Linux,Sdl,Sdl 2,Sdl Image,我想用C写一个简单的游戏。我用SDL2来画东西。这是一个主循环: ... while( !quit_f ) { //Handle events on queue while( SDL_PollEvent( &e ) != 0 ) { //User requests quit if( e.type == SDL_QUIT ) { quit_f = 1; } } c

我想用C写一个简单的游戏。我用SDL2来画东西。这是一个主循环:

...
while( !quit_f )
{
    //Handle events on queue
    while( SDL_PollEvent( &e ) != 0 )
    {
        //User requests quit
        if( e.type == SDL_QUIT )
        {
            quit_f = 1;
        }
    }
    currTime = clock();
    dt = (float)((currTime - t)/1000.0f);
    update_player(dt, player);

    printf("locks before drawing: %i\n", player->surface->locked );
    draw_player(player);

    printf("\n");
    printf("%p\n", player->surface);
    printf("locks before window update: %i\n", player->surface->locked );

    //Update window surface
    SDL_UpdateWindowSurface( window );

    printf("%s\n", SDL_GetError());
    printf("locks after window update: %i\n", player->surface->locked );
    printf("\n");
    t = currTime;
}
...
以下是draw_player函数:

void draw_player(struct GameObject * self){
    printf("%p\n", self->surface);
    printf("locks iside draw_player - before blit: %p\n", self->surface->locked);
    SDL_BlitSurface(window, NULL, self->surface, NULL);
    printf("locks iside draw_player - after blit: %p\n", self->surface->locked);
}
它编译得很好,但运行后不显示播放器。输出:

locks before drawing: 0
0x89795b0
locks iside draw_player - before blit: (nil)
locks iside draw_player - after blit: (nil)

0x89795b0
locks before window update: 0
Surfaces must not be locked during blit
locks after window update: 0
我不明白为什么
self->surface->locked
NULL在draw\u player函数中。指向曲面的指针是相同的,所以。。。我真的不明白。 我没有在代码中的任何地方调用SDL_LockSurface,但SDL抱怨在blit期间曲面被锁定-
在blit期间曲面不能被锁定。我试图在SDL_BlitSurface之前调用SDL_UnlockSurface,但没有任何改变。有什么想法吗?我必须注意,我是C和SDL中的begginer。
我经营Fedora24。因为SDL是跨平台的库,所以它不应该是一个问题。
我使用gcc 6.1.1

玩家的精灵是png格式的,这就是我使用IMG_加载的原因。以下是如何创建播放器:

void init_player(struct GameObject * player, char * path, float x, float y){
    SDL_Surface * image = IMG_Load(path);
    if(image == NULL){
        printf("Error while loading png: %s\n", IMG_GetError()); 
        return;
    }

    // direction vector
    player_dir = malloc(sizeof(Vector2d));
    player_dir->x = 0.0f; 
    player_dir->y = 0.0f;

    // destination rectangle
    SDL_Rect * dRect = malloc(sizeof(SDL_Rect));
    dRect->x = round(x);
    dRect->y = round(y);
    dRect->w = image->w;
    dRect->h = image->h;

    player->surface = image;
    player->destRect = dRect;
    player->x = x;
    player->y = y;
    player->width = image->w;
    player->height = image->h;    
    player->update = update_player; // function pointer
    player->draw = draw_player; // function pointer
}
我最后要告诉你的是。我在GameObject结构中存储用于绘制和更新函数的指针。所以我调用update\u player,比如
player->update(…)
。绘图函数也是如此。这是一个有点粗俗的风格,但我喜欢它。我试着马上给draw_player打电话。由于结果是一样的,我认为我的编码风格不是问题。但我可能错了。请随意纠正我

编辑: 我可能发现了那个虫子<代码>SDL_BlitSurface(窗口,空,自->曲面,空)应该是
SDL\u BlitSurface(屏幕表面,NULL,自我->表面,NULL)。Window是指向SDL_Window的指针,screenSurface是指向SDL_Surface的指针。为什么它在编译过程中没有抛出错误??
好的,错误消失了。但什么也没有显示出来

第二次编辑 我找到了。这真是个愚蠢的错误。 这是正确的解决方案:
SDL\u BlitSurface(self->surface,NULL,screenSurface,NULL)
以下是SDL_BlitSurface的外观:

int SDL_BlitSurface(SDL_Surface*    src,
                const SDL_Rect* srcrect,
                SDL_Surface*    dst,
                SDL_Rect*       dstrect)

第一个曲面必须是源曲面,第三个曲面必须是目标曲面。它是相反写的。它引起了一个bug。

嗯。。。我可能会找到那只虫子。SDL_BlitSurface(窗口…)应该有SDL_曲面,而不是指向SDL_窗口的窗口。错误已消失,但仍不显示任何内容。传递错误的指针类型将发出警告,而不是错误。如果你不抑制警告,你可能会忽略它
-Werror
标志可以指示gcc将所有生成的警告视为错误(即停止编译并返回失败)。@keltar谢谢!:)好。。。我可能会找到那只虫子。SDL_BlitSurface(窗口…)应该有SDL_曲面,而不是指向SDL_窗口的窗口。错误已消失,但仍不显示任何内容。传递错误的指针类型将发出警告,而不是错误。如果你不抑制警告,你可能会忽略它
-Werror
标志可以指示gcc将所有生成的警告视为错误(即停止编译并返回失败)。@keltar谢谢!:)