2

個人的なプロジェクトと学習経験として、SDL と C を使用してゲームボーイ カラー ゲームの PC ポートをゼロから作成しています。このゲームではパレット スワップを使用してエフェクトを作成していますが、私も同じことができるようになりたいと思っています。SDL 用のパレット関数があることを読んだことがありますが、それらは減価償却されており、ほとんど機能していません。

私はそれらを使用できないので、私の場合、パレット スワップをエミュレートする最良の方法は何でしょうか?

4

3 に答える 3

1

非推奨?ソースへのリンクを教えてください。

おそらく(未テスト) デスクトップ構成のため、出力サーフェスとして直接使用することはできませんが、AFAIK 8 ビット インデックス付きカラー パレット サーフェスは SDL でサポートされています。1 つのインデックス付きオフスクリーン サーフェスを作成し、パレットを調整してからブリットすることができます。出力面へ。

編集

これは SDL1.2 の動作例です。悲しいことに、ここで使用されている gif ではパレットが正しく変換されていないため、サイクルがフラッシュとして表示されます。これ以上のものは探しませんでした。

表面パレットに直接突っ込むことはできないことに注意してください。使用する必要がありますSDL_SetColors()

SDL2.0 では、パレットを処理する関数が追加されていますが、動作することを期待しています (未テスト)。

test.c:

#include "SDL.h"
#include "SDL_image.h"

void cycle(SDL_Color *colors, int first, int ncolors) {
    int i;
    SDL_Color tmp;
    tmp = colors[first];
    for (i=first+1; i < first+ncolors; i++)
        colors[i-1] = colors[i];
    colors[i-1] = tmp;
}

int main (int argc, char *argv[]) {
    SDL_Surface *out, *gif;
    SDL_Event event;
    int gameover = 0, i;
    int ncolors;
    SDL_Color *palette;

    SDL_Init(SDL_INIT_VIDEO);
    out = SDL_SetVideoMode(640, 480, 0, 0);
    gif = IMG_Load("Grafx2.gif");
    if (gif == NULL) {
        fprintf(stderr,"IMG_Load(): %s\n",IMG_GetError());
        goto err; /* <- evil */
    }
    printf("Bpp %d\n", gif->format->BytesPerPixel);
    printf("bpp %d\n", gif->format->BitsPerPixel);
    ncolors = gif->format->palette->ncolors;
    printf("ncolors %d\n", ncolors);
    palette = malloc(sizeof(SDL_Color)*ncolors); /* error check */
    for (i=0; i < ncolors; i++) {
        palette[i] = gif->format->palette->colors[i];
        printf("[%d] r=%d, g=%d, b=%d\n", i, palette[i].r, palette[i].g,
               palette[i].b);
    }
    while (!gameover) {
        if (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT)
                gameover = 1;
        }
        cycle(palette, 192, 64);
        SDL_SetColors(gif, palette, 0, ncolors);
        SDL_BlitSurface(gif, NULL, out, NULL);
        SDL_UpdateRect(out, 0, 0, 0, 0);
    }
    free(palette);
    SDL_FreeSurface(gif);
 err:
    SDL_Quit();
    return 0;
}

メイクファイル:

CC = gcc

# CFLAGS += $(shell sdl-config --cflags)
# LIBS += $(shell sdl-config --libs)

CFLAGS += $(shell pkg-config SDL_image --cflags)
LIBS += $(shell pkg-config SDL_image --libs)

# CFLAGS += -Wno-switch

all: Grafx2.gif test

test.o: test.c
    $(CC) -Wall -O2 $(CFLAGS) -c -o $@ $<

test: test.o
    $(CC) -o $@ $< $(LIBS)

Grafx2.gif:
    wget http://upload.wikimedia.org/wikipedia/commons/7/77/Grafx2.gif

.PHONY: clean
clean:
    -rm -f test *.o
于 2013-09-09T09:16:08.447 に答える