Я играл с проблемой учебника по манипулированию текстурой SDL2 — Lazy Foo Учебник по манипулированию текстурой Lazy Foo SDL2
но это даже не работает.
По-видимому, причина ошибки сегментации связана с форматом поверхности, использованным для создания текстуры, или с чем-то подобным.
Точка крушения 1:
SDL_Surface* formattedSurface = SDL_ConvertSurface( loadedSurface, SDL_GetWindowSurface( gWindow )->format, NULL );
Точка сбоя 2:
//Map colors
Uint32 colorKey = SDL_MapRGB( SDL_GetWindowSurface( gWindow )->format, 0, 0xFF, 0xFF );
Uint32 transparent = SDL_MapRGBA( SDL_GetWindowSurface( gWindow )->format, 0xFF, 0xFF, 0xFF, 0x00 );
Может ли кто-нибудь помочь в этом?
С уважением
Nevermind нашел это!
Точка крушения 1 должна быть заменена
formattedSurface = SDL_ConvertSurfaceFormat( loadedSurface, SDL_PIXELFORMAT_RGBA8888, NULL );
Точка сбоя 2 должна быть заменена на:
Uint32 colorKey = SDL_MapRGB( formattedSurface->format, 0, 0xFF, 0xFF );
Uint32 transparent = SDL_MapRGBA( formattedSurface->format, 0XFF, 0XFF, 0XFF, 0xFF );
ура
Я предполагаю, что вы говорите о линии 119?
//Convert surface to display format
SDL_Surface* formattedSurface = SDL_ConvertSurface( loadedSurface, SDL_GetWindowSurface( gWindow )->format, NULL );
Вам не нужно вручную указывать формат пикселя, как в первом обходном пути, но, если честно, Lazy не правильно вызвал SDL_ConvertSurface, и мне интересно, не вызывает ли это у вас проблему.
Правильный синтаксис, как показано в SDL Wiki, является:
SDL_Surface* SDL_ConvertSurface(SDL_Surface* src,
const SDL_PixelFormat* fmt,
Uint32 flags)
Также обратите внимание, что третий аргумент, флаги, «[…] не используются и должны быть установлены в 0; это остаток API SDL 1.2».
Я был предупрежден об этом и некоторых других повторяющихся ошибках, используя флаг компилятора -Weffc ++, а затем проверил вики, чтобы увидеть опции для флагов. Неплохая идея использовать его для предотвращения (невольного) вредных привычек.
Вы, вероятно, должны убедиться, что вы используете относительно новую версию своего набора инструментов и использовать флаги компилятора для c ++ 11. Я нашел эти шаги необходимыми по крайней мере для одного более раннего учебника Lazy Foo SDL2, касающегося новых строковых функций.
Попробуйте запустить отладчик и посмотрите, что именно вызывает сбой. Наблюдение за gWindow с самого начала и через шаг должно быть проницательным. У меня не было проблем с этим. Вы также можете получить странные сбои, если вам не хватает DLL или другого файла, который ожидает исполняемый файл.
Мне было бы интересно узнать ваши спецификации ОС, набор инструментов и версию, версии SDL2 и libs, а также увидеть все ошибки / предупреждения сборки и вывод консоли.