SDL_RenderCopy()意外行为

问题描述 投票:1回答:1

我很确定这一点也不意外,我可能误会了一些东西。我正在尝试这样调用一个重载的构造函数:

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

当我在类中创建一个静态方法来检索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时从类中获取的矩形无法根据矩形的值进行缩放。但是,如果我更改静态方法以返回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);

c++ pointers sdl sdl-2
1个回答
2
投票

问题出在您的函数getRectangle()中:

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

您正在返回具有自动存储期限的对象rectangle的地址。因此,控件从函数返回后,该对象不存在。


您可能想在堆上分配SDL_Rect并返回其地址:

static SDL_Rect* getRectangle(rect r) {
    return new SDL_Rect{ r.x, r.y, r.w, r.h };
}
© www.soinside.com 2019 - 2024. All rights reserved.