【问题标题】:SDL2_image rendering - Images render properly only when source SDL_Rect's properties are printedSDL2_image 渲染 - 只有在打印源 SDL_Rect 的属性时才能正确渲染图像
【发布时间】:2020-07-24 10:15:16
【问题描述】:

我的 C++/SDL2 程序使用 Sprites 类和指向 SDL_Textures 的指针的 std::map 和用于加载和渲染图像的成员函数,但是当程序运行时,加载的图像都没有出现在窗口。

我发现 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-2 sdl-image


    【解决方案1】:

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

    您的SDL_QueryTexture 允许您初始化wh,但xy 具有完全随机的值。至于为什么完全打印值可以解决问题,我无法理解,但我怀疑随机值与SDL_RenderCopy 不匹配(尤其是负值)。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 2015-08-26
      • 2019-01-25
      • 2012-11-28
      • 1970-01-01
      • 2015-12-06
      • 2013-04-04
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多