Ĺadny brzuch
Witam. Staram uporać się z następującym problemem: działanie programu polega na poziomym ruchu jednego obrazka po powierzchni drugiego. Przesuwanie jest po prostu nieskończoną pętlą zmieniającą stale pozycję obrazka o kilka pikseli (jednocześnie przesuwna jest łatka czyszcząca - patch). Ruch co prawda jest płynny, jednak powierzchnia co pewien czas migocze co psuje efekt. Czy można coś z tym zrobić?
#include<stdlib.h> #include<SDL/SDL_image.h> #define X_SCREEN 640 #define Y_SCREEN 480 #define X_GIFT 96 #define Y_GIFT 114 SDL_Surface * load_image(const char * file); void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ); int main(void) { SDL_Surface * screen; SDL_Surface * background; SDL_Surface * gift; SDL_Event event; SDL_Rect patch; int x = (X_SCREEN - X_GIFT)/2; int y = (Y_SCREEN - Y_GIFT)/2; patch.w = X_GIFT; patch.h = Y_GIFT; int dir = 0; if(SDL_Init(SDL_INIT_VIDEO|SDL_DOUBLEBUF)<0) { printf("Nie można zainicjalizować SDLa\n"); return 1; } atexit(SDL_Quit); if(!(screen = SDL_SetVideoMode(X_SCREEN, Y_SCREEN, 0, SDL_ANYFORMAT))) { printf("Nie można ustawić trybu graficznego\n"); return 1; } background = load_image("background.bmp"); apply_surface( 0, 0, background, screen ); gift = load_image("gift.png"); SDL_WM_SetCaption( "Merry Christmas!", NULL ); for(;;) { if(SDL_PollEvent(&event)) { if(event.type==SDL_QUIT || event.type==SDL_KEYDOWN) return 0; } else if(dir==0) { if(x >= X_SCREEN - X_GIFT-5) { dir=1; } else { patch.x = x; patch.y = y; SDL_BlitSurface(background, &patch, screen, &patch); apply_surface(x+=5, y, gift, screen); SDL_Flip( screen ); SDL_Delay(10); } } else if(dir==1) { if(x<=5) { dir=0; } else { patch.x = x; patch.y = y; SDL_BlitSurface(background, &patch, screen, &patch); apply_surface(x-=5, y, gift, screen); SDL_Flip( screen ); SDL_Delay(10); } } } SDL_FreeSurface(background); SDL_Quit(); return 0; } SDL_Surface * load_image(const char * file) { SDL_Surface * tmp; SDL_Surface * image; tmp = IMG_Load(file); if(!tmp) return NULL; image = SDL_DisplayFormatAlpha(tmp); SDL_FreeSurface(tmp); return image; } void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ) { SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface( source, NULL, destination, &offset ); }
poczytaj o backbuffer - praktycznie każdy kurs SDL który widziałem poruszał tę kwestię
Znaczy chodzi o dodanie flag SDL_SWSURFACE i SDL_DOUBLEBUF w SetVideoMode? Bo po użyciu nie widzę żadnych zmian...
nie tylko
chodzi o ty byś najpierw scenę rysował w odzielnym buforze a potem dopiero całą gotową wrzucał na ekran tak w skrócie, widzę że nie doczytałeś
hmm. Jedyne informacje o back bufferze jakie znalazłem odnoszą się do instrukcji SDL_Flip(). Ale mój program działa na zasadzie nieskończonej pętli, w którym momencie miałbym więc wywołać tę funkcję? Poza tym wartości zmiennych odpowiadających za pozycję obrazka na ekranie są za każdym razem zmieniane, SDL_Flip() pokaże mi więc obrazek w tej ostatniej przed wywołaniem pozycji..przynajmniej tak mi się wydaje. Jestem w kropce... jeśli znasz jakieś strony/kursy/tutoriale omawiające to zagadnienie to napisz, bo nie potrafię nic znaleść...
jeju przecierz Ci napisałem co musisz zrobić ! najpierw rysujesz całą scenę nie na ekranie ale w samodzielnie stworzonym surface ! i dopiero jak tam narysujesz, cały surface blitujesz na ekran(że się tak po polsko angielsku wyrażę). na 10000% każdy kurs sdl'a o tym mówi bo tak się robi nie tylko w sdl ale zawsze
kilka kursów sdl w necie jest, http://lazyfoo.net/S...rials/index.php ten wiem że był spoko
ale przecież u mnie rolę takiej powierzchni pełni screen... Mój problem, do czego właśnie doszedłem, wiąże się z czymś innym - brakiem obsługi vsync przez system bądź kartę graficzną. I z tego co przeczytałem niewiele da się w tej kwestii zrobić...
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include<stdlib.h> #include<SDL/SDL_image.h> #define X_SCREEN 640 #define Y_SCREEN 480 #define X_GIFT 96 #define Y_GIFT 114 SDL_Surface * load_image(const char * file); void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ); int main(void) { SDL_Surface * screen; SDL_Surface * background; SDL_Surface * gift; SDL_Event event; SDL_Rect patch; int x = (X_SCREEN - X_GIFT)/2; int y = (Y_SCREEN - Y_GIFT)/2; patch.w = X_GIFT; patch.h = Y_GIFT; int dir = 0; if(SDL_Init(SDL_INIT_VIDEO|SDL_DOUBLEBUF)<0) { printf("Nie można zainicjalizować SDLa\n"); return 1; } atexit(SDL_Quit); if(!(screen = SDL_SetVideoMode(X_SCREEN, Y_SCREEN, 0, SDL_ANYFORMAT))) { printf("Nie można ustawić trybu graficznego\n"); return 1; } background = load_image("background.bmp"); apply_surface( 0, 0, background, screen ); gift = load_image("gift.png"); SDL_WM_SetCaption( "Merry Christmas!", NULL ); for(;;) { if(SDL_PollEvent(&event)) { if(event.type==SDL_QUIT || event.type==SDL_KEYDOWN) return 0; } else if(dir==0) { if(x >= X_SCREEN - X_GIFT-5) { dir=1; } else { patch.x = x; patch.y = y; SDL_BlitSurface(background, &patch, screen, &patch); apply_surface(x+=5, y, gift, screen); SDL_Flip( screen ); SDL_Delay(10); } } else if(dir==1) { if(x<=5) { dir=0; } else { patch.x = x; patch.y = y; SDL_BlitSurface(background, &patch, screen, &patch); apply_surface(x-=5, y, gift, screen); SDL_Flip( screen ); SDL_Delay(10); } } } SDL_FreeSurface(background); SDL_Quit(); return 0; } SDL_Surface * load_image(const char * file) { SDL_Surface * tmp; SDL_Surface * image; tmp = IMG_Load(file); if(!tmp) return NULL; image = SDL_DisplayFormatAlpha(tmp); SDL_FreeSurface(tmp); return image; } void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ) { SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface( source, NULL, destination, &offset ); }
poczytaj o backbuffer - praktycznie każdy kurs SDL który widziałem poruszał tę kwestię
Znaczy chodzi o dodanie flag SDL_SWSURFACE i SDL_DOUBLEBUF w SetVideoMode? Bo po użyciu nie widzę żadnych zmian...
nie tylko
chodzi o ty byś najpierw scenę rysował w odzielnym buforze a potem dopiero całą gotową wrzucał na ekran tak w skrócie, widzę że nie doczytałeś
hmm. Jedyne informacje o back bufferze jakie znalazłem odnoszą się do instrukcji SDL_Flip(). Ale mój program działa na zasadzie nieskończonej pętli, w którym momencie miałbym więc wywołać tę funkcję? Poza tym wartości zmiennych odpowiadających za pozycję obrazka na ekranie są za każdym razem zmieniane, SDL_Flip() pokaże mi więc obrazek w tej ostatniej przed wywołaniem pozycji..przynajmniej tak mi się wydaje. Jestem w kropce... jeśli znasz jakieś strony/kursy/tutoriale omawiające to zagadnienie to napisz, bo nie potrafię nic znaleść...
jeju przecierz Ci napisałem co musisz zrobić ! najpierw rysujesz całą scenę nie na ekranie ale w samodzielnie stworzonym surface ! i dopiero jak tam narysujesz, cały surface blitujesz na ekran(że się tak po polsko angielsku wyrażę). na 10000% każdy kurs sdl'a o tym mówi bo tak się robi nie tylko w sdl ale zawsze
kilka kursów sdl w necie jest, http://lazyfoo.net/S...rials/index.php ten wiem że był spoko
ale przecież u mnie rolę takiej powierzchni pełni screen... Mój problem, do czego właśnie doszedłem, wiąże się z czymś innym - brakiem obsługi vsync przez system bądź kartę graficzną. I z tego co przeczytałem niewiele da się w tej kwestii zrobić...