SDL nur einen Teil blitten

Liebe Leute

Ich möchte mit der SDL ein Bild nur teilweise blitten. Wie viel, hängt von einem Prozentwert ab.
Das Ganze ist eine Art Fortschrittsbalken: Wenn die Rechnungen zu 50% gelöst sind, ist der halbe Balken zu sehen.

Wie geht das? Das Bild ist im PNG-Format, kann aber auch in BMP umgewandelt werden.

Liebe Grüsse
Kalsan

Hallo,

Ich möchte mit der SDL ein Bild nur teilweise blitten.

Ich verstehe die Frage nicht. Das macht man mit einem SDL_BlitSurface() Aufruf. Dabei sind die Bildausschnitte frei wählbar.

http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface

Danach SDL_UpdateRects() nicht vergessen.

Gruß

Fritze

Hallo Fritze

Herzlichen Dank für deine Antwort.

Ich verstehe die Frage nicht. Das macht man mit einem
SDL_BlitSurface() Aufruf. Dabei sind die Bildausschnitte frei
wählbar.

Ich möchte, dass zum Beispiel nur die Linke Hälfte des Bilds sichtbar ist. Der rechte, verbleibende Teil soll unsichtbar sein, wie wenn das Bild zugeschnitten wäre.

Ich lese überall nur, dass dies mit einem der NULL-Parameter von SDL_BlitSurface möglich sei. Wie genau das geht, steht nirgends. Hat jemand ein Beispiel?

Liebe Grüsse
Kalsan

Hallo,

Ich verstehe die Frage nicht. Das macht man mit einem
SDL_BlitSurface() Aufruf. Dabei sind die Bildausschnitte frei
wählbar.

Ich möchte, dass zum Beispiel nur die Linke Hälfte des Bilds
sichtbar ist. Der rechte, verbleibende Teil soll unsichtbar
sein, wie wenn das Bild zugeschnitten wäre.

Ich verstehe es immer noch nicht. Du hast irgendwo eine komplette Bitmap. Daraus kopierst Du per SDL_BlitSurface einen Teil heraus und packst ihn in Deine Anzeige. Danach nimmst Du einen größeren Teil der Quellbitmap und wiederholst das ganze.

Hast Du Dir den Link zur SQL_BlitSurface() Funktion angeschaut? Insbesondere den Parameter SDL_Rect *srcrect?

Ich lese überall nur, dass dies mit einem der NULL-Parameter
von SDL_BlitSurface möglich sei. Wie genau das geht, steht
nirgends. Hat jemand ein Beispiel?

Mit dem NULL Parameter geht es hier gerade nicht! Siehe die von mir bereits mehrfach angepriesene Dokumentation.

Gruß

Fritze

Hallo Fritze

Bitte entschuldige, dass ich dies nicht bemerkt habe, ich habe die wichtigste Zeile übersehen.
Ich hab’s mal ausprobiert und wurde verwirrt: Es wird nur ein breiter, langer Balken angezeigt, dessen Inhalt je nach x und y Parameter variiert.
Hier ist ein Auszug aus meinem Quellcode:

SDL\_Rect schneiden;
 schneiden.x=50;
 schneiden.y=100;

SDL\_BlitSurface(imageDeFond, &schneiden, ecran, &positionFond);

Ich kenne dazu die von dir empfohlene Funktion SDL_UpdateRects nicht.

Wie müsste der Quellcode aussehen, dass imageDeFond von oben bis unten komplett, aber nur die linke Hälfte angezeigt würde?

Liebe Grüsse und danke für deine Geduld
Kalsan

Hallo,

Ich hab’s mal ausprobiert und wurde verwirrt: Es wird nur ein
breiter, langer Balken angezeigt, dessen Inhalt je nach x und
y Parameter variiert.
Hier ist ein Auszug aus meinem Quellcode:

SDL_Rect schneiden;
schneiden.x=50;
schneiden.y=100;

Da fehlt ja auch die Hälfte. Generell wird bei SDL ein Rechteck durch zwei Koordinaten für die linke, obere Ecke (ist bei Dir angegeben) und durch Breite und Höhe definiert (fehlt bei Dir).

So kannst Du z.B. für eine Animation alle Teilbilder in eine Bitmap packen und dann die linke, obere Ecke wandern lassen. Oder aber (wie in Deinem Fall), die linke obere Ecke konstant lassen und den Bildauschnitt vergrößern.

Wichtig ist, die SDL_Rect Struktur, die neben der SDL_Surface Struktur von SDL_BlitSurface benötigt wird, sieht vollständig so aus:

typedef struct{
 2 Sint16 x, y;
 3 Uint16 w, h;
 4 } SDL\_Rect;

Merkst Du, was bei Dir fehlt? Ich gehe davon aus, dass „imageDeFond“ und „ecran“ zwie Quell- und Zielflächen sind. Wobei ecran im Videospeicher liegen sollte, also über „SDL_SetVideoMode()“ initialisiert wurde.

Ohne einen anschließenden Aufruf von SDL_UpdateRect sollten die Änderungen des SDL_BlitSurface() allerdings nicht sichtbar sein.

Du solltest Dir einfach mal die Dokumentation zu den genannten Funktionen und Strukturen anschauen. Die gibt es umfangreich auf der SDL Website:

http://www.libsdl.org/cgi/docwiki.cgi/SDL_API_by_name

Wie müsste der Quellcode aussehen, dass imageDeFond von oben
bis unten komplett, aber nur die linke Hälfte angezeigt würde?

Ich kenne ja Deine Grafik nicht. Nur Du weißt, wieviele Pixel sie hat (Berite und Höhe). Startkoordinaten wären dann auf jeden fall mal 0,0, denn Du willst ja ganz oben ganz links anfangen. Und dann Breite = Breite der Grafik in Pixeln/2 und Höhe = Höhe der Grafik in Pixeln.

Also:

SDL\_Rect srcrect;
copyrec.x = 0;
copyrec.y = 0;
copyrec.w = ?\>;
copyrec.h = ?\>;

SDL\_Rect dstrect;
...

Und dann später

SDL\_BlitSurface(imageDeFond, &srcrect, ecran, &dstrect);
SDL\_UpdateRect(ecran,0,0,0,0);

Gruß

Fritze

1 Like

Hoheee!! Genau das brauche ich!!!

Herzlichen Dank! Da hat du dir einen Stern verdient!

Ich wusste gar nichts von .w und .h :wink:

Liebe Grüsse
Kalsan