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 :/ : void Player::accelerate( sf::Vector2f mysz, String key, float t ) { Vector2f norm = mysz - spaceship.getPosition(); float rot = atan2( norm.y, norm.x ); predkosc_katowa_poczatkowa = rot / t; predkosc_katowa_koncowa = predkosc_katowa_poczatkowa + przyspieszenie_lub_opoznienie_k ą towe * t; 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 ) ) ); 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 ); } else if( key == "W" ) { float ankle = rot * 180.f / M_PI; ankle += 90; 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 ) { Vector2f norm = mysz - spaceship.getPosition(); float rot = atan2( norm.y, norm.x ); rot = rot * 180.f / M_PI; rot += 90; spaceship.setRotation( rot ); spaceship.move( vx, vy ); vx = vx - vx * 0.002f * 10; vy = vy - vy * 0.002f * 10;
|
|
pekfos |
» 2016-02-29 17:02:42 Jak to ma działać? |
|
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 :).
|
|
pekfos |
» 2016-02-29 21:43:06 Ale jak to ma działać? Co dokładnie chcesz uzyskać? |
|
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. |
|
Gibas11 |
» 2016-02-29 23:24:33 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ć. :) |
|
snajperek130 Temat założony przez niniejszego użytkownika |
» 2016-03-01 00:07:41 O-o, a mozesz mi powiedziec, skad wziales 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); |
|
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. |
|
1 « 2 » 3 |