Почему я не могу использовать 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, для которой я отправил патч.


person Mason Wheeler    schedule 11.07.2009    source источник
comment
Почему вы уже пробуете версию 1.3?   -  person Zoomulator    schedule 12.08.2009
comment
Потому что 1.3 добавляет некоторые новые функции, которые мне нужны.   -  person Mason Wheeler    schedule 13.08.2009


Ответы (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));
}
person JasonM.    schedule 25.07.2011

Вероятно, вам следует преобразовать поверхность в формат отображения перед использованием.

...
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.

person Zoomulator    schedule 12.08.2009
comment
В конце концов я нашел проблему. Это была ошибка в процедуре преобразования. - person Mason Wheeler; 13.08.2009