SDL_RenderCopy() 意外行为

SDL_RenderCopy() unexpected behaviour

我很确定这根本不是意外,我可能误会了什么。我正在尝试调用其中一个重载的构造函数:

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

当我在 class 中创建一个静态方法来检索 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);

它们都是指针并且是 returning 连贯的值,但出于某种我不明白的原因,当传递给 SDL 时,我从 class 中获取的矩形是不根据矩形的值缩放。但是,如果我将我的静态方法更改为 return 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);

你的函数有问题getRectangle():

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

您正在 returning 对象的地址,rectangle,它具有自动存储期限。因此,对象在函数 returns 之后不存在。


您可能想在堆上分配一个 SDL_Rect 而 return 它的地址:

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