Почему я не могу использовать colorkey для текстур SDL?
Я написал эту простую C-программу для тестирования базовой функциональности SDL 1.3. Все работает, с одной незначительной проблемой. Цветовой ключ не конвертируется. Я загружаю 8-битный файл спрайта PNG, где индекс палитры #0 - это цвет фона. Я ожидаю увидеть только отображаемые спрайты, но получаю целое изображение, включая цвет фона.
Есть идеи, что происходит или как это исправить? Это было написано в Visual C++ 2005.
// SDL test.c : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "sdl.h"
#include "sdl_image.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
int windowID;
int textureID;
SDL_Surface* surface;
char* dummy = "";
SDL_Color color;
SDL_Init(SDL_INIT_VIDEO);
windowID = SDL_CreateWindow("SDL Test", 400, 400, 320, 240, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if (windowID == 0)
{
printf("Unable to create window: %s\n", SDL_GetError());
}
else printf("Window created: %d\n", windowID);
if (SDL_CreateRenderer(windowID, -1, SDL_RENDERER_PRESENTFLIP2) != 0)
{
printf("Unable to create renderer: %s\n", SDL_GetError());
}
else printf("Renderer created successfully.\n");
if (SDL_SelectRenderer(windowID) != 0)
{
printf("Unable to select renderer: %s\n", SDL_GetError());
}
else printf("Renderer selected successfully\n");
SDL_RenderPresent();
surface = IMG_Load("<INSERT FILENAME HERE>");
if (!surface)
{
printf("Unable to load image!\n");
}
else printf("Image Loaded\n");
color = surface->format->palette->colors[0];
SDL_SetColorKey(surface, 1, SDL_MapRGB(surface->format, color.r, color.g, color.b));
textureID = SDL_CreateTextureFromSurface(0, surface);
if (textureID == 0)
{
printf("Unable to create texture: %s\n", SDL_GetError());
}
else printf("Texture created: %d\n", textureID);
SDL_FreeSurface(surface);
if (SDL_RenderCopy(textureID, NULL, NULL) != 0)
{
printf("Unable to render texture: %s", SDL_GetError());
}
SDL_RenderPresent();
scanf_s("%s", dummy);
return 0;
}
РЕДАКТИРОВАТЬ: Это оказалось из-за ошибки в SDL_CreateTextureFromSurface, для которой я в конечном итоге представил патч для.
2 ответа
Вот два примера, которые могут вам помочь. Они идеально подходят для меня с SDL1.3.
if (color == white)
{
SDL_SetColorKey(bmp_surface, 1,
SDL_MapRGB(bmp_surface->format, 255, 255, 255));
}
if (color == blue)
{
SDL_SetColorKey(bmp_surface, 1,
SDL_MapRGB(bmp_surface->format, 0, 0, 254));
}
Вам, вероятно, следует преобразовать поверхность в формат отображения перед использованием.
...
surface = IMG_Load("<INSERT FILENAME HERE>");
SDL_DisplayFormat(surface);
SDL_SetColorKey(surface, 1, SDL_MapRGB(surface->format, color.r, color.g, color.b));
...
Это всегда хорошая идея, поэтому вы абсолютно уверены, что все изображения имеют одинаковый формат и дают правильные результаты при использовании функций SDL.
Хотя я знаком только с версией 1.2 и не знаю, что изменилось в 1.3.