gpt4 book ai didi

c++ - SDL_Renderer通过函数后不会显示纹理

转载 作者:行者123 更新时间:2023-11-28 06:30:01 25 4
gpt4 key购买 nike

我对 SDL_Renderer 有点问题。我不明白为什么它不起作用。让我们看看这个例子,它工作正常:

bool running = true;
SDL_Window* window = SDL_CreateWindow("ASDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Texture* texture = IMG_LoadTexture(renderer, "asdf.bmp");
SDL_Event event;

while(running)
{
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE)
{
running = false;
}
break;
default:
break;
}
}
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
}
SDL_DestroyTexture(texture);

然后是类,当我通过函数传递渲染器时,它就不再工作了。

class Sprite
{
public:
Sprite(const std::string& path) : filePath(path) {};
~Sprite() { SDL_DestroyTexture(tex); };
void draw(SDL_Renderer* renderer);

private:
const std::string& filePath;
SDL_Texture* tex;
};

void Sprite::draw(SDL_Renderer* renderer)
{
printf("renderer sprite = %p\n", renderer);

tex = IMG_LoadTexture(renderer, filePath.c_str());
SDL_RenderCopy(renderer, tex, NULL, NULL);
}

int main(int argc, char **argv)
{
bool running = true;
SDL_Window* window = SDL_CreateWindow("ASDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Event event;

Sprite* sprite = new Sprite("asdf.bmp");
while(running)
{
printf("renderer main = %p\n", renderer);

while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE)
{
running = false;
}
break;
default:
break;
}
}
SDL_RenderClear(renderer);
sprite->draw(renderer);
SDL_RenderPresent(renderer);
}

return 0;
}

渲染器的地址在main函数和draw函数中是一样的。我知道我可能在这里犯了一些初学者的错误,但我找不到。

最佳答案

当您调用 sprite->draw 时,纹理会在每一帧加载。

您应该将行 tex = IMG_LoadTexture(renderer, filePath.c_str()); 移动到构造函数,以便它只加载一次。

这样做的原因是纹理不会在加载它的同一帧中准备好渲染。

作为旁注,您似乎没有使用各自的销毁函数清理 SDL_WindowSDL_Renderer 或调用 SDL_Quit,尽管我接受在提交代码示例时可能省略了这一点。

关于c++ - SDL_Renderer通过函数后不会显示纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27765712/

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