C语言 将 SDL_Surface* 初始化为函数



我想将所有SDL_Surface初始化为一个函数,以便获得最清晰的主函数,但它似乎不起作用。我是这样做的:

void setImages(SDL_Surface* mur, SDL_Surface* caisse, SDL_Surface* caisseOk, SDL_Surface* menu, SDL_Surface* objectif)
{
    mur = IMG_Load("images\mur.jpg");
    caisse = IMG_Load("images\caisse.jpg");
    caisseOk = IMG_Load("images\caisse_ok.jpg");
    menu = IMG_Load("images\menu.jpg");
    objectif = IMG_Load("images\objectif.png");
}

并像这样主要地调用它:

setImages(mur, caisse, caisseOk, menu, objectif);
SDL_BlitSurface(menu, NULL, screen,&posMenu);
SDL_Flip(screen);

我测试过,IMG_Load工作正常,但它似乎没有在函数之外初始化我的SDL_Surface。有没有办法做到这一点?我想一定有一种方法可以在主外部正确初始化我的所有SDL_Surface......

同样,如果我将 SDL_Init(( 和 SDL_SetVideoMode(( 执行到一个函数中,我猜我的屏幕也不会初始化?这是我的函数:

void initVideo(SDL_Surface* screen)
{
    if(SDL_Init(SDL_INIT_VIDEO) <0)
    {
        fprintf(stderr,"Erreur lors de l'initialisation video : %sn", SDL_GetError());
        exit(EXIT_FAILURE);
    }
    screen = SDL_SetVideoMode(640,420,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
    if(screen == NULL)
    {
        fprintf(stderr,"Erreur lors de la configuration video : %sn", SDL_GetError());
        exit(EXIT_FAILURE);
    }
}

而我的电话进入主要:

SDL_Surface *screen = NULL, *menu = NULL, *marioH = NULL, *marioD = NULL, *marioB = NULL, *marioG = NULL,
                *caisse = NULL, *caisseOk = NULL, *objectif = NULL, *mur = NULL;
    SDL_Rect posMenu, posMario;
    initVideo(screen);

没有什么会给我发送错误,但似乎什么也没发生。我在网上发现的唯一一件事是"你为什么要这样做?没用的"。是吗?

C使用按值传递进行函数参数传递。

看起来,您的setImages()函数会更改参数指针本身。

在函数setImages()中,您可以更改传递的指针所指向的值,而不是指针本身。返回后,在 main() 中,您的指针保持不变 [未初始化,如果在调用之前]。

要实现所需的功能,您需要从main()传递指向这些指针的指针 [这些指针地址]。

例如,您可以将setImages()函数更改为

void setImages(SDL_Surface** mur, SDL_Surface** caisse, SDL_Surface** caisseOk, SDL_Surface** menu, SDL_Surface** objectif)
{
           //put some NULL check for sanity
    *mur = IMG_Load("images\mur.jpg");
    *caisse = IMG_Load("images\caisse.jpg");
   .
   .
}

并从main()打电话给喜欢

setImages(&mur, &caisse, &caisseOk, &menu, &objectif);

最新更新