SDL_Surface拒绝闪电战

SDL_Surface refuse to blit

本文关键字:闪电战 拒绝 Surface SDL      更新时间:2023-10-16

我正在尝试使用 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 问题,但 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需要源图面(您的汽车变量)和目标图面(您的字变量)。第一个代码段未显示字的创建方式和创建位置,但第二个代码段将字形显式设置为 NULL。

在函数中使用字形之前,应将创建的曲面分配给形SDL_BlitSurface字形。

编辑:要在表面上呈现字形,请先创建新曲面,用背景色填充它,然后在其上对字形进行闪亮。如果需要,可以使用矩形来定义 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);

手册说在使用SDL_BlitSurface()时不应该调用锁定的表面。在为您的表面打电话SDL_BlitSurface()之前,请尝试SDL_UnlockSurface()。有关更多信息,请查看 SDL_BlitSurface() 的返回值是什么。在此之前,您必须检查源表面以查看它是否已填充,并尝试在块状之前在目标表面上使用SDL_FillRect(),看看会发生什么。

虽然,请检查正确的表面格式:

http://wiki.libsdl.org/SDL_BlitSurface#Remarks

正如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);