| 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 |