Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

1

17.11.2007, 15:46

SDL Transparenzproblem

Hallo,
ich habe Heutemorgen mal SDL_Image zur Anzeige der Grafiken in den Code des 2D Games aus dem Buch C++ für Spieleprogrammierer gehauen.
Ich habe dazu einfach in der Spriteklasse die Loadmethode von SDL_LoadBMP durch IMG_Load von SDL_Image ersetzt.
Das Problem ist nun, das die Funktion SDL_SetColorKey nicht mehr funktioniert.

Kennt jemand eine Lösung für das Problem?

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

denjo

Treue Seele

Beiträge: 163

Wohnort: BLB

  • Private Nachricht senden

2

17.11.2007, 20:33

Dann machs mit SDL_MapRGB!

Beispiel für ne Bildfunktion:

C-/C++-Quelltext

1
2
3
4
5
6
void CSprite::FuelleBild (SDL_Surface *Bild, int R, int G, int B)
{
    // Buffer mit Hintergrundfarbe füllen

    SDL_FillRect (Bild, NULL, SDL_MapRGB (Bild->format, R, G, B));

}


Schau einfach mal nach der SDL-Funktion... ;)
"Irren ist menschlich, Vergeben göttlich."
- Alexander Pope -

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

3

18.11.2007, 10:29

Hallo,
ich habe ja den standard Quelltext des SDL Games aus dem Buch C++ für Spieleprogrammierer.
Da geht es ja alles, da dort nur mit Standartfunktionen von SDL gearbeitet wird.

Aber ich nutze nun SDL_Image um JPG Dateien zunutzen.

Das Problem ist aber das sich SDL_SetColorKey nicht mit SDL_Image verträgt.

Und mit dem Code Beispiel kann ich leider wenig bewirken :(
Den damit fülle ich ja das komplette Bild mit der Farbe, die ich eigentlich Transparent haben will.

Ich werde mal weiter googlen, aber vielleicht kennt jemand eine Lösung.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

dbGAMES

Treue Seele

Beiträge: 323

Wohnort: Frankfurt

Beruf: Student

  • Private Nachricht senden

4

18.11.2007, 11:21

es gibt in den meisten sdl tutorials eine funktion die etwa sows macht: (hier ohne fehlerabfragen usw das musst du selber einbauen)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
SDL_Surface *loadedImage = IMG_Load(filename.c_str());

SDL_Surface *optimizedImage = SDL_DisplayFormat(loadedImage);

Uint32 colorkey = SDL_MapRGB(optimizedImage->format, colorkeyRed, colorkeyGreen, colorkeyBlue);

SDL_SetColorKey(optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey);

SDL_FreeSurface(loadedImage);

// optimizedImage kann jezt verwendet werden

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

5

18.11.2007, 11:40

Hallo,
ich hab jetzt mal folgendes testen wollen.

C-/C++-Quelltext

1
2
3
4
5
6
void CSprite::SetColorKey(int R, int G, int B)
{
  // Colorkey einstellen

  m_pImage = SDL_DisplayFormat(m_pImage);
  SDL_SetColorKey (m_pImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB (m_pImage->format, R, G, B) );
}


Soweit funktioniert alles.
Jetzt hab ich aber um die Grafiken einen Rand der nicht verschwindet.
Dieser ist genau der ColorKey den ich eigentlich entfernen lassen möchte.

Aber ich nutze auch m_pImage als einzigstes Bild das ich nutze.
Oder soll ich zwei nutzen wie im sample?

EDIT
Lösung 2 funkt nicht.

C-/C++-Quelltext

1
2
3
4
5
6
void CSprite::SetColorKey(int R, int G, int B)
{
  // Colorkey einstellen

  SDL_Surface* OptImage = SDL_DisplayFormat(m_pImage);
  SDL_SetColorKey (OptImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB (OptImage->format, R, G, B) );
}


MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

denjo

Treue Seele

Beiträge: 163

Wohnort: BLB

  • Private Nachricht senden

6

18.11.2007, 13:47

Schonmal das SDL_RLEACCEL rausgenommen?

Bei mir hat es mit SDL_Image + SDL_SetColorKey wuderbar geklappt, deshalb verstehe ich den Fehler nicht so ganz. Du könntest das SetColorKey theoretisch ja noch auf nen Fehler untersuchen:

C-/C++-Quelltext

1
2
3
4
if (SDL_SetColorKey (m_pImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB (m_pImage->format, R, G, B) ) == -1)
{
    std::cout << "Fehlermeldung: Kannn ColorKey nicht benutze! " << SDL_GetError () << std::endl;
}


Was mir gerade noch einfällt....vllt hast du ja einfach auf den falschen ColorKey gestellt? Überprüf das doch mal ... (ist nur ne Vermutung) :)

Ich hoffe ich konnte dir diesmal weiterhelfen...

Edit: Das m_pImage sollte ohne das Optimieren erstmal auf den Bildschirm geblittet werden...

MfG denjo
"Irren ist menschlich, Vergeben göttlich."
- Alexander Pope -

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

7

18.11.2007, 14:09

Hallo,
ich hab den Code jetzt wie folgt geändert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void CSprite::SetColorKey(int R, int G, int B)
{
    // Colorkey einstellen

    if(SDL_SetColorKey (m_pImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB (m_pImage->format, R, G, B) ) == -1)
    {
        std::cout << "Fehlermeldung: Kannn ColorKey nicht benutze! " << SDL_GetError () << std::endl;
    }

    m_pImage = SDL_DisplayFormat(m_pImage);
}


Das ganze läuft trotzdem nicht ganz perfekt.
Der Rand, der die selbe Farbe hat wie der eigentliche Transparente Teil wird immer noch angezeigt.
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

8

18.11.2007, 22:17

SDL_MapRGBA benutzen ? ;)

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

9

19.11.2007, 09:24

Hallo Beneroth,
ist das nicht für Bilder die bereits einen Alphachannel haben?

Ich habe ja die Bilder aus dem Buch und dort ist lediglich der Farbwert der Transparent gemacht wird.

Aber ich teste es Heutemittag mal.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

10

26.01.2008, 22:16

Hallo,
ist zwar ne Weile her, kann aber wieder mal einige Hilfe in SDL gebrauchen.
Und zwar wollte ich jetzt folgendes machen.

Ich plane für mein 2D Game ein einfaches Startmenü.
Es ist nun geplant, dass die Buttons, der Menürahmen sowie die Aufschriften als Grafiken vorliegen.
Diese sollen aber nur teilweise transparent sein.

Leider kann ich dafür ja nicht SDL_MapRGB nutzen.
Ich denke hier bräuchte ich doch SDL_MapRGBA.
Leider weiß ich nicht welchen Wert ich dem Alpha zuweisen muss.

Wird darin nur der Durchsichtigkeitsgrad der Farbe gespeichert?

Würde mich über schnelle Hilfe freuen.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Werbeanzeige