Transparenz von eigenem SDL_Surface wird ignoriert
-
Für eine 2D Tile-Engine bin ich dabei die Maps, die ich zeichne zu optimieren im Sinne, dass ich nicht alle x Tiles jedes Frame neu zeichnen muss. Daher habe ich mir überlegt, einmal beim Laden alle statischen Tiles in ein
SDL_Surface
pro Layer zu zeichnen um eben die einzelnen Layer "direkt" zu rendern anstelle mit unendlich for-Loops jedes Tile immer wieder zu zeichnen.Das klappt bei Tiles, die keine transparenten Bereichen haben ganz gut, wenn ich vorher für jedes Layer ein Surface erstelle mithilfe von
SDL_Surface* layer = SDL_CreateRGBSurface( SDL_HWSURFACE | SDL_SRCALPHA, layerWidth, layerHeight, 32, 0, 0, 0, 0);
und anschließend mit
SDL_BlitSurface
die einzelnen Tiles passend in das Layer zeichne und zum Schluss immer nur das Layer selber zeichne. Das Ziel ist es, etwas zu bekommen was in etwa so aussieht wie hier im Screenshot dargestellt. Das Problem ist jedoch, dass diese Tiles, die Teil von den Bäumen sind, einige transparente Bereiche haben (für Overlay, dass der Spieler eben hinter Bäumen laufen kann, aber immer noch sichtbar ist) und mir erst beim Experimentieren auffiel, dass etwas schief läuft, was man diesem Screenshot entnehmen kann. Anscheinend habe ich bisher keine passende Kombination vonSDL_FillRect
,SDL_SetAlpha
, ... gefunden, die mir ein komplett transparentes Surface zurückgibt (nicht dass das Surface ausgeblendet ist, sondern, dass die Pixel einfach unsichtbar sind) um darauf meine sichtbaren Overlay-Tiles zu platzieren. Sofern ich testweise ein solches Overlay mit einem beliebigen Grafikprogramm erstelle (mit eben transparenten Bereichen) klappt die wie gewünscht (so konnte ich auch das "korrekte" Bild rendern, indem ich in jedem Frame die Tiles direkt auf den Screen rendere und nicht auf den Layer und dann den Screen).Hat jemand eine Idee, was hier schief läuft? Falls ihr noch mehr Background benötigt, einfach nörgeln, dann rücke ich raus
-
Ich habe endlich das Problem gelöst, nachdem ich aus Verzweiflung random Dinge ausprobiert habe. Zunächst habe ich das Surface in Magenta eingefärbt:
SDL_FillRect(layer, NULL, SDL_MapRGB(layer->format, 255, 0, 255));
Das nächste Problem war, dass ich alles beim Zeichnen in das Layer probiert habe, aber nicht beim zeichnen auf den Screen! Daher musste ich lediglich folgenden Code einfügen
SDL_SetColorKey(layer, SDL_SRCCOLORKEY, SDL_MapRGB(layer->format, 255, 0, 255));
und nun klappt alles, wie gewünscht!