[Allegro]Animacja->jak uniknąć 'frame'?
Ostatnio zmodyfikowano 2009-06-25 22:00
Juziogim3 Temat założony przez niniejszego użytkownika |
[Allegro]Animacja->jak uniknąć 'frame'? » 2009-06-25 19:13:03 Gdy tworzę animację korzystam ze sposobu podanego w kursie -> korzystanie z 'frame'. Lecz gdy zaprogramuje: "Po naciśnięciu klawisza 'X' wyświetl podaną animacje" i teraz pisze: if(frame<30) { masked_blit(...);} else if(frame>=30 && frame<=60){masked_blit(...);} Jak widać animacja składa się z dwóch klatek. Ale tu pojawia się problem -> zmienna frame ciągle się zmienia i czasami gdy nacisnę 'X' ma ona wartość 45 a czasami 5. Gdy frame jest równe (np.)45 to moja animacja składa się z jednej klatki. A mi właśnie zależy na tym żeby moja animacja animowała się cała(bez względu na wartość zmiennej frame. PS: Próbowałem napisać to bez frame używając rest(x); ale tylko program mi się zacinał masked_blit(...); rest(100); masked_blit(...); |
|
DejaVu |
» 2009-06-25 20:56:09 Nie wiem co rozumiesz pod pojęciem frame'a, którego używasz http://kursy.ddt.pl/?LessonId=154. Nie za bardzo da się zrozumieć co chcesz dokładnie osiągnąć. Wiem tylko, że coś Ci nie działa i widzisz jakiś związek z klatkami. |
|
lynx |
» 2009-06-25 21:40:02 Tą zmienną frame możesz sobie nazwać jak chcesz :D A rozwiązaniem jest zerowanie (tej) zmiennej odpowiedzialnej za wyświetlenie odpowiedniej klatki animacji zaraz po naciśnięciu przycisku 'X'. Możesz też zrobić to inaczej: [...] if( key( KEY_ ??? ) ) { for( int i = 0; i < max_frame; i++ ) { masked_blit( anim_BITMAP,[...], i * dlu_wybranej_klatki[...] ); } }
Ale wtedy na czas wyświetlania animacji stracisz "kontrolę". Tak więc sposobów jak to zrobić jest masa. |
|
Juziogim3 Temat założony przez niniejszego użytkownika |
» 2009-06-25 21:46:41 Więc postaram się napisać najprościej jak potrafię: Na podstawie lekcji http://kursy.ddt.pl/?LessonId=155 napisałem program którego celem jest wyświetlenie animacji po naciśnięciu klawisza 'X'. Aby zrobić animację użyłem kodu zamieszczonego w podanej wyżej lekcji(zmodyfikowanego przeze mnie) ... frame++; if(frame>60){frame=0;} ... if(key[KEY_X]) { if(frame < 30) { masked_blit(...(klatka 1)...); } else if(frame >= 30) { masked_blit(...(klatka 2)...); } }
-Kompiluje i uruchamiam(nie ma błędów w kodzie) -Klikam 'X' -> działa poprawnie(wyświetla się cała animacja(złożona z dwóch klatek)) -Klikam ponownie 'X' -> działa poprawnie -Klikam ponownie 'X' -> nie działa poprawnie (nie wyświetla się cała animacja(wyświetla się tylko druga klatka animacji)) -Wyłączam program Powód(wywnioskowany przeze mnie): Gdy za trzecim razem wcisnąłem klawisz 'X' zmienna frame miała wartość '>= 30'. Cel pisania tematu: Sposób na to, aby zawsze wyświetlała się cała animacja(oby dwie klatki, jedna po drugiej) po wciśnięciu klawisza 'X' PS: Tą nazwę 'frame' właśnie zapożyczyłem z tego kursu. |
|
lynx |
» 2009-06-25 21:52:55 Wiesz już jak? |
|
Juziogim3 Temat założony przez niniejszego użytkownika |
» 2009-06-25 21:55:18 Próbowałem zerować tą zmienną ale program mi się zacinał. if(key[KEY_X]) { frame=0; if(frame < 30) { masked_blit(...(klatka 1)...); } else if(frame >= 30) { masked_blit(...(klatka 2)...); } }
zamiast tego frame=0; próbowałem też: -while(frame!=0){frame++;if(frame>60){frame=0;}} -if(frame!=0){frame=0;} Ale wynik wciąż ten sam(zablokowany program) |
|
malan |
» 2009-06-25 21:57:02 Skoro chcesz, aby klatki wyświetlały się jedna po drugiej to dlaczego nie napiszesz po prostu tak: if( key[ KEY_X ] ) { masked_blit(...( klatka 1 ) masked_blit(...( klatka 2 ) } ? |
|
Juziogim3 Temat założony przez niniejszego użytkownika |
» 2009-06-25 22:00:54 Nie lubię się bawić timerami bo już mam je 4 i się gubię, ale podejrzewam że wynik byłby taki sam jak za pomocą rest(); Edit: Zrobiłem sobie przerwę na herbatkę i wymyśliłem :) Nazwałem to "kontrolą od zewnątrz": //Zmienne globalne: int frame = 0; int framebuf = 1; ... //Funkcja Main -> W pętli .... frame = framebuf * 7; // Przykładowa liczba(np.7) if(key[KEY_X]) { if (frame<30) { masked_blit(...klatka 1...); framebuf++; } else if(frame>=30) { masked_blit(...klatka 2...); framebuf = 1; } } I takim sposobem udało mi się udomowić frame :D |
|
« 1 » |