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?
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.
Sehän toimii, kiitos.
Aihe on jo aika vanha, joten et voi enää vastata siihen.