繁体   English   中英

SDL2不使用纹理绘制图像

[英]SDL2 does not draw image using texture

我一直在尝试获取一个简单的SDL2程序以显示图像然后退出。 我有以下代码:

/* compile with `gcc -lSDL2 -o main main.c` */

#include <SDL2/SDL.h>
#include <SDL2/SDL_video.h>
#include <SDL2/SDL_render.h>
#include <SDL2/SDL_surface.h>
#include <SDL2/SDL_timer.h>

int main(void){
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window * w = SDL_CreateWindow("Hi", 0, 0, 640, 480, 0);
    SDL_Renderer * r = SDL_CreateRenderer(w, -1, 0);

    SDL_Surface * s = SDL_LoadBMP("../test.bmp");
    SDL_Texture * t = SDL_CreateTextureFromSurface(r, s);
    SDL_FreeSurface(s);

    SDL_RenderClear(r);
    SDL_RenderCopy(r, t, 0, 0);
    SDL_RenderPresent(r);

    SDL_Delay(2000);

    SDL_DestroyTexture(t);
    SDL_DestroyRenderer(r);
    SDL_DestroyWindow(w);

    SDL_Quit();
}

我知道我已经省略了每个功能成功的常规检查-它们都成功了,为了便于阅读将其删除。 我也知道我使用了0而不是空指针或正确的枚举值,这也不是问题的根源(因为当我正确构造程序时会出现相同的问题,这是为了测试而设计的快速测试用例最简单的情况)

目的是出现一个窗口并显示图像(肯定在该目录中),等待几秒钟然后退出。 但是,结果是该窗口正确显示,但该窗口被黑色填充。

额外的注释SDL_ShowSimpleMessageBox()似乎可以正常工作。 我不知道这与框架的其余部分有什么关系。

我将清除这一点,您想要制作一个纹理,直接进行操作以简化控制,此外,它还使您可以更好地控制图像,尝试使用此代码,进行全面测试,然后开始工作,所有您想要的只是用于窗口显示图像并在2秒内关闭,对吗? 如果未加载图像,则为图像的位置。

/* compile with `gcc -lSDL2 -o main main.c` */

#include <SDL.h>
#include <SDL_image.h>  
#include <iostream> //I included it since I used cout


int main(int argc, char* argv[]){
bool off = false;
int time;

SDL_Init(SDL_INIT_VIDEO);
SDL_Window * w = SDL_CreateWindow("Hi", 0, 0, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer * r = SDL_CreateRenderer(w, -1, SDL_RENDERER_ACCELERATED);

SDL_Texture * s = NULL;
s = IMG_LoadTexture(r, "../test.bmp"); // LOADS A TEXTURE DIRECTLY FROM THE IMAGE
if (s == NULL)
{
cout << "FAILED TO FIND THE IMAGE" << endl; //we did this to check if IMG_LoadTexture found the image, if it showed this message in the cmd window (the black system-like one) then it means that the image can't be found
}
SDL_Rect s_rect; // CREATES THE IMAGE'S SPECS
s_rect.x = 100;    // just like the window, the x and y values determine it's displacement from the origin which is the top left of your window
s_rect.y = 100;
s_rect.w = 640; //width of the texture
s_rect.h = 480; // height of the texture

time = SDL_GetTicks(); //Gets the current time

while (time + 2000 < SDL_GetTicks()) //adds 2 seconds to the past time you got and waits for the present time to surpass that
{
SDL_RenderClear(r);
SDL_RenderCopy(r, s, NULL, &s_rect); // THE NULL IS THE AREA YOU COULD USE TO CROP THE IMAGE
SDL_RenderPresent(r);

}

SDL_DestroyTexture(s);
SDL_DestroyRenderer(r);
SDL_DestroyWindow(w);

return 0;   //returns 0, closes the program.
}

如果您想在窗口上看到一个关闭按钮并使它生效,请创建一个事件,然后将其添加到while区域以检查其是否等于SDL_Quit();,因为您希望它包含在其中,所以我不包括它立即在2秒内关闭,因此使关闭按钮无效。

快乐编码

使用SDL_RENDERER_SOFTWARE作为渲染器标志时,此方法有效。 它还在另一台机器上工作。 猜猜我的配置肯定有问题,尽管我不确定这是什么,因为仍然没有显示任何错误。 嗯,标记为已解决。

我相信这是(不是100%肯定,但是相当确定),这是由于以下代码行:

SDL_Renderer * r = SDL_CreateRenderer(w, -1, 0);

根据SDL Wiki文章SDL_CreateRenderer ,传递的参数所需的参数如下:

  • SDL_Window *窗口
  • 整数指数
  • Uint32标志

您正确地传递了指向窗口的指针以及正确地传递了索引,但是缺少标志表示SDL SDL应该使用默认渲染器 大多数系统都有应为渲染器使用的应用程序的默认设置,并且可以在每个应用程序的基础上对其进行修改。 如果没有为特定应用程序提供默认设置,则渲染查找将立即检查默认渲染设置列表。 SDL Wiki通过备注部分底部的以下行简要地引用了此列表:

“请注意,不提供标志会优先考虑可用的SDL_RENDERER_ACCELERATED渲染器。”

Wiki此处未解释的是,Wiki所指的“渲染器”来自默认渲染器列表。

这使我相信您在计算机历史过程中的某个位置更改了设置,或者在Visual Studio设置中的其他位置更改了设置,导致找不到列表 因此,由于您的机器设置,您必须明确告知SDL使用哪个渲染器 否则,使用参数0应该就可以了。 最后,这没有什么坏处,因为最好是在代码中显式而不是隐式。

(也就是说,我的所有推论都是基于以下事实:我假设您说的所有内容都可以正常工作 。如果不是这样,那么问题可能是由于缺乏错误检查。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM