wie ich den ColorKey setze ist mit klar, nur leider weiß ich nicht wie man herausbekommt
1. Ob einem surface ein ColorKey zugeordnet ist und
2. welche Farbe im ColorKey festgelegt ist. (es gibt halt leider keine Funktion SDL_GetColorKey...)
Für 2. hatte ich mal das probiert: SDL_GetRGB(Im1.format.colorkey,screen_.format,@Rt, @Gt, @Bt);
Dummerweise wurden dadurch Rt, Gt und Bt nicht(!) die richtigen Werte zugewiesen, die ich zuvor mit SetColorKey gesetzt habe :
SDL_SetColorKey(Im1,SDL_SRCCOLORKEY,SDL_MapRGB(Im1.format,0,0,255));
Ich hoffe ihr könnt mir bald helfen,
Gruß, Andemmm
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Deine Methode sollte eigentlich funktionieren, es ist mir aber eine Sache aufgefallen:
Colorkey ist 32 Bit, die anderen Werte aber nur 8 Bit.
Vielleicht nimmt glGetRGB nur die letzten 8 Bit bei deinem 8-Bit-Format und interpretiert den Farbwert anhand der Tabelle.
Dann kommt da natürlich was anderes raus.
Versuch mal es mit glGetRGB wenn du ein 32-Bit oder 24-Bit-Format benutzt bzw. du den Farbwert selbst extrahierst.
Wobei ich sagen muss, dass Alpha bei SDL mir etwas suspekt ist.
Kleines Beispiel:
32-Bit-Surface in ne 32-Bit-Surface geblittet, und der Alphakanal wird nicht kopiert sondern eingerechnet...
i0n0s, es steht alles, was man dazu wissen muss im Wiki von libsdl wenn du willst, dass beim Blitten die Alpha-Geschichten nicht eingerechnet werden, sondern durch die neuen Alphawerte ersetzt werden sollen, dann musst du öhm momentchen...
Angenommen, du willst eine kleine Surface A in eine große Surface B reinblitten und dabei nicht auf den Alphakanal verzichten wollen. Dann setzt du bei Surface A den Alphakanal so:
Code:
SDL_SetAlpha(SurfaceA,0,255);
Bei Surface B muss nichts weiter eingestellt werden.
Es gibt aber eine Besonderheit. Keine Ahnung warum, habe es bislang Vodoo zugeordnet :
Manche kleine Texturen (besonders TGAs scheinen hiervon betroffen zu sein. Aber da auch nicht alle :/) werden auf diese Weise in der großen Surface B unsichtbar. dort ist dann Alpha an den entsprechenden Pixeln komplett durchsichtig.
Um dem Abhilfe zu verschaffen, gibt es aber nen Trick. Vorher einfach über die Surface B ein Rechteck malen:
Eure Antworten helfen leider nicht weiter - hab nämlich meine Frage falsch formuliert. Ich stelle sie am besten nochmal neu, also:
1. Wie bekomme ich heraus ob einem Surface ein ColorKey zugeordnet wurde - oder anders formuliert: Wie erfahre ich ob einem Surface (mit der Funktion SDL_SetColorKey) das Flag SDL_SRCCOLORKEY zugewiesen wurde.
2. Wie ermittle ich die unsichtbare (nicht transparente, auch wenn ich das anfangs falscherweise so bezeichnet habe) Farbe eines Surfaces.
Zu zweitens:
Meine Methode SDL_GetRGB(Im1.format.colorkey,screen_.format,@Rt, @Gt, @Bt); funktioniert nun doch, wie ich herausgefunden habe. Allerdings nur wenn das in Im1 enthaltene Bild aus einem 24-Bit-Bitmap geladen wurde. Wenn ich ein 256-Farben Bitmap in Im1 hereinlade, funktioniert das kurioserweise nicht. Könnt ihr mir erklären warum das so ist und was ich anders machen muss?
Ich hoffe dass ihr mir vielleicht doch noch einen passenden Lösungsvorschlag bieten könnt.
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Andemmm hat geschrieben:
1. Wie bekomme ich heraus ob einem Surface ein ColorKey zugeordnet wurde - oder anders formuliert: Wie erfahre ich ob einem Surface (mit der Funktion SDL_SetColorKey) das Flag SDL_SRCCOLORKEY zugewiesen wurde.
2. Wie ermittle ich die unsichtbare (nicht transparente, auch wenn ich das anfangs falscherweise so bezeichnet habe) Farbe eines Surfaces.
Steht in surface.format.colorkey. In welchen Format weiss ich aber nicht. Sollte bei dir einfach als 8-Bit Wert sein, der den Index in der entsprechenden Pallete beschreibt.
Andemmm hat geschrieben:
Zu zweitens: Meine Methode SDL_GetRGB(Im1.format.colorkey,screen_.format,@Rt, @Gt, @Bt); funktioniert nun doch, wie ich herausgefunden habe. Allerdings nur wenn das in Im1 enthaltene Bild aus einem 24-Bit-Bitmap geladen wurde. Wenn ich ein 256-Farben Bitmap in Im1 hereinlade, funktioniert das kurioserweise nicht. Könnt ihr mir erklären warum das so ist und was ich anders machen muss?
Habe ich doch schon beschrieben (jedenfalls meine Vermutung):
Eine 8-Bit-Surface ist palletiert, d.h. jeder Pixel ist ein Byte, der der Indexwert aus einer Pallete ist.
Bei einer 24-Bit-Surface wird jeder Pixel als RGBA gespeichert mit jeweils 8 Bit, wobei A entweder 0 oder 255 ist.
SDL_GetRGB kommt wohl darüber ins stolpern, dass du es ein 32 Bit-Wert übergeben hat, und es irgendwie falsch interpretiert.
Das ganze sieht dann aber mehr nach einem SDL-Fehler als einem Code-Fehler aus.
Am besten vielleicht in der Maillist nachfragen.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.