SDL_RenderCopy () неожиданное поведение - PullRequest
1 голос
/ 16 апреля 2020

Я почти уверен, что это совсем не неожиданно, я, вероятно, что-то неправильно понимаю. Я пытаюсь вызвать один из перегруженных конструкторов следующим образом:

SDL_RenderCopy(SDL_Renderer*, SDL_Texture*, SDL_Rect*, SDL_Rect*);

Проблема возникла, когда я создал в классе метод stati c для извлечения указателей SDL_Rect как таковых :

static SDL_Rect* getRectangle(rect r) {
    SDL_Rect rectangle{ r.x, r.y, r.w, r.h };
    return &rectangle;
}

Итак, вызов такой:

SDL_Rect* r = MyClass::getRectangle(srcRect);
SDL_Rect* r2 = MyClass::getRectangle(destRect);
SDL_RenderCopy(renderer, texture, r, r2);

Все они являются указателями и возвращают согласованные значения, но по какой-то причине я не понимаю, прямоугольники которые я извлекаю из своего класса при передаче в SDL, не масштабируется в соответствии со значениями прямоугольников. Но если я изменю свой метод stati c для возврата копии SDL_Rect, все будет работать так, как ожидается:

static SDL_Rect getRectangle(rect r) {
    SDL_Rect rectangle{ r.x, r.y, r.w, r.h };
    return rectangle;
}

И вызов:

SDL_Rect r = Video::getRectangle(srcRect);
SDL_Rect r2 = Video::getRectangle(destRect);

SDL_RenderCopy(renderer, texture, &r, &r2);

1 Ответ

3 голосов
/ 16 апреля 2020

Проблема в вашей функции getRectangle():

static SDL_Rect* getRectangle(rect r) {
    SDL_Rect rectangle{ r.x, r.y, r.w, r.h };
    return &rectangle;
}

Вы возвращаете адрес объекта rectangle, у которого автоматически c длительность хранения. Следовательно, объект не существует после возврата элемента управления из функции.


Возможно, вы захотите выделить SDL_Rect в куче и вместо этого вернуть его адрес:

static SDL_Rect* getRectangle(rect r) {
    return new SDL_Rect{ r.x, r.y, r.w, r.h };
}
...