c++ - SDL_Surface 拒绝 blit

标签 c++ blit sdl-2

我正在尝试使用 SDL 制作一个非常小且简单的片段。这个就像一个魅力:

SDL_Window * window = SDL_CreateWindow("SDLTest", 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_SWSURFACE);
screen = SDL_GetWindowSurface(window);
SDL_Color color={0,0,0};
TTF_GlyphMetrics(font, ch, &minx, &maxx, &miny, &maxy, NULL);
SDL_Surface * car =TTF_RenderGlyph_Blended(font,ch,color);
SDL_Rect textRect = {offsetX, offsetY, 0, 0};
if(SDL_BlitSurface( car, NULL, glyph, &screen ))
qDebug() << SDL_GetError();

而这个根本不起作用:

SDL_Surface * glyph = NULL;
SDL_Surface * car = TTF_RenderGlyph_Blended(font,ch,color);
qDebug() << TTF_GetError();
SDL_Rect textRect = {0, 0, car->w, car->h};
if(SDL_BlitSurface( car, NULL, glyph, &textRect ))
qDebug() << SDL_GetError();

TTF_GetError() 什么都不返回,所以我假设 TTF_RenderGlyph_Blended 工作正常并且 SDL_GetError() 发送给我:

SDL_UpperBlit: passed a NULL surface

::::::::::::::::::编辑::::::::::::::::::

好的,我已经修复了 NULL 问题,但是 blit 还不是很好:

ch = 66;
SDL_Surface * glyph = TTF_RenderUTF8_Blended(font, "Z", color);
SDL_UnlockSurface(glyph);
SDL_Surface * car = TTF_RenderGlyph_Blended(font,ch,color);
SDL_Rect textRect = {0, 0, car->w, car->h};
qDebug() << SDL_BlitSurface(car, NULL, glyph, &textRect);
qDebug() << SDL_BlitSurface(glyph, NULL, screen, &textRect);

应该显示 B 但显示 Z...

最佳答案

SDL_BlitSurface需要源表面(您的 car 变量)和目标表面(您的 glyph 变量)。您的第一个代码段没有显示 glyph 的创建方式和位置,但您的第二个代码段明确地将 glyph 设置为 NULL

在 SDL_BlitSurface 函数中使用它之前,您应该将创建的表面分配给 glyph

编辑: 为了在表面上渲染字形,首先创建新表面,用背景颜色填充它,然后在其上 blit 字形。如果需要,您可以使用矩形来定义 blit 位置:

SDL_Surface * glyph = SDL_CreateRGBSurface(0, 100, 100, 32, 0, 0, 0, 0);
SDL_FillRect(glyph, NULL, SDL_MapRGB(glyph->format, 255, 255, 255);

ch = 66;
SDL_Surface * car = TTF_RenderGlyph_Blended(font, ch, color);

qDebug() << SDL_BlitSurface(car, NULL, glyph, NULL);
qDebug() << SDL_BlitSurface(glyph, NULL, screen, NULL);

关于c++ - SDL_Surface 拒绝 blit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19377924/

相关文章:

python - 屏幕仅在我检查用户输入 pygame 时更新

sdl - 什么是SDL中的Blit?

c++ - glVertexAttribDivisor 在 nVidia 上无法正常工作?

c++ - SDL2 OpenGL 窗口立即关闭

c++ - boost 程序选项计算标志的出现次数

c++ - 递归函数如何对二叉树进行运算?

c - SDL - Blit Surface 将浮点值作为 rect 参数传递

我可以比较 2 个 SDL_Surface(它们是否相同)

c++从继承链获取对外部成员的访问

c++ - 析构函数 C++ 中的异常