SDL2_image 渲染 - 仅当源 SDL_Rect 的属性被打印时图像才能正确渲染

SDL2_image rendering - Images render properly only when source SDL_Rect's properties are printed

我的 C++/SDL2 程序使用 Sprites class 和 std::map 指向 SDL_Texture 的指针和成员函数来加载和渲染图像,但是当程序 运行 none 的加载图像显示在 window.

我发现 Sprites 实例被赋予了一个指向渲染器的正确指针,而 IMG_LoadTexture 没有 return 0。渲染器也能正常工作,因为像 SDL_RenderDrawLine 这样的原语画得很好。

有趣的是,当我想通过打印源矩形的宽度和高度来检查 SDL_QueryTexture 是否给出了正确的尺寸时,程序正确地渲染了图像。打印的尺寸也是正确的,尝试打印 x 和 y 也修复了它。

为什么会这样?

下面是Sprites中两个重要的成员函数class。

void Sprites::load(std::string id, std::string filename, int length) {
    SDL_Texture* tex = IMG_LoadTexture(renderer, filename.c_str());
    if (tex == 0) {
        printf("Texture %s could not be loaded\n", filename.c_str());
    }

    sprmap[id] = tex;
    lengthmap[id] = length;
    printf("%s should be loaded now\n", id.c_str());
}

void Sprites::render(std::string id, float x, float y, int frame) {
    SDL_Rect src;
    SDL_Rect dest;
    SDL_QueryTexture(sprmap[id], NULL, NULL, &src.w, &src.h);
    src.w /= lengthmap[id];
    printf("src x: %s, src y %s\n", std::to_string(src.x).c_str(), std::to_string(src.y).c_str()); 
    //Images do not render when above line is omitted
    src.x = frame*src.w;
    dest.x = x;
    dest.y = y;
    dest.w = src.w;
    dest.h = src.h;
    SDL_RenderCopy(renderer, sprmap[id], &src, &dest);
}

您的 SDL_Rect 未正确初始化。打印“修复”它,但只是偶然。

您的 SDL_QueryTexture 允许您初始化 wh,但是 xy 具有完全随机的值。至于为什么完全打印值修复问题超出了我的范围,但我怀疑随机值与 SDL_RenderCopy (尤其是负值)不匹配。

如果您给 xy 正确的值,您的问题应该会消失。

如果您想阅读更多有关如何初始化变量的信息,this SO post 应该是一个不错的起点。

另一种方法是 zero initialisation 以确保您的结构始终具有默认值 0。 最简单的方法应该是这样的:SDL_Rect src{};