我正在尝试使用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:传递NULL表面
:::::::::::::::::编辑:::::::::::::::::::
好的,我已经修复了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
...
答案 0 :(得分:2)
SDL_BlitSurface需要源表面(您的汽车变量)和目标曲面(您的字形变量)。您的第一个代码段未显示字形的创建方式和位置,但您的第二个代码段明确将字形设置为 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);
答案 1 :(得分:1)
手动说明在使用SDL_BlitSurface()
时不应要求锁定表面。在为表面调用SDL_UnlockSurface()
之前尝试SDL_BlitSurface()
。有关更多信息,请检查SDL_BlitSurface()
的返回值。在此之前,你必须检查源表面是否填充,并尝试在blitting之前在目标表面上使用SDL_FillRect()
,看看会发生什么。
尽管如此,请检查表面格式是否正确:
答案 2 :(得分:0)
正如MahamGM所述,现在有一个格式问题已经解决了:
Uint32 rmask, gmask, bmask, amask;
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
ch = 65;
SDL_Surface * glyph = SDL_CreateRGBSurface(0,screen->w,screen->h,32,rmask,gmask,bmask,amask);
SDL_Surface * car = TTF_RenderGlyph_Blended(font,ch,color);
SDL_Rect glyphRect = {0, 0, 100, 100};
SDL_Rect carRect = {100, 0, 300, 300};
PHDEBUG << SDL_BlitSurface(car, NULL, glyph, &glyphRect);
PHDEBUG << SDL_BlitSurface(glyph, NULL, screen, &glyphRect);