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

Rozsyłanie i wyświetlanie pozycji graczy

Ostatnio zmodyfikowano 2016-12-18 21:45
Autor Wiadomość
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:

C/C++
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ć?
P-155081
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.
P-155085
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?
P-155158
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.
P-155163
« 1 »
  Strona 1 z 1