Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro]Animacja->jak uniknąć 'frame'?

Ostatnio zmodyfikowano 2009-06-25 22:00
Autor Wiadomość
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(...);
P-8036
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.
P-8042
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:
C/C++
[...]
if( key( KEY_ ??? ) )
{
    for( int i = 0; i < max_frame; i++ ) // i to jest takie frame jakby
    {
        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.
P-8044
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.
P-8045
lynx
» 2009-06-25 21:52:55
Wiesz już jak?
P-8046
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)

P-8047
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:
C/C++
if( key[ KEY_X ] )
{
    masked_blit(...( klatka 1 )
    // tu ewentualnie jakiś timer
    masked_blit(...( klatka 2 )
}
 ?
P-8048
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
P-8049
« 1 »
  Strona 1 z 1