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

Poruszanie

Ostatnio zmodyfikowano 2016-03-02 21:17
Autor Wiadomość
snajperek130
Temat założony przez niniejszego użytkownika
:/
» 2016-02-28 18:40:04
Ostatnio po sesji wrocilem do pisania tej gry i niestety nie daje rady napisac tego ruchu. W zasadzie moglby byc i ten, ale jednak chce go zmienic. Napisalem troche kodu, ale nie dziala jak powinien. Prosze o pomoc, bo stoje w miejscu :/ :

C/C++
void Player::accelerate( sf::Vector2f mysz, String key, float t )
{
    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
   
    if( key == "A" )
    {
        float xN = static_cast < float >( r * cos( predkosc_katowa_koncowa * t ) );
        float yN = static_cast < float >( r * sin( predkosc_katowa_koncowa * t ) );
        vx -= xN * 0.0002;
        vy += yN * 0.0002;
        spaceship.move( vx, vy );
       
       
       
        /* stary ruch
            rot-=90;
            float xN = static_cast<float>(speed * sin(( rot * M_PI ) / 180.0 ));
            float yN = static_cast<float>(speed * cos(( rot * M_PI ) / 180.0 ));
        vx += xN * 0.02f;
        vy -= yN * 0.02f;
        spaceship.move(vx,vy);
        */
       
    }
   
    else if( key == "W" )
    {
       
        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.02;
        vy -= yN * 0.02;
        spaceship.move( vx, vy );
       
    }
   
}



void Player::update( sf::Vector2f mysz ) //5
{
   
    //rotation in the direction of the mouse
    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;
P-145387
pekfos
» 2016-02-29 17:02:42
Jak to ma działać?
P-145421
snajperek130
Temat założony przez niniejszego użytkownika
» 2016-02-29 20:35:01
Wzory wzialem ze strony http://www.sofizmat.pl/kurs/13   wiec nie wiem. Jesli zle to robie to prosze o nakierowanie :).
P-145426
pekfos
» 2016-02-29 21:43:06
Ale jak to ma działać? Co dokładnie chcesz uzyskać?
P-145427
snajperek130
Temat założony przez niniejszego użytkownika
» 2016-02-29 22:58:49
po nacisnieciu klawisza A lub D statek ma poruszac sie po okregu ruchem jednostajnie przyspieszonym(w sumie nie musi byc jednostajnie przyspieszony, ale po prostu zeby poruszal sie coraz szybciej po okregu.
P-145430
Gibas11
» 2016-02-29 23:24:33
C/C++
float aToRadian( float f )
{
    return f * PI / 180;
}
sf::Vector2f onCircle( sf::Vector2f theta, float radiaus, float angle )
{
    sf::Vector2f tmp;
   
    tmp.x = cos( aToRadian( angle ) ) * radiaus + theta.x;
    tmp.y = sin( aToRadian( angle ) ) * radiaus + theta.y;
   
    return tmp;
}
theta = kursor;
angle = obecny kąt + prędkość kątowa, na przeliczenie zwykłej na kątową znajdziesz w internecie setki poradników, nie ma sensu omawiać;
radiaus = promień, odległość statek – kursor wyliczysz na luzie z Pitagorasa.

Powinno wystarczyć. :)
P-145431
snajperek130
Temat założony przez niniejszego użytkownika
» 2016-03-01 00:07:41
O-o, a mozesz mi powiedziec, skad wziales
C/C++
tmp.x = cos( aToRadian( angle ) ) * radiaus + theta.x;
tmp.y = sin( aToRadian( angle ) ) * radiaus + theta.y;

Ja na stronce znalazlem, ze tak sie oblicza:
x=R*cos(predkosc_katowa*czas);
y=R*sin(predkosc_katowa*czas);
P-145433
Gibas11
» 2016-03-01 15:45:04
Gdzieś w google, chyba pod frazą „point on circle”, strasznie dawno i po prostu wziąłem ten kawałek kodu z mojej gry. To co ty znalazłeś nie może być dobrze, bo w żaden sposób nie jest uwzględniony środek kółeczka, więc wyniki byłyby zawsze bardzo blisko przecięcia osi X i Y. A prędkość kątowa * czas jest chyba równa obecny kąt + kąt pokonany w ciągu klatki.
P-145449
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona