Я пытаюсь сделать очень маленький и простой фрагмент с 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, но блит это еще не хорошо:
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 требует поверхности источника (ваш автомобиль переменная) и поверхность назначения (ваш глиф переменная). Ваш первый фрагмент не показывает, как и где глиф создан, но ваш второй фрагмент явно устанавливает глиф в НОЛЬ.
Вы должны назначить созданную поверхность глиф перед использованием в функции SDL_BlitSurface.
Редактировать:
Для рендеринга глифов на поверхности сначала создайте новую поверхность, залейте ее цветом фона, а затем скопируйте на нее глиф. Вы можете использовать прямоугольник для определения положения блита, если хотите:
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_UnlockSurface()
перед звонком SDL_BlitSurface()
для ваших поверхностей. И для получения дополнительной информации проверьте, что является возвращаемым значением SDL_BlitSurface()
, Перед этим вы должны проверить исходную поверхность, чтобы увидеть, заполнена она или нет, и попытаться использовать SDL_FillRect()
на поверхности назначения перед блиттингом и посмотрим, что произойдет.
Хотя, проверьте правильность формата поверхности:
Как 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);