首页 > 解决方案 > SDL2_image 渲染 - 只有在打印源 SDL_Rect 的属性时才能正确渲染图像

问题描述

我的 C++/SDL2 程序使用Sprites带有指向 s 的指针的 std::mapSDL_Texture和用于加载和渲染图像的成员函数的类,但是当程序运行时,窗口中没有显示任何加载的图像。

我发现 Sprites 实例被赋予了指向渲染器的正确指针并且IMG_LoadTexture没有返回 0。渲染器也可以正常工作,因为像 SDL_RenderDrawLine 这样的图元绘制得很好。

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

为什么会这样?

这是 Sprites 类中的两个重要成员函数。

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);
}

标签: c++sdl-2sdl-image

解决方案


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

SDL_QueryTexture允许您初始化wand h,但是xandy具有完全随机的值。至于为什么完全打印这些值可以解决问题,这超出了我的理解,但我怀疑随机值不适合SDL_RenderCopy(尤其是负值)。

如果你给xand赋予正确的值y,你的问题应该会消失。

如果您想了解有关如何初始化变量的更多信息,这篇 SO 帖子应该是一个不错的起点。

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


推荐阅读