wojownik266 Temat założony przez niniejszego użytkownika |
[SFML 2.0] Obrót po okręgu » 2012-11-19 16:23:00 Po dwóch godzinach walki, udało mi się wyprodukować kod programu którego zadaniem jest przewijanie sprita po linii okręgu. Program w stanie takim jakim prezentuję poniżej działa w 95% procentach. Problemem natomiast jest to że obrazek przewija się bardzo szybko i trochę chaotycznie. Czy ktoś bardziej "mądry", mógłby rzucić okiem na ten kod i pomóc wyeliminować ten feler? Dziękuje! #include <SFML/Graphics.hpp> #include <cmath>
double tab_sin[ 360 ]; double tab_cos[ 360 ];
void laduj_sin_cos() { for( int i = 0; i < 360; i++ ) { tab_sin[ i ] = sin(( M_PI *( i ) ) / 180 ); tab_cos[ i ] = cos(( M_PI *( i ) ) / 180 ); } } int main() { sf::RenderWindow App( sf::VideoMode( 640, 480, 32 ), "SFML 2.0 Obrot po okregu" ); sf::Texture statek; statek.loadFromFile( "statek.png" ); sf::Sprite Statek( statek ); double x = 320, y = 240; int alfa = 0, beta = 70; double z_x = 0, z_y = 0; double k_x = 0, k_y = 0; laduj_sin_cos(); while( App.isOpen() ) { sf::Event Event; while( App.pollEvent( Event ) ) { if( Event.type == sf::Event::Closed ) { App.close(); } } alfa -= 0.05; beta += 0.05; z_x =( x * tab_cos[ alfa ] - y * tab_sin[ alfa ] ) + x; z_y =( x * tab_sin[ alfa ] + y * tab_cos[ alfa ] ) + y; k_x =( z_x + 60 * tab_cos[ beta ] ); k_y =( z_y + 60 * tab_sin[ beta ] ); if( alfa <= 0 ) alfa = 359; if( alfa > 359 ) alfa = 0; if( beta <= 0 ) beta = 359; if( beta > 359 ) beta = 0; Statek.setPosition(( k_x / 2 ) + 60,( k_y / 2 ) + 60 ); App.clear(); App.draw( Statek ); App.display(); } return EXIT_SUCCESS; }
|
|
akwes |
» 2012-11-19 16:46:22 A to nie lepiej ustalić środek obrazka gdzieś 100 px na prawo od niego i obracać przez setrotate? Prędkość się policzy z prostego przekształcenia wzorów :P |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-11-19 16:50:44 Nie bardzo łapię tego co masz na myśli. Program pisałem podpierając się tutorialem easycodera... Kawałek przykładowego kodu dla uodpornionych na wiedzę wiele by dopomógł. Więc...!? |
|
RazzorFlame |
» 2012-11-19 16:54:49 EDIT: Akwesowi chodzi o to że kiedy center ustawisz za nim i będziesz używał setRotate to on wtedy będzie kółka zataczał Edit x2: A jeśli chodzi o kawalek kodu to: sf::Sprite sprajcik; int poz_x = 50; int poz_y = 50; int width = 50; int heigth = 50; const int promienZataczanegoKola = 30;
sprajcik.SetCenter( poz_x + width + promienZataczanegoKola, poz_y );
sprajcik.Rotate( 0.09f );
I po problemie |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-11-19 17:14:58 Właśnie że nie po problemie, drogi Razzorku, ponieważ chodzi mi o taki program jaki zamieściłem wyżej. Funkcje rotate znam... Chodzi mi (powtórzę jeszcze raz) o to aby sprit przewijał się po okręgu tak jak w programie który zamieściłem wyżej. Problemem dla mnie jest to ze nie wiem jak zrobić to aby sprit przewijał się wolniej... |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-11-20 13:33:06 Rozwiązanie tego problemu jest banalnie proste, choć nie wiem czy poprawne ale załatwia problem na "cacy". Wszystko sprowadza się do wpisania w pierwszej pętli while takiej instrukcji: App.setFramerateLimit( 60 );
|
|
akwes |
» 2012-11-20 14:06:35 W takim razie masz źle napisany kod. Ponieważ prędkość jest zależna od ilości FPS a nie powinna być. Gra powinna się zachowywać podobnie dla 40 FPS i dla 4000 FPS. Więc albo trzeba zrobić pętlę stałoczasową(czy tam stałoklatkową) albo każde przesunięcie mnożyć razy czas generowania klatki. |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-11-20 14:20:04 A jaka jest różnica pomiędzy pętla stało czasową a pętlą taką jak zamieściłem w pierwszym poście? Dopiero się uczę tak że nie kumam jak by ta pętla miała wyglądać. Mogę prosić o kawałek kodu? O ile to niestanowi problemu. Ma się rozumieć! |
|
« 1 » 2 |