c++ - SDL2_image渲染无法正常工作

标签 c++ image textures sdl

我正在尝试使用 SDL2 中的 SDL_image v2.0.0 渲染图像。

我的 res/img/文件夹中有一个名为 Red.png 的图像。当我尝试加载纹理并使用 SDL_QueryTexture() 时,它会获取大小,一切都很好。但是当涉及到渲染实际图像时,我放置了一个矩形轮廓来知道图像在哪里,但是框中没有图像。

我用来加载和渲染纹理的类:

class LTexture
{
public:

    ~LTexture()
    {
        SDL_DestroyTexture(image_);
        renderer_ = nullptr;
        image_ = nullptr;
    }

    void init(SDL_Renderer* renderer)
    {
        printf("init texture\n");
        renderer_ = renderer;
    }

    void loadBMP(std::string filename)
    {
        printf("load texture\n");
        image_ = IMG_LoadTexture(renderer_, ("res/img/"+filename).c_str());
        SDL_QueryTexture(image_, NULL, NULL, &imgrect.w, &imgrect.h);
    }

    void render(int x, int y)
    {
        imgrect.x = x;
        imgrect.y = y;
        SDL_SetRenderDrawColor(renderer_, 128, 128, 128, 255);
        if (image_ != nullptr && renderer_ != nullptr)
        {
            printf("%i,  %i\n", imgrect.x, imgrect.y);
            SDL_RenderDrawRect(renderer_, &imgrect);
            SDL_RenderCopy(renderer_, image_, &imgrect, &imgrect);
        }
    }

    bool isLoaded()
    {
        return image_ != nullptr;
    }

private:
    SDL_Renderer* renderer_ = nullptr;
    SDL_Texture* image_ = nullptr;
    SDL_Rect imgrect;

};

我知道它正确地获取渲染器并加载图像,因为 DrawRect 函数可以工作,如果您没有猜到名字,Red.png 是一个红色矩形。

最佳答案

SDL_RenderCopy() 调用中为 srcrect 传递 nullptr:

SDL_RenderCopy(renderer_, image_, nullptr, &imgrect);

现在,如果 x 和/或 y 大于 image_,SDL 会将 srcrect 裁剪到一定范围image_,最终得到一个空矩形,并且不执行任何操作。

示例:

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

#include <cstdlib>
#include <string>

class LTexture
{
public:

    LTexture()
        : renderer_( nullptr )
        , image_( nullptr )
    { }

    ~LTexture()
    {
        SDL_DestroyTexture(image_);
        renderer_ = nullptr;
        image_ = nullptr;
    }

    void init(SDL_Renderer* renderer)
    {
        printf("init texture\n");
        renderer_ = renderer;
    }

    void loadBMP(std::string filename)
    {
        printf("load texture\n");
        image_ = IMG_LoadTexture(renderer_, filename.c_str());
        SDL_QueryTexture(image_, NULL, NULL, &imgrect.w, &imgrect.h);
    }

    void render(int x, int y)
    {
        imgrect.x = x;
        imgrect.y = y;
        SDL_SetRenderDrawColor(renderer_, 128, 128, 128, 255);
        if (image_ != nullptr && renderer_ != nullptr)
        {
            printf("%i,  %i\n", imgrect.x, imgrect.y);
            SDL_RenderDrawRect(renderer_, &imgrect);
            SDL_RenderCopy(renderer_, image_, nullptr, &imgrect);
        }
    }

    bool isLoaded()
    {
        return image_ != nullptr;
    }

private:
    SDL_Renderer* renderer_;
    SDL_Texture* image_;
    SDL_Rect imgrect;
};


int main( int argc, char** argv )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    IMG_Init( IMG_INIT_PNG );

    SDL_Window * window = SDL_CreateWindow
        (
        "SDL2", 
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 
        300, 300, 
        SDL_WINDOW_SHOWN
        );

    SDL_Renderer* renderer = SDL_CreateRenderer
        (
        window,
        0,
        SDL_RENDERER_ACCELERATED
        );

    LTexture tex;
    tex.init( renderer );
    tex.loadBMP( "red.png" );

    bool running = true;
    while( running )
    {
        SDL_Event ev;
        while( SDL_PollEvent( &ev ) )
        {
            if ( ev.type == SDL_QUIT )
                running = false;
        }

        SDL_SetRenderDrawColor( renderer, 0, 0, 0, 255 );
        SDL_RenderFillRect( renderer, NULL );

        tex.render( 50, 50 );

        SDL_RenderPresent( renderer );
        SDL_Delay( 33 );
    }

    SDL_DestroyRenderer( renderer );
    SDL_DestroyWindow( window );

    IMG_Quit();
    SDL_Quit();

    return 0;
}

red.png供引用:

red.png

关于c++ - SDL2_image渲染无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30764648/

相关文章:

c++ - C++ 中的三维 vector

html - CSS 动画 - 图像加倍

c++ - OpenCV 折线 CPU 使用率过高

c++ - 在 C++ 中高效使用 bool 值 true 和 false?

python - 在 Python 中使用 OpenCV 旋转图像时指定背景颜色

ruby-on-rails - 如何为 Rails Liquid GEM 创建 image_tag 过滤器

image-processing - Opencv特征提取与图像匹配

iphone - iOS:关于在屏幕上渲染纹理的纹理坐标的困惑

unity3d - (Unity3d)为什么四边形的视频纹理质量低于原始视频?

c++ - 如何追踪 SIGFPE/算术异常