Rozsyłanie i wyświetlanie pozycji graczy
Ostatnio zmodyfikowano 2016-12-18 21:45
sebox Temat założony przez niniejszego użytkownika |
Rozsyłanie i wyświetlanie pozycji graczy » 2016-12-17 12:49:10 Piszę grę 2d platformówkę multiplayer, osobno serwer i osobno client. Kiedy client chce się poruszyć wysyła swoją pozycję do serwera a serwer rozsyła ją do clientów, używam protokołu TCP, więc aby nie zaspamować sobie łącza, wymyśliłem, że client będzie wysyłał swoje położenie np: co 1-2s chyba, że będzie ruch typu skok to odrobinkę częściej, więc potrzebowałem użyć interpolacji liniowej aby gracz nie skakał, tylko płynnie się poruszał od punktu do punktu, ale jest jeden problem z kodem interpolacji: sf::Vector2f Engine::dynamicv( sf::Vector2f from, sf::Vector2f to, float t ) { if( from == to ) { return sf::Vector2f( 0, 0 ); } sf::Vector2f offset = sf::Vector2f( to.x - from.x, to.y - from.y ); float length = sqrtf( offset.x * offset.x + offset.y * offset.y ); if( length == 0 ) { length = 1; } offset = sf::Vector2f( offset.x / length, offset.y / length ); offset.x *= t; offset.y *= t; return offset; }
A mianowicie, gdy client przeniesie gracza tam gdzie miał przenieść i postać na chwilę stoi, to tekstura skacze, w każdej płaszczyźnie góra-dół i lewo-prawo wobec tego funkcja nie zwraca mi położenia (0,0) chyba, że zmniejszę ruch interpolacji do 1 pixela wtedy jest ok, ale jak się domyślacie, to za wolno. Sprawdziłem co zwraca funkcja dynamicv i gdy postać stoi to mam np: (-5,4) i nastepne wywolanie (5,-4) i tak sobie skacze dlatego, że niby ma się poruszać o zbyt wiele pixeli, mam nadzieję, że chociaż odrobinę mnie rozumiecie, wobec tego, ma ktoś jakiś pomysł co z tym fantem zrobić? |
|
pekfos |
» 2016-12-17 14:19:13 TCP nie nadaje się do gier czasu rzeczywistego, w próbkowanie stanu gry co 1-2 sekundy po prostu nie będzie działać poprawnie. |
|
sebox Temat założony przez niniejszego użytkownika |
» 2016-12-18 21:29:25 Pewnie masz rację, dlatego przepisałem część mojego kodu na UDP, czy ze swojego doświadczenia jest mi ktoś w stanie w takim razie powiedzieć czy na takim UDP mogę spokojnie wysyłać pozycję co 30-50ms?? czy jest to za często i lepiej np co 1s ale korzystając wtedy z interpolacji liniowej? |
|
michal11 |
» 2016-12-18 21:45:55 ja bym najpierw spróbował wysyłać i odbierać na ticku, sprofilować jak będzie z wydajnością i dopiero wtedy kombinować jakieś optymalizacje. |
|
« 1 » |