Я относительно новичок в C++, поэтому, несмотря на мой опыт работы с другими языками C, это может быть простой ошибкой. Вот мой код:
#include <iostream>
#include <SDL2/SDL.h>
SDL_Window *window;
SDL_Surface *windowSurface;
SDL_Surface *image[3];
SDL_Surface *currentImage;
int close();
SDL_Rect gRect(int, int, int, int); //for method described below
int main(int argc, char *argv[]){
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 500, 500, SDL_WINDOW_SHOWN);
windowSurface = SDL_GetWindowSurface(window);
image[0] = SDL_LoadBMP("filepath/img.bmp");
image[1] = SDL_LoadBMP("filepath/img2.bmp");
image[2] = SDL_LoadBMP("filepath/img3.bmp");
currentImage = image[0];
bool done = false;
while(!done){
SDL_Rect rec;
rec.x = 100;
rec.y = 100;
rec.h = 100;
rec.w = 100;
SDL_BlitSurface(currentImage, NULL, windowSurface, rec);
SDL_UpdateWindowSurface(window);
}
return close();
}
int close(){
for(int i = 0; i < 3; i++){
SDL_FreeSurface(image[i]);
image[i] = nullptr;
}
currentImage = nullptr;
window = nullptr;
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
После запуска этой программы я получаю сообщение об ошибке «Нет соответствующей функции для вызова SDL_UpperBlit». По-видимому, это было заменено на SDL_BlitSurface, который я использую в своей программе.
Эта ошибка не появляется, если я заменяю «rec» в вызове функции на «NULL», и моя программа компилируется как обычно, с изображением, заполняющим экран.
Я попытался использовать функцию для создания SDL_Rect следующим образом:
SDL_Rect gRect(int x, int y, int w, int h){
SDL_Rect ret;
ret.h = h;
ret.w = w;
ret.x = x;
ret.y = y;
return ret;
}
и изменив вызов SDL_BlitSurface на
SDL_BlitSurface(currentImage, NULL, windowSurface, gRect(100, 100, 100, 100));
Это не решает проблему, и появляется та же ошибка. Если бы я мог получить какую-либо помощь с этим, я был бы очень признателен! Спасибо!
(Необязательно) PS: Я также был бы признателен за помощь с помещением объявлений «image [0]», «image [1]» и «image [2]» в цикл for. Я пробовал, но у меня были проблемы с типами и конкатенацией, поэтому, если кто-нибудь знает, как я могу это сделать, дайте мне знать.





Объявление функции SDL_BlitSurface:
int SDL_BlitSurface(SDL_Surface* src,
const SDL_Rect* srcrect,
SDL_Surface* dst,
SDL_Rect* dstrect)
Ваш фрагмент кода
SDL_Rect rec;
rec.x = 100;
rec.y = 100;
rec.h = 100;
rec.w = 100;
SDL_BlitSurface(currentImage, NULL, windowSurface, rec);
передает rec в качестве последнего аргумента, который имеет тип SDL_Rect, но ожидается SDL_Rect*. Это должно быть, например, SDL_BlitSurface(currentImage, NULL, windowSurface, &rec);
Я бы также посоветовал не использовать close в качестве имени функции, поскольку это проблемы известенкпричина (не так верно для C++, как у него есть искажение имени, но все же).
Спасибо, это было полезно!