Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL-vesiefekti

Resiina [20.09.2007 19:01:45]

#

Minulla joskus oli tämä SDL-vesiefekti tallessa jossain, mutta pari päivää sitten tuhosin sen vahingossa, enkä ole saanut sitä vielä uudestaan koodattua toimivaksi asti.

Alkuperäinen koodi on saatu täältä: http://dpointer.blogspot.com/2006/09/underwater-effect.html

Tässä minun versioni:

void Vesiefekti(SDL_Surface *naytto)
{
    SDL_LockSurface(naytto);
    Uint32 *ptr = (Uint32*)naytto->pixels;
    int amp = naytto->w/64;
    const int tick = (SDL_GetTicks()/4) & 1023;
    for (int y = 0; y < naytto->h; y++, ptr += naytto->w)
    {
        int shift = amp/2 + amp/2*sin((4*y/(double)naytto->h + tick/(double)1024)*2*M_PI);
        memmove(ptr+shift, ptr, naytto->w-shift);
    }
    for (int x = 0; x < naytto->w; x++)
    {
        int shift = amp/2 + amp/2*sin((4*x/(double)naytto->w + tick/(double)1024)*2*M_PI);
        ptr = (Uint32*)naytto + x + (naytto->h-1)*naytto->w;
        for (int c = 0; c < naytto->h-shift; c++, ptr -= naytto->w)
            *ptr = *(ptr-shift*naytto->w);
    }
    SDL_UnlockSurface(naytto);
}

Ohjelma ei kaadu, jos

for (int c = 0; c < naytto->h-shift; c++, ptr -= naytto->w)
    *ptr = *(ptr-shift*naytto->w);

laitetaan kommentiksi, eli vika on siinä, mutta mikä siinä sitten on väärin?

Gaxx [20.09.2007 20:40:20]

#

ptr = (Uint32*)naytto + x + (naytto->h-1)*naytto->w;

->

ptr = (Uint32*)naytto->pixels + x + (naytto->h-1)*naytto->w;

Edit: Kun on kyse muistin hallinnasta, vika saattaa olla ihan missä vain. Jos jossain ohjelman osassa on unohdettu varata riittävästi muistia, saattaa se aiheuttaa aivan käsittämättömässä kohdassa ohjelmaa kummallisia tapahtumia.

Resiina [20.09.2007 22:40:19]

#

Sehän toimii, kiitos.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta