Wysuwanie menu i chowanie menu
Ostatnio zmodyfikowano 2012-08-14 14:50
Admixior Temat założony przez niniejszego użytkownika |
Wysuwanie menu i chowanie menu » 2012-08-13 22:25:14 Wie ktoś jak można zrobić płynne wysuwanie i wsuwanie menu, takie aby na początku szybko weszło i zwalniało, i odwrotnie wysuwanie. Mogę też zrobić że równym tempem się wysuwa i w pewnym momencie zaczyna zwalniać i odwrotnie chowanie. Jeśli ktoś kiedyś robił coś podobnego byłbym wdzięczny za dobrą radę. |
|
akwes |
» 2012-08-13 22:28:17 Niech zmienna mówiąca o szybkości zwiększa się o przyspieszenie, zgodnie ze wzorem na ruch przyspieszony :) Z powrotem wzór na ruch opóźniony byle wektorów nie pomylić. |
|
SeaMonster131 |
» 2012-08-13 22:28:30 menu.speed = 5; if( wejscie ) { menu.x += menu.speed; menu.speed -= 0.5; }
menu.speed = 1; if( wyjscie ) { menu.x -= menu.speed; menu.speed += 0.5; }
+ jakieś ograniczenia itd.. ? |
|
Admixior Temat założony przez niniejszego użytkownika |
» 2012-08-13 22:41:39 @up: właśnie o tym ograniczniku nie pomyślałem :) THX |
|
m4tx |
» 2012-08-14 08:01:44 Wie ktoś jak można zrobić płynne wysuwanie i wsuwanie menu, takie aby na początku szybko weszło i zwalniało, i odwrotnie wysuwanie. |
Funkcja sin() - bardzo prosto można to zrobić :) |
|
Mrovqa |
» 2012-08-14 13:15:18 Ja pisałem kiedyś płynny ruch, resize oraz zmianę przezroczystości okna w WinAPI to robiłem to na prostej zasadzie - funkcja animująca przyjmuje adres na funkcję matematyczną, tzn: act_pos = func_mat( act_time / max_time ) * scale;
double func_mat( double progress ) { return 1 -( progress * progress ); }
Powyższy pomysł jest bardzo uniwersalny i można samemu stworzyć ciekawe, dodatkowe animacje ;) |
|
Admixior Temat założony przez niniejszego użytkownika |
» 2012-08-14 14:50:44 Kilka godzin zabawy i działa #include <cmath> int Menu::MoveMenu( void ) { float wspolczynnik = 3.1415926535f * 5.f / 8.f; if( show ) { if( sin_pos >= 1.f ) return 0; sin_pos += 0.01f; if( sin_pos > 1.f ) sin_pos = 1.f; } else { if( sin_pos <= 0.f ) return 0; sin_pos -= 0.01f; if( sin_pos < 0.f ) sin_pos = 0.f; } float move_full =-( sinf( wspolczynnik * sin_pos ) *( hide_pos - show_pos ) ); float move = move_full - last_pos + hide_pos; last_pos += move; up.Move( 0, move ); down.Move( 0, move ); for( size_t i = 0; i < przyciski.size(); ++i ) przyciski[ i ]->buttonMove( 0, move ); return 0; }
W skrócie pozycja na osi y menu jest względna do pozycji sinusa na osi y w danym punkcie (od 0 do 1*5/8*pi (w radianach)) przez co menu się opuści i później trochę podniesie :) |
|
« 1 » |