Инициализировать 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 : %s\n", 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 : %s\n", 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);
Ничто не посылает мне ошибку, но ничего не происходит. И единственное, что я нашел в сети, было: "Почему ты хочешь это делать? Это бесполезно". Это правильно?
1 ответ
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);