|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 30.12.2004, 16:05 Titel: [SDL] Spiegeln von Grafiken |
|
|
hi,
mit SDL_GFX kann man Grafiken super Rotieren und Scallieren, aber
gibt es auch eine Möglichkeit Grafiken zu spiegeln ?
oder gibt es dafür keine Libary ?
Wenn es keine Libary gibt, wie kann man sich am besten so eine
Funktion selber schreiben ?
in der SDL_Surface Struktur befinden sich ja die Pixel:
Zitat: | void *pixels; /* Read-write */ |
wie liest man die EINZELNEN Pixel am besten aus ?
ich habs so versucht:
Code: |
SDL_LockSurface(image);
SDL_LockSurface(new_surface);
pixel=*(Uint32*)image->pixels;
new_pixel = *(Uint32*)new_surface->pixels;
new_pixel = pixel;
SDL_UnlockSurface(new_surface);
SDL_UnlockSurface(image);
|
aber dann kopiert er alle pixel und ich hab wieder da gleiche Bild
und als array kann man ja auf ->pixels auch net zugreifen..
thx
mfg
DarK _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
C++Builder Senior JLI'ler
Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 30.12.2004, 16:42 Titel: |
|
|
also in dieser Funktion wird auf einen Pixel zu gegriffen um seine Farbe zuändern und das halt für die versch. Farbtiefen.
http://www.libsdl.org/intro.de/usingvideo.html hat Folgendes geschrieben: |
Code: |
#include "SDL_endian.h" /* für einen 24-Bit-Modus unabhängig von der Bytereihenfolge */
void DrawPixel(SDL_Surface *screen, int x, int y,
Uint8 R, Uint8 G,
Uint8 B)
{
Uint32 color = SDL_MapRGB(screen->format, R, G, B);
if ( SDL_MUSTLOCK(screen) ) {
if ( SDL_LockSurface(screen) < 0 ) {
return;
}
}
switch (screen->format->BytesPerPixel) {
case 1: { /* vermutlich 8 Bit */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*bufp = color;
}
break;
case 2: { /* vermutlich 15 Bit oder 16 Bit */
Uint16 *bufp;
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
}
break;
case 3: { /* langsamer 24-Bit-Modus, selten verwendet */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
if(SDL_BYTEORDER == SDL_LIL_ENDIAN) {
bufp[0] = color;
bufp[1] = color >> 8;
bufp[2] = color >> 16;
} else {
bufp[2] = color;
bufp[1] = color >> 8;
bufp[0] = color >> 16;
}
}
break;
case 4: { /* vermutlich 32 Bit */
Uint32 *bufp;
bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
*bufp = color;
}
break;
}
if ( SDL_MUSTLOCK(screen) ) {
SDL_UnlockSurface(screen);
}
SDL_UpdateRect(screen, x, y, 1, 1);
}
|
|
Dieser Funktion kannst du entnehmen wie man auf einen einzelnen Pixel zugreift.
Zum Spiegeln:
ich würd es für horizontal gespiegelt so machen
Code: |
for(int x=0;x<image.w;x++)
{
for(int y=0;y<image.h;y++)
{
PutPixel(new_image,x,image.h-y,GetPixel(image,x,y));
}
}
|
Du nimmst jeden Pixel und trägts ihn in die neue Surface (die du natürllich zuvor erstellen musst) an der geänderten Position ein und die ist für horizontalgespiegelt (x,image.h-y) und für vertikalgespiegelt (image.w-x,y).
Ich hoffe du verstehst was ich meine.
[edit]
Die GetPixel funktion musst du dir noch aus der DrawPixel funktion basteln und als die PutPixel funktion kannst du diese Funktion aus der SDL_gfx lib nehmen:
int pixelColor(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color);
[/edit]
Zuletzt bearbeitet von C++Builder am 30.12.2004, 16:48, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 30.12.2004, 16:47 Titel: |
|
|
Spiegel müsste du können wenn du mit -1 skalierst. Glaube ich jedenfalls. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 30.12.2004, 18:24 Titel: |
|
|
Vielen Dank, C++Builder _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 30.12.2004, 19:13 Titel: |
|
|
hm ich will ja jetzt nix sagen, aber ich glaube dsa es wircklich einfacher ist mit -1 zu skalieren als eine eigenen FUnktion zu schreiben. Man spart sich Arbeit und wahrscheinlich is es sogar schnelle. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 30.12.2004, 20:18 Titel: |
|
|
das funz nicht, dann hab ich einen schwarzen bildschirm ...
und C++Builder ich häng jetzt total ..
das mit GetPixel ist schwerer zu coden als gesagt da man nicht
3 verschiedene Uint zurückgeben kann...
und die eine Funktion für SetPixel setzt nur eine Farbe , in wiefern soll
mir das weister helfen ? _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
C++Builder Senior JLI'ler
Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 30.12.2004, 20:32 Titel: |
|
|
na die eine Farbe ist vom Typ Uint32 der ist größer als Uint8 (32bit > 8bit ) da sind alle Farbteile reingemischt. Das geht mit:
Code: | Uint32 SDL_MapRGB(SDL_PixelFormat *fmt, Uint8 r, Uint8 g, Uint8 b); |
Und anders herum gibt es noch die Funktion:
Code: | void SDL_GetRGB(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b); |
fmt ist in SDL_Surface als format deklariert.
Die SDL Documentation hilft übrigens.
[edit]
Fallst du nicht weist wie man mehrere Werte zurückgeben kann, solltest du dich mal mit Pointern und Referenzen beschäftigen.
[/edit]
Zuletzt bearbeitet von C++Builder am 30.12.2004, 20:35, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|