gpt4 book ai didi

c++ - SDL2_image 渲染不正常

转载 作者:行者123 更新时间:2023-11-30 05:42:11 30 4
gpt4 key购买 nike

我正在尝试使用 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_,最后是一个空的 rect,什么也不做。

例子:

#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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com