Ruch postacią

0

Witam, otoz mam problem, pisze gre i nie potrafie zaprogramowac ruchu jednostajnie przyspieszonego po okregu, przy czym srodkiem okregu jest myszka. Jesli chodzi o kat to normalnie go wyliczam i ustawiam statek w kierunku myszki, wiec musze tylko dobrze wyliczac punkty na okregu. Mecze sie z tym juz dosc dlugi czas i dalej nie wiem, jak to zrobic, a chcialbym to w koncu zrozumiec :/ . Moglby mi ktos to wypisac w punktach? Jak ja to widze:

1.przyspieszenie katowe jest w tym ruchu stale, wiec wybieram sobie jakas wartosc
2.predkosc liniowa na poczatku = 0 (predkosc liniowa jest potrzebna do ustawienia limitu szybkosci poruszania sie)
3.obliczam predkosc katowa koncowa = predkosc katowa poczatkowa + stale przyspieszenie katowe czas
4.wyliczam pozycje x i y
x=Rcos(predkosc katowa koncowa
czas)
y=Rsin(predkosc katowa koncowa czas)
5.obliczam sobie predkosc liniowa ze wzoru predkosc katowa koncowa
R

0

Wygląda poprawnie, sprawdź w jakich granicach masz predkosc katowa koncowa bo jeżeli ona jest blisko granicy 2*Pi to masz problem ze zbyt dużą prędkością lub zbyt małą rozdzielczością czasową.

0

Mam cos takiego:

void Player::accelerate(sf::Vector2f mysz, String key, float t) //to to czas klatki 0.01
{

    Vector2f norm = mysz - spaceship.getPosition();//Counting the vector between the mouse and sprite
    float rot = atan2(norm.y,norm.x);// counting the rotation (angle)
    predkosc_katowa_poczatkowa=rot/t;
    predkosc_katowa_koncowa=predkosc_katowa_poczatkowa+przyspieszenie_lub_opoznienie_kątowe*t; //rad/s
    float r = static_cast<float>(sqrt((norm.x - spaceship.getPosition().x)*(norm.x - spaceship.getPosition().x) + (norm.y - spaceship.getPosition().y)*(norm.y - spaceship.getPosition().y))); // promiec od myszki do statku

    v = predkosc_katowa_koncowa*r;

    if(key=="A") // ruch jednostajnie przyspieszony do lewej
    {

        float xN = static_cast<float>(r*cos(predkosc_katowa_koncowa*t));
        float yN = static_cast<float>(r*sin(predkosc_katowa_koncowa*t));
        vx -= xN;
        vy += yN ;
        spaceship.move(vx,vy);

    }

    else if(key=="W") // tu normalnie do przodu
    {
        float ankle= rot * 180.f/M_PI;//conversion to degrees
        ankle += 90; // adding to work normally 
        float xN = static_cast<float>(5 * sin(( ankle * M_PI ) / 180.0 ));
        float yN = static_cast<float>(5 * cos(( ankle * M_PI ) / 180.0 ));
        vx += xN * 0.02f;
        vy -= yN * 0.02f;
        spaceship.move(vx,vy);

    } 

Nastepnie w Player.update mam

 Vector2f norm = mysz - spaceship.getPosition();//Counting the vector between the mouse and sprite
    float rot = atan2(norm.y,norm.x);// counting the rotation
    rot = rot * 180.f/M_PI;//conversion to degrees
    rot += 90; // adding to work normally 
    spaceship.setRotation(rot);

    spaceship.move(vx,vy);
    //vx = vx - vx * 0.002f*10;//slowing down
    //vy = vy - vy * 0.002f*10;

Niestety nie dziala, po nacisnieciu A wyrzuca mi statek od razu prawie poza ekranem.
Nie wiem tez, jak pogodzic zwalnianie do przodu i do boku, bo do przodu to normalnie zmniejszam szybkosc, ale w lewo nie mozna chyba tak, bo te mnozenie

 0.002f*10

spowoduje, juz nie bedzie ruchu po okregu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0