Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 04:15

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Apr 16, 2006 00:10 
Offline
DGL Member

Registriert: Sa Apr 15, 2006 20:01
Beiträge: 3
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 :cry: :
SDL_SetColorKey(Im1,SDL_SRCCOLORKEY,SDL_MapRGB(Im1.format,0,0,255));

Ich hoffe ihr könnt mir bald helfen,
Gruß, Andemmm


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 01:55 
Offline
Ernährungsberater
Benutzeravatar

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...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 13:06 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
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:
  1. 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:
Code:
  1. procedure NewContainer;
  2. var
  3.   Rect: PSDL_Rect;
  4. begin
  5.   SDL_SetAlpha(Texture(ContainerNodes[HIGH(ContainerNodes)].ContainerTexture).SDL, 0, 255);
  6.   Rect := PSDLRect(0, 0, Options.PreferedTextureSize, Options.PreferedTextureSize);
  7.   SDL_FillRect(Texture(ContainerNodes[HIGH(ContainerNodes)].ContainerTexture).SDL, Rect, SDL_MapRGBA(Texture(ContainerNodes[HIGH(ContainerNodes)].ContainerTexture).SDL.format, 255, 255, 0, 255));
  8.   Dispose(Rect);
  9. end;


Literatur:
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fBlitSurface
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fSetAlpha

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 13:41 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das trifft sich mit deiner Freizeit ja gut :mrgreen:

SDL_SetAlpha
Viel Spass noch :D


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Apr 16, 2006 15:34 
Offline
DGL Member

Registriert: Sa Apr 15, 2006 20:01
Beiträge: 3
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.

Es grüßt euch Andemmm


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Apr 16, 2006 15:57 
Offline
Ernährungsberater
Benutzeravatar

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.

Code:
  1. if (surface.flags and SDL_SRCCOLORKEY)=SDL_SRCCOLORKEY then writeln('Colorkey gesetzt');


Andemmm hat geschrieben:
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 16:21 
Offline
DGL Member

Registriert: Sa Apr 15, 2006 20:01
Beiträge: 3
Danke an euch, ich hab das Problem jetzt im Griff 8)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]