Pixel zeichnen mit SDL?
-
hi,
wenn ich das hier ausführe, dann wird ja ein Pixel an den Koordinaten 1/1 mit dem Farbwert 0xFFFFFF (Farbtiefe 32Bit) gezeichnet.
*(Uint32 *)g_pSurfScreen->pixels = 0xFFFFFFFF;
Wie kann ich jetzt einen Pixel an einer anderen Koordinate zeichnen?
ich habe mal in einem Tutorial das hier gesehen, aber ich verstehen es nicht ganz...
bpp = screen->format->BytesPerPixel; //das kapier ich, der Variable bpp wird die Anzahl Bytes pro Pixel übergeben... p = (Uint8 *)screen->pixels + y*screen->pitch + x*bpp; //was pitch ist, weiss ich auch..., hier wird zu der Variable screen->pixels die y/x-werte addiert *(Uint32 *)p = color; //und hier wird dann die Farbe (color) dem Pointer p übergeben, was bewirkt, dass ein Pixel an x/y mit der Farbe color erscheint, aber wieso?? Und wieso funktioniert (Uint8 *)screen->pixels + y*screen->pitch + x*bpp = color;
Edit : C++ Tags
nicht??schon mal danke für eure hilfe
gruss
nightmare_frog
[ Dieser Beitrag wurde am 06.02.2003 um 15:46 Uhr von Headhunter editiert. ]
-
Was funktioniert denn nicht ?
screen->pixels + y*screen->pitch + x*bpp = color;
ist sowas wie :
screen->pixels [x][y] = color;
Da screen->pixels aber wohl eindimensional ist, ist obige Methode ein Weg auf ein 1dimensionales Array wie auf ein 2dimensionales drauf zuzugreifen...
Verstanden ?
-
ich schreib mal den ganzen Code hierhin:
if (!SDL_LockSurface(screen)) { bpp = screen->format->BytesPerPixel; *(Uint32 *)screen->pixels + 200*screen->pitch + 100*bpp = SDL_MapRGB(screen->format, 0, 255, 0); SDL_UnlockSurface(screen); } else { fprintf(stderr, "SDL_LockSurface fehlgeschlagen\n"); }
so funktioniert das überhaupt nicht (Fehlermeldung = invalid lvalue in assignment).
Wenn ich den Code umändere, funktioniert es, allerdings sehe ich dann nur einen schwarzen Hintergrund und kein farbiges Pixel..:if (!SDL_LockSurface(screen)) { bpp = screen->format->BytesPerPixel; p=*(Uint32 *)screen->pixels + 10*screen->pitch + 10*bpp p=SDL_MapRGB(screen->format, 0, 255, 0); SDL_UnlockSurface(screen); } else { fprintf(stderr, "SDL_LockSurface fehlgeschlagen\n"); }
dass man so auf ein 2-Dimensionales Array zugreifen kann, hab ich nicht gewusst...
-
[QUOTE]Original erstellt von nightmare_frog:
[QB] [...][cpp]
*(Uint32 *)screen->pixels [200*screen->pitch + 100*bpp] = SDL_MapRGB(screen->format, 0, 255, 0);
[...][/cpp]
-
funktioniert auch nicht...
dann kommt die Meldung "void value not ignored as it ought to be"...
-
Welchen Typ hat screen->pixels ?
Welchen Rückgabewert hat SDL_MapRGB ?Probier mal selber was aus
-
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. ]