SDL_Surface отказывается от блиц

0

Я пытаюсь сделать очень маленький и простой фрагмент с 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...

Теги:
sdl-2
blit

3 ответа

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);
2

SDL_BlitSurface требует исходную поверхность (переменную вашего автомобиля) и целевую поверхность (ваша переменная глифа). Ваш первый фрагмент не показывает, как и где создается глиф, но ваш второй фрагмент явно устанавливает символ в NULL.

Вы должны назначить созданную поверхность глифов перед его использованием в функции SDL_BlitSurface.

Изменение: для отображения глифов на поверхности сначала создайте новую поверхность, заполните ее цветом фона, а затем нажмите на нее глиф. Вы можете использовать прямоугольник для определения blit position, если хотите:

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);
  • 0
    Смотрите редактирование, оно не работает ...
  • 0
    Я не совсем уверен, что вы пытаетесь достичь, но вы можете попробовать этот код вместо этого: ch = 66; SDL_Surface * car = TTF_RenderGlyph_Blended(font,ch,color); SDL_Surface * glyph = SDL_ConvertSurface(car, car->format, car->flags); SDL_Rect textRect = {0, 0, car->w, car->h}; qDebug() << SDL_BlitSurface(glyph, NULL, screen, &textRect);
Показать ещё 3 комментария
1

В руководстве указано, что при использовании SDL_BlitSurface() вы не должны вызывать заблокированные поверхности. Попробуйте выполнить SDL_UnlockSurface() перед вызовом SDL_BlitSurface() для ваших поверхностей. И для получения дополнительной информации проверьте, что такое возвращаемое значение SDL_BlitSurface(). Перед этим вам нужно проверить исходную поверхность, чтобы увидеть, заполнена ли она или нет, и попытаться использовать SDL_FillRect() на целевой поверхности перед blitting и посмотреть, что произойдет.

Хотя, проверьте правильность формата поверхности:

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

  • 0
    Я пытался с разблокировкой и возвращение 0 на обоих ...
  • 0
    Ну, единственная оставшаяся возможность - проверить ваш textRect . Попробуйте передать NULL поскольку вы не делаете ничего, кроме установки нулевых координат.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню