JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=9098f971e2f1baadde386ffb34df576aMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[SDL] Spiegeln von Grafiken

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 16:05    Titel: [SDL] Spiegeln von Grafiken Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 16:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 16:47    Titel: Antworten mit Zitat

Spiegel müsste du können wenn du mit -1 skalierst. Glaube ich jedenfalls.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 18:24    Titel: Antworten mit Zitat

Vielen Dank, C++Builder Smile
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 19:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 20:18    Titel: Antworten mit Zitat

Zitat:
-1 zu skalieren


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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 20:32    Titel: Antworten mit Zitat

na die eine Farbe ist vom Typ Uint32 der ist größer als Uint8 (32bit > 8bit Wink ) 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 20:34    Titel: Antworten mit Zitat

hm, ok bei DXSprites ging es...
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum