0

基本的な SDL 1.3 機能をテストするために、この単純な C プログラムを作成しました。すべてが機能しますが、小さな問題が 1 つあります。カラーキーは変換されません。パレット インデックス #0 が背景色である 8 ビット PNG スプライト ファイルを読み込んでいます。スプライトのみが表示されることを期待していますが、背景色を含む画像全体が表示されます。

何が起こっているのか、それを修正する方法はありますか? これは 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 のバグが原因であることが判明し、パッチを提出することになりました。

4

2 に答える 2

1

参考になるサンプルを 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));
}
于 2011-07-25T05:20:07.297 に答える
0

You should probably convert the surface to the display format before use.

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

Always a good idea to do this so you're absolutely sure that all images has the same format and gives the right results when using the SDL functions.

Although I'm only familiar with the 1.2 version and don't have a clue what's been changed in the 1.3.

于 2009-08-12T17:16:20.070 に答える