SDL_Surface拒绝blit

时间:2013-10-15 09:40:48

标签: 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:传递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 ...

3 个答案:

答案 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(),看看会发生什么。

尽管如此,请检查表面格式是否正确:

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

答案 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);