pixelfarbe aus bitmap einlesen mit SDL
-
ich habe ien spiel mit SDL geschriegen, und brauche für eine kollisionsabfrage die pixelfarbe.
Gibt es dafür eine funktion ?mfg
LUKI
-
Leider gibt es in SDL (soweit ich weiß) keine Standardfunktion für diesen Zweck (empörend, nicht?).
Aber folgender Code könnte dir helfen:
Uint32 SDL_Pixel(SDL_Surface* surface, Uint16 x, Uint16 y ) { SDL_PixelFormat* fmt; SDL_Color* color; Uint8 index; Uint8 red,green,blue,alpha; Uint32 temp; Uint32 pixel = 255; Uint8* img; fmt = surface->format; img = (Uint8*)surface->pixels + x*fmt->BytesPerPixel+surface->pitch*y; if( fmt->BytesPerPixel == 1 ) { index = *img; color = &(fmt->palette->colors[index]); alpha = 255; red = color->r; green = color->g; blue = color->b; } else { pixel = *(Uint32*)img; temp = pixel & fmt->Rmask; temp = temp >> fmt->Rshift; temp = temp << fmt->Rloss; red = (Uint8)temp; temp = pixel & fmt->Gmask; temp = temp >> fmt->Gshift; temp = temp << fmt->Gloss; green = (Uint8)temp; temp = pixel & fmt->Bmask; temp = temp >> fmt->Bshift; temp = temp << fmt->Bloss; blue = (Uint8)temp; temp = pixel & fmt->Amask; temp = temp >> fmt->Ashift; temp = temp << fmt->Aloss; alpha = (Uint8)temp; } return (alpha<<24) | (blue<<16) | (green<<8) | red; }In diesem Fall wird die Farbe als 32bit-Integer zurückgegeben. Wenn du die einzelnen Farbwerte brauchst kannst du ja die Funktion entsprechend ändern. Denn wie du dir vielleicht denken kannst stecken die Farbwerte des Pixels in den Variablen red,green und blue (und alpha).

-
Man kann auch die bei SDL mitgelieferte Funktion verwenden:
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fGetRGBA
(alternativ SDL_GetRGB, falls du A nicht brauchst).
-
luki91 schrieb:
brauche für eine kollisionsabfrage die pixelfarbe.
Uih, das ist böse.
Bye, TGGC (Das Eine, welches ist.)
-
Hi!
Zur Kollisionsbafrage gibts es andere (gängigere) Techniken, die du lieber nutzen solltest. Siehe Bounding Boxen (Rectangles), oder Bitmasken.
grüße
-
ich kenn mich in SDL nicht sehr gut aus, kannst du das mal bitte erklären ?
-
luki91 schrieb:
ich kenn mich in SDL nicht sehr gut aus, kannst du das mal bitte erklären ?
Zusammenhang?
Bye, TGGC (Das Eine, welches ist.)
-
luki91 schrieb:
ich kenn mich in SDL nicht sehr gut aus, kannst du das mal bitte erklären ?
Das hat nichts mit der SDL zu tuen. Diese Techniken sind ganz allgemein und ungebunden von irgendwelchen Bibliotheken!
Eine Suche in Google wird dir genauere Infos bringen! 
Kurze Zusammenfassung:
Bei Bounding Rectangles bekommt jedes Objekt ein Rechteck spendiert das sich genau an die Maximalwerte des Objekts anpasst. So kann man, mit wenig Aufwand, testen ob sich zwei dieser Rechtecke überschneiden.Bitmasken bezeichnen genau die Punkte des Objekts welche eine Kollision hervorrufen würden. Durch eine verknüpfung zweier Bitmasken kann so getestet werden ob zwei Objekte kollidieren. Das ganze erfordert zwar mehr Rechenaufwand ist aber dafür Pixelgenau.
Außerdem kannst du beide Techniken kombinieren. Evtl bekommst du dadurch noch ein wenig mehr Geschwindigkeit.
grüße
-
Wie würdet ihr das bei einem welligem untergrund machen , uf dem die figur stehen soll ?
-
TGGC schrieb:
luki91 schrieb:
brauche für eine kollisionsabfrage die pixelfarbe.
Uih, das ist böse.
Bye, TGGC (Das Eine, welches ist.)
Sehr toll TGGC, das hättest du aber mal gerade auch sparen können.

-
de_Bert schrieb:
TGGC schrieb:
luki91 schrieb:
brauche für eine kollisionsabfrage die pixelfarbe.
Uih, das ist böse.
Bye, TGGC (Das Eine, welches ist.)
Sehr toll TGGC, das hättest du aber mal gerade auch sparen können.

Weil?
Bye, TGGC (Das Eine, welches ist.)
-
Weil es zur Lösung, des Probleme, NULL beigetragen hat.
-
Ohne Zusammenhang kein wohldefiniertes Problem, das überhaupt gelöst werden könnte.
Bye, TGGC (Das Eine, welches ist.)[/quote]