#sdl #sdl-2
#sdl #sdl-2
Вопрос:
Я пробиваюсь через преобразование 1.2-> 2.0, по одной проблеме за раз. Пока у меня есть звук, взаимодействие и экран, который показывает… ну, хоть что-то.
Я уверен, что проблема связана с разрядностью и / или форматами. Исходный код использовал 8-битные индексированные SPR-файлы для спрайтов, загружал их в серию uint8 *buffu
, а затем выводил их на поверхность дисплея.
Я портировал это, следуя руководству и значительному методу проб и ошибок (множество режимов и переключателей просто не работают на моей машине), создав текстуру и поверхность, позволяя старому коду всплывать на поверхность, а затем сделать это…
SDL_UpdateTexture(sdltxtr, NULL, sdlsurf->pixels, 640 * sizeof (uint8));
SDL_RenderClear(sdlrend);
SDL_RenderCopy(sdlrend, sdltxtr, NULL, NULL);
SDL_RenderPresent(sdlrend);
Результатом является экран с материалом, но все это смещено. Я предполагаю, что это связано с тем, что поверхность и текстура имеют разные битовые глубины и форматы, чем спрайты…
sdltxtr = SDL_CreateTexture(sdlrend,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
640, 480);
sdlsurf = SDL_CreateRGBSurface(0, 640, 480, 8, 0,0,0,0);
Я пробовал различные настройки из документации, чтобы попытаться получить поверхность или текстуру с 8-разрядным индексом, но все флаги делают поверхность или текстуру пустыми.
Есть предложения?
Комментарии:
1. Ваш surface всегда обновляется? Или это спрайт, который не меняется со временем?
2. Поверхность постоянно обновляется, поскольку в нее вводятся новые растровые изображения. Тем не менее, вы можете увидеть проблему, как только начнется игра, период, когда все, что она делает, это загружает несколько растровых изображений в Surface и сидит там в ожидании ввода. Я вижу, что растровые изображения загружаются в поверхность / текстуру, но они «неправильные».
Ответ №1:
Вы упоминаете индексированную 8-разрядную графику. Предполагая, что индексированный означает палитированный, вы не можете просто использовать пиксельный буфер, поскольку это всего лишь список записей в связанной цветовой палитре SDL_Surface.
При этом вам необходимо создать буфер, который фактически содержит правильные значения ARGB из палитры, но не индексные значения, связанные с пиксельным буфером.
Вы можете использовать SDL_ConvertSurfaceFormat() для преобразования вашей 8-разрядной палитрированной поверхности в 32-разрядную ARGB-поверхность и поместить ее буфер в SDL_Texture. Вы также можете создать собственный 32-разрядный буфер ARGB и выполнить преобразование самостоятельно, просмотрев правильные коды палитры (хотя первый вариант в большинстве случаев будет проще).
Перед преобразованием 8-разрядной SDL_Surface в 32-разрядную, вы должны связать с ней допустимую палитру (SDL_SurfaceSetPalette()).