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 };
}
我很确定这根本不是意外,我可能误会了什么。我正在尝试调用其中一个重载的构造函数:
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 };
}