Bimbol Temat założony przez niniejszego użytkownika |
[SFML 2.1] Poruszanie się piłkarza na boisku (skręcanie) » 2013-08-29 00:43:09 Witam, piszę aktualnie grę ala Haxball.
Aktualnie zajmuję się poruszaniem gracza po boisku, jednak mogę poruszać się w 8 kierunkach.
Nie zbyt ładnie to wygląda gdy poruszam się w powiedzmy prawo i po chwili klikam klawisz w górę i od razu jadę po skosie.
Chciał by było to bardziej naturalne. Piłka powinna kiedy trzymam Strzałkę w Prawo i Strzałkę w Górę, początkowo iść bardziej po łuku.
Nie wiem za bardzo jak się za to zabrać.
|
|
akwes |
» 2013-08-29 00:56:32 Jeżeli chodzi o poruszanie się graczem, to musisz zrobić płynne poruszanie.
Czyli, jak ktoś wciska strzałkę np. w górę to nie od razu gracz jest przemieszczany z pełną prędkością. Jeżeli maksymalna prędkość jest 1, to w kolejnych odstępach czasowych jego prędkość powinna wynosić naprzykład 0.1, 0.3, 0.4, 0.6, 0.7, 0.9, 1, 1, 1, (puszczenie strzałki), 0.6, 0.3, 0.1, 0.0.
Ewentualnie możesz się pobawić w fizykę i wzory z przyspieszeniem oraz prędkością maksymalną, bo do tego to się głównie sprowadza.
Jeżeli zrobisz tak dla kierunków X oraz Y to gracz będzie się ładnie poruszał. |
|
kubawal |
» 2013-08-29 09:59:24 Albo po użyć box2d i ApplyImpulse() |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-08-29 11:26:33 Jeżeli chodzi o poruszanie się graczem, to musisz zrobić płynne poruszanie.
Czyli, jak ktoś wciska strzałkę np. w górę to nie od razu gracz jest przemieszczany z pełną prędkością. Jeżeli maksymalna prędkość jest 1, to w kolejnych odstępach czasowych jego prędkość powinna wynosić naprzykład 0.1, 0.3, 0.4, 0.6, 0.7, 0.9, 1, 1, 1, (puszczenie strzałki), 0.6, 0.3, 0.1, 0.0. |
Chyba do tego się dostosuję. Albo po użyć box2d i ApplyImpulse() |
Wolę obecnie dobrze nauczyć się korzystać z jednej biblioteki, później przyjdzie pora na Box2D. |
|
maly |
» 2013-08-29 11:26:33 Wystarczy sprawdzić z której strony lini o pozycji startowej (0,0) i końcowej(źądany kierunek) jest atualny kierunek objektu, potem odpowiednio obracać.
float whichSideLine( const sf::Vector2f & start, const sf::Vector2f & end, const sf::Vector2f & point ) { return( end.x - start.x ) *( point.y - start.y ) -( end.y - start.y ) *( point.x - start.x ); }
float side = whichSideLine( sf::Vector2f( 0, 0 ), nowyKierunek, aktualnyKierunek ); if( side > 0 ) rotate( aktualnyKierunek, 1 ); else if( side < 0 ) rotate( aktualnyKierunek, - 1 ); |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-08-29 12:53:08 Wystarczy sprawdzić z której strony lini o pozycji startowej (0,0) i końcowej(źądany kierunek) jest atualny kierunek objektu, potem odpowiednio obracać.
float whichSideLine( const sf::Vector2f & start, const sf::Vector2f & end, const sf::Vector2f & point ) { return( end.x - start.x ) *( point.y - start.y ) -( end.y - start.y ) *( point.x - start.x ); }
float side = whichSideLine( sf::Vector2f( 0, 0 ), nowyKierunek, aktualnyKierunek ); if( side > 0 ) rotate( aktualnyKierunek, 1 ); else if( side < 0 ) rotate( aktualnyKierunek, - 1 );
|
Nie o to chodzi :) |
|
maly |
» 2013-08-29 13:25:02 Kilka razy przeczytałem Twój problem i cały czas dochodzę do wniosku że po naciśnięciu któregoś kursora chcesz pomału skierować się w tą stronę, jeśli dobrze zrozumiałem to kod który podałem to właśnie robi. |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-08-29 14:08:51 Piszę haxball więc po co mi tam skręcanie? Chodziło o to by piłka przy zmianie kierunku nie poruszała się od razu maksymalną prędkością, czyli by wyglądało to bardziej naturalnie. Tak jak by początkowo wchodziła w łuk, a dopiero po osiągnięciu maksymalnej prędkości leciała po skosie.
EDIT. Do zamknięcia, udało mi się. Dziękuję wszystkim za pomoc, w szczególności akwesowi. |
|
« 1 » |