2009-07-11 6 views
0

Ich habe dieses einfache C-Programm geschrieben, um grundlegende SDL 1.3-Funktionalität zu testen. Alles funktioniert, mit einem kleinen Problem. Der Farbschlüssel wird nicht konvertiert. Ich lade eine 8-Bit-PNG-Sprite-Datei, wobei der Palettenindex # 0 die Hintergrundfarbe ist. Ich würde erwarten, nur die Sprites angezeigt zu sehen, aber was ich bekomme, ist das gesamte Bild, einschließlich der Hintergrundfarbe.Warum kann ich ColorKey für SDL-Texturen nicht verwenden?

Irgendeine Idee was los ist oder wie man es repariert? Dies wurde in Visual C++ geschrieben 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; 
} 

EDIT: Dies erwies sich als aufgrund eines Fehlers in SDL_CreateTextureFromSurface, die ich für einen Patch endete einreichen.

+0

Warum probieren Sie die Version 1.3 bereits aus? – Zoomulator

+0

Weil 1.3 einige neue Funktionen hinzufügt, die ich brauche. –

Antwort

0

Sie sollten die Oberfläche wahrscheinlich vor der Verwendung in das Anzeigeformat konvertieren.

... 
surface = IMG_Load("<INSERT FILENAME HERE>"); 
SDL_DisplayFormat(surface); 
SDL_SetColorKey(surface, 1, SDL_MapRGB(surface->format, color.r, color.g, color.b)); 
... 

immer eine gute Idee, dies zu tun, so dass Sie absolut sicher, dass alle Bilder das gleiche Format haben und geben die richtigen Ergebnisse, wenn die SDL-Funktionen.

Obwohl ich nur mit der Version 1.2 vertraut bin und keine Ahnung habe, was in der 1.3 geändert wurde.

+0

Ich fand schließlich das Problem. Es war ein Fehler in der Konvertierungsroutine. –

2

Hier sind zwei Beispiele, die Ihnen helfen könnten. Sie funktionieren perfekt mit 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)); 
} 
Verwandte Themen