首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL_Surface拒绝blit

SDL_Surface拒绝blit
EN

Stack Overflow用户
提问于 2013-10-15 09:40:47
回答 3查看 1.3K关注 0票数 0

我试着用SDL做一个非常小而简单的片段。这首歌很有魅力:

代码语言:javascript
复制
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();

这个根本不管用:

代码语言:javascript
复制
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:传递一个空曲面

**编辑:

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

代码语言:javascript
复制
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 ..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-15 13:14:20

正如MahamGM所说,现在解决了一个格式问题:

代码语言:javascript
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2013-10-15 09:58:59

BlitSurface需要源面( car变量)和目标面(字形变量)。您的第一个代码段没有说明如何和在何处创建字形,但是第二个代码片段显式地将字形设置为NULL

在使用函数之前,您应该将创建的图面分配给字形。

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

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2013-10-15 09:55:24

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

不过,请检查是否有正确的表面格式:

BlitSurface#Remarks

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19377924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档