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

[SFML 2.0] Obrót po okręgu

Ostatnio zmodyfikowano 2012-11-20 15:28
Autor Wiadomość
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!

C/C++
#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;
}
P-69560
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
P-69563
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...!?
P-69566
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:
C/C++
sf::Sprite sprajcik;
int poz_x = 50;
int poz_y = 50;
int width = 50;
int heigth = 50;
const int promienZataczanegoKola = 30; //tu se ustawiasz co tam chcesz

sprajcik.SetCenter( poz_x + width + promienZataczanegoKola, poz_y );

//w glownej petli
sprajcik.Rotate( 0.09f );
I po problemie
P-69569
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...
P-69571
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:

C/C++
App.setFramerateLimit( 60 );
 
P-69601
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.
P-69602
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ć! 
P-69603
« 1 » 2
  Strona 1 z 2 Następna strona