SDL_Surface拒绝闪电战
SDL_Surface refuse to blit
我正在尝试使用 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);
相关文章:
- 访问被拒绝后,c++中的故障保护代码
- IpOpt拒绝解决不受约束的问题
- Termux权限被拒绝
- AWS Lambda C++运行时权限被拒绝
- WinSock2:connect() 提供"连接被拒绝"
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- 删除目录函数访问被拒绝
- 模板签名解析为 void(void) 被 GCC 拒绝;这是否有效C++?
- 为什么 Windows 拒绝访问某些进程的名称?
- std::stoi 的版本拒绝任何非数字
- 我在执行任何程序时被拒绝在 devcpp 中访问
- Windows C++:文件夹移动访问被拒绝错误
- AWS AMI 中的 Windows DPAPI 失败,访问被拒绝
- 使用崇高文本 3 进行C++拒绝授予权限?
- C++ 17 文件系统copy_file访问被拒绝
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 拒绝包含某些公共静态数据成员的类型
- 为什么mysql拒绝本地连接
- 安卓inotify_add_watch失败:权限被拒绝?
- SDL_Surface拒绝闪电战