Pixel zeichnen mit SDL?
-
so viel ich weiss, gibt SDL_MapRGB() einen Uint32-Wert zurück, da seh ich selber nich ganz durch, aber ich glaube, das ist ein Hex-wert, denn SDL_MapRGB rechnet die Farbwerte in einen Hex-Wert um...
bei screen->pixels blick ich noch weniger durch, aber ich diese Syntax zeichnet am oberen linken Fenster-Rand einen Weissen Pixel:*(Uint32 *)g_pSurfScreen->pixels = 0xFFFFFFFF;
aber wie das geht, steht leider in keiner Doku/Tutorial beschrieben..
gruss
nightmare_frog
-
Original erstellt von nightmare_frog:
so viel ich weiss, gibt SDL_MapRGB() einen Uint32-Wert zurück, da seh ich selber nich ganz durch, aber ich glaube, das ist ein Hex-wert, denn SDL_MapRGB rechnet die Farbwerte in einen Hex-Wert um...Mal ganz ehrlich : Den absoluten Durchblick durch C bzw C++ hast du noch nicht, oder ? Irgendwo muss diese Funktion doch definiert sein, also sowas wie :
int SDL_MapRGB (int r, int g, int b)
Wie sieht das genau aus ?bei screen->pixels blick ich noch weniger durch, aber ich diese Syntax zeichnet am oberen linken Fenster-Rand einen Weissen Pixel:
[code type="C++"]
*(Uint32 *)g_pSurfScreen->pixels = 0xFFFFFFFF;Ist auch logisch, damit weist du den RGB Wert (255,255,255) Weiß an die 0. Stelle im Array.
-
ich dachte mal, ich hätte den Durchblick in C , aber da hab ich noch nicht mit dynamischer Speicherverwaltung begonnen...
du hast doch gefragt, was für einen RÜCKGABEWERT SDL_MapRGB hat und das ist eben Uint32, Uint32 ist sicher irgendwo in den SDL-headerdateien definiert, aber ich habe es noch nirgens gefunden. Und nochmals zu SDL_MapRGB:
Uint32 SDL_MapRGB(SDL_PixelFormat *fmt, Uint8 r, Uint8 g, Uint8 b);
ich nehme an, das ist das, was du wolltest..
ja, *(Uint32 *)g_pSurfScreen->pixels zeigt auf die 0.Stelle im Array, aber leider kann ich ja die anderen Stellen nicht ansprechen...
danke für deine Bemühungen
gruss
nightmare_frog
[ Dieser Beitrag wurde am 06.02.2003 um 18:21 Uhr von nightmare_frog editiert. ]
-
Müsste es nicht
*(Uint8 *)screen->pixels + y*screen->pitch + x*bpp = color;
heissen?
-
@Saugie: ich habe es schon in beiden schreibweisen angetroffen. Bei mir funktioniert keine von beiden
-
wie wärs denn mit:
**((Uint32)**screen->pixels + y*screen->pitch + x*bpp) = color;(Uint8 *)screen->pixels + y*screen->pitch + x*bpp
ist der Zeiger auf das Pixel net der Farbwert des Pixels!!![ Dieser Beitrag wurde am 06.02.2003 um 19:18 Uhr von Keks editiert. ]
-
irgendwie leuchtet mir das ein...
ich werde das morgen mal ausprobierenes würde mich nur noch interessieren, was für eine Art Wert die Variable Uint8 hat, ist das eine 8 Bit grosse Integer-Variable und Uint32 eine 32 Bit grosse Integer-Variable?
-
Uint32 ist das selbe wie unsigned int, Uint8 das selbe wie unsigned char usw. Steht alles in der SDL_types.h.
-
danke...
-
Original erstellt von nightmare_frog:
dann kommt die Meldung "void value not ignored as it ought to be"...Die bekommst Du wenn Du sowas machst:
void foo() {} void bar() {} int main() { if (foo()) // foo hat eigentlich den Rückgabetyp void, daher // musst du die Rückgabe von foo ignorieren! bar(); return 0; }
-
es funktioniert...
ich versteh jetzt auch wieso (Keks hat recht gehabt..).
Das einzige, was mir noch nicht ganz klar ist (wenn jemand Zeit und Lust hat, dies noch zu beantworten):
*((Uint32*)screen->pixels + 10*screen->pitch + 10*bpp) = color; //screen->pixels zeigt hier auf einen Integer-Wert. Das Pixel wird aber nicht an //der Position 10 / 10 gezeichnet sondern an der Position 40 / 10 //(ist eigentlich logisch: bpp=4, 10*4 = 40) *((Uint8*)screen->pixels + 10*screen->pitch + 10*bpp) = color; //screen->pixels zeigt hier auf einen Char-Wert. Das Pixel wird an //der Position 10 / 10, falls ich hier das bpp weglasse und x dann einen Wert //hat, der nicht durch 4 teilbar ist, erscheint das Pixel überhaupt nicht
wieso ist das so? Und wieso funktioniert beides, obwohl man ja nicht mit einem Integer-Zeiger auf eine char-Variable zeigen kann?
gruss
nightmare_frog
[ Dieser Beitrag wurde am 07.02.2003 um 09:52 Uhr von nightmare_frog editiert. ]
[ Dieser Beitrag wurde am 07.02.2003 um 15:46 Uhr von nightmare_frog editiert. ]
[ Dieser Beitrag wurde am 07.02.2003 um 15:53 Uhr von nightmare_frog editiert. ]