Fragen zu SDL-Beispielen
Verfasst: Fr Dez 26, 2008 11:14 pm
So, nun ist es soweit, ich kapier ein Programm nicht
Zuerst der Code:
Ich versuchs jetzt mal selbst...
Das erste und das letzte sind klar, aber was ist das für ein Pointer?
Die ifs sind klar. Dann das Surface sperren um es bearbeiten zu können.
Hängt wohl sehr mit der ersten Frage zusammen
Jedenfalls werden die Pixel-Informationen von screen gecastet und raw_pixels zeigt dann auf diese Informationen.
Wieder so ein Uint16... ist das Farbe oder was?
Jedenfalls werden danach die Format-Informationen von screen, x und y Koordinaten an die Funktion übergeben. Die Werte stehen wahrscheinlich für die Farben. Grün bleibt 0 (auch am Ergebnis ersichtlich.).
offset ist wahrscheinlich die Nummer des Pixels und dieses Pixel bekommt dann die Farbe. Den Rest von main versteh ich auch.
Aber dann die Funktion...
Es wird wieder so eine Farbvariable (ich nenns halt mal so ^^) deklariert. Von den nächsten 3 Zeilen versteh ich 0. Laut Buch werden da irgendwelche Bits verschoben. Aber kann mir das bitte jemand im Detail erklären? Bis jetzt hab ich so was noch nie verwendet.
Und dann wird value zurückgegeben. Das ist dann die Farbe des Pixels in main mit dem Index offset.
Wenn ich irgendwas falsch verstanden habe, bitte korrigieren
Vollständigkeitshalber hier der Downloadlink zu einem Archiv mit allen Beispielcodes vom Buch:
http://nostarch.com/plg.htm
source listings ist das Archiv mit den Codes. Dann auf SDL und listing4-2.c.
PS: Die Betreff ist absichtlich in der Mehrzahl formuliert, da dies sicher nicht die letzte Frage ist
EDIT: Hier sieht man den ungefähren Code mit Kommentaren und dem Ergebnis.
Zuerst der Code:
Code: Alles auswählen
#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>
Uint16 CreateHicolorPixel (SDL_PixelFormat *fmt, Uint8 red, Uint8 green, Uint8 blue);
int main ()
{
SDL_Surface *screen;
Uint16 *raw_pixels;
int x, y;
if (SDL_Init (SDL_INIT_VIDEO) != 0)
{
printf ("Unable to initialize SDL: %s\n", SDL_GetError ());
return 1;
}
screen = SDL_SetVideoMode (256, 256, 16, 0);
if (screen == NULL)
{
printf ("Unable to set video mode: %s\n", SDL_GetError ());
return 1;
}
SDL_LockSurface (screen);
raw_pixels = (Uint16 *) screen -> pixels;
for (x = 0; x < 256; x++)
{
for (y = 0; y < 256; y++)
{
Uint16 pixel_color;
int offset;
pixel_color = CreateHicolorPixel (screen -> format, x, 0, y);
offset = (screen -> pitch /2 * y + x);
raw_pixels [offset] = pixel_color;
}
}
SDL_UnlockSurface (screen);
SDL_UpdateRect (screen, 0, 0, 0, 0);
SDL_Delay (3000);
return 0;
}
Uint16 CreateHicolorPixel (SDL_PixelFormat *fmt, Uint8 red, Uint8 green, Uint8 blue)
{
Uint16 value;
value = ((red >> fmt -> Rloss) << fmt -> Rshift) +
((green >> fmt -> Gloss) << fmt -> Gshift) +
((blue >> fmt -> Bloss) << fmt -> Bshift);
return value;
}
Code: Alles auswählen
SDL_Surface *screen;
Uint16 *raw_pixels;
int x, y;
Die ifs sind klar. Dann das Surface sperren um es bearbeiten zu können.
Code: Alles auswählen
raw_pixels = (Uint16 *) screen -> pixels;
Jedenfalls werden die Pixel-Informationen von screen gecastet und raw_pixels zeigt dann auf diese Informationen.
Code: Alles auswählen
for (x = 0; x < 256; x++)
{
for (y = 0; y < 256; y++)
{
Uint16 pixel_color;
int offset;
pixel_color = CreateHicolorPixel (screen -> format, x, 0, y);
offset = (screen -> pitch /2 * y + x);
raw_pixels [offset] = pixel_color;
}
}
Jedenfalls werden danach die Format-Informationen von screen, x und y Koordinaten an die Funktion übergeben. Die Werte stehen wahrscheinlich für die Farben. Grün bleibt 0 (auch am Ergebnis ersichtlich.).
offset ist wahrscheinlich die Nummer des Pixels und dieses Pixel bekommt dann die Farbe. Den Rest von main versteh ich auch.
Aber dann die Funktion...
Code: Alles auswählen
Uint16 CreateHicolorPixel (SDL_PixelFormat *fmt, Uint8 red, Uint8 green, Uint8 blue)
{
Uint16 value;
value = ((red >> fmt -> Rloss) << fmt -> Rshift) +
((green >> fmt -> Gloss) << fmt -> Gshift) +
((blue >> fmt -> Bloss) << fmt -> Bshift);
return value;
}
Und dann wird value zurückgegeben. Das ist dann die Farbe des Pixels in main mit dem Index offset.
Wenn ich irgendwas falsch verstanden habe, bitte korrigieren
Vollständigkeitshalber hier der Downloadlink zu einem Archiv mit allen Beispielcodes vom Buch:
http://nostarch.com/plg.htm
source listings ist das Archiv mit den Codes. Dann auf SDL und listing4-2.c.
PS: Die Betreff ist absichtlich in der Mehrzahl formuliert, da dies sicher nicht die letzte Frage ist
EDIT: Hier sieht man den ungefähren Code mit Kommentaren und dem Ergebnis.