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 ausprobieren

    es 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. ]


Anmelden zum Antworten