Нет соответствующей функции для вызова 'SDL_UpperBlit' - PullRequest
0 голосов
/ 09 января 2019

Я относительно новичок в 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. Я пробовал, но у меня были некоторые проблемы с типами и конкатенацией, поэтому, если кто-нибудь знает, как я могу это сделать, дайте мне знать.

1 Ответ

0 голосов
/ 09 января 2019

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 в качестве имени функции, поскольку оно известно to вызывает проблемы (не так много для C ++, как для название покачивается, но все же).

...