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

Gra mmo -SFML Network

Ostatnio zmodyfikowano 2014-09-21 22:40
Autor Wiadomość
AvShad
Temat założony przez niniejszego użytkownika
Gra mmo -SFML Network
» 2014-09-20 21:45:03
Proszę was o pomoc a nie o pisanie że za mmo zabierz się później. Taki mamy projekt z kolegą i chcemy go ukończyć. Ma być to małe mmo serwer ma obsłużyć max 100 graczy. Do kolizji użyty będzie box2d. Teraz w czym problem. Do komunikacji używam sfml-network. Aplikacje klient-serwer napisałem do tego momentu że obsługuje ona logowanie, rejestracje, zamykanie klienta = zrywanie połączeń, czyszczenie slotów tzn nie tworzy miliardów socket[MILIORD] = new TcpSocket. W chwili obecnej zacząłem pisać wysyłanie danych o pozycji gracza(jednego tzn klient wysyła literke "d", serwer odsyła zmienioną pozycje) i mam problem. Niby wszystko działa poruszam sie bez opóźnień ale co jakiś czas tak jakby pakiety się przesuwały, gracz na chwile pojawia się na pozycji 0,0 i wraca na swoją poprzednią pozycje. Męczę się z rozwiązaniem tego a może błąd jest oczywisty dlatego piszę o wasze rady.

Serwer.cpp
C/C++
void Network::movementData()
{
    if( selector.wait( microseconds( 1 ) ) )
    {
        for( int i = 0; i < online; i++ )
        {
            if( players[ i ] != 0 )
            {
                if( selector.isReady( players[ i ]->client ) )
                {
                    if( players[ i ]->cRespond == true )
                    {
                        Packet movement;
                        string mov;
                        players[ i ]->client.receive( movement );
                       
                        movement >> mov >> players[ i ]->functionID;
                        if( mov != "" )
                        {
                            if( mov == "d" )
                            {
                                players[ i ]->x = players[ i ]->x + 4;
                               
                               
                            }
                            else if( mov == "a" )
                           
                            {
                                players[ i ]->x = players[ i ]->x - 4;
                            }
                            else if( mov == "w" )
                            {
                                players[ i ]->y = players[ i ]->y - 4;
                            }
                            else if( mov == "s" )
                            {
                                players[ i ]->y = players[ i ]->y + 4;
                            }
                            else { }
                           
                        }
                       
                        //WYSYALNIE ONLINE GRACZY
                       
                       
                       
                       
                        movement.clear();
                        movement << players[ i ]->x << players[ i ]->y;
                        players[ i ]->client.send( movement );
                       
                    }
                }
            }
        }
    }
   
   
   
}

void Network::logout()
{
    if( selector.wait( microseconds( 1 ) ) )
    {
        for( int i = 0; i < maxonline; i++ )
        {
            if( players[ i ] != 0 && players[ i ]->cRespond == true )
            {
                if( selector.isReady( players[ i ]->client ) )
                {
                   
                    Packet pack;
                    pack.clear();
                    players[ i ]->client.receive( pack );
                   
                    pack >> players[ i ]->endconection;
                    if( players[ i ]->endconection == 987 )
                    {
                       
                        selector.remove( players[ i ]->client );
                        konsola->addLine( players[ i ]->nick + " rozlaczyl sie!", Color::Blue );
                        delete players[ i ];
                        players[ i ] = 0;
                        online--;
                       
                    }
                   
                }
            }
           
           
        }
    } }

void Network::sendOnline()
{
    if( selector.wait( microseconds( 1 ) ) )
    {
        for( int i = 0; i < maxonline; i++ )
        {
            if( players[ i ] != 0 )
            {
                if( selector.isReady( players[ i ]->client ) )
                {
                    Packet onl;
                    onl << online;
                    players[ i ]->client.send( onl );
                }
            }
        }
    }
}

Klient
C/C++
void Network::movementData()
{
    Packet pack;
    string mov = player[ 0 ]->movement();
    pack << mov << functionID;
    client->send( pack );
   
   
   
    pack.clear();
    client->receive( pack );
    float xs = 0;
    float ys = 0;
    pack >> xs >> ys;
   
    player[ 0 ]->setPosition( xs, ys );
   
   
   
   
   
   
   
}

void Network::isDisconnect()
{
   
    Packet pack;
    pack.clear();
    pack << logout;
    client->send( pack );
   
   
}
void Network::disconnect( int stan )
{
    logout = stan;
}

void Network::update()
{
    getOnline();
    movementData();
    isDisconnect();
   
   
   
}
[/i]

Serwer Gui
C/C++
ServerGui::ServerGui()
{
    window = new RenderWindow( VideoMode( 800, 600 ), "SpaceProject 2D - server" );
    window->setFramerateLimit( 30 );
    gui = new tgui::Gui( * window );
    gui->setGlobalFont( "fonts/DejaVuSans.ttf" );
    loadWidgets();
    network = new Network( gui );
   
    ticrate = 0;
   
}
void ServerGui::loadWidgets()
{
    tgui::ChatBox::Ptr chatbox( * gui, "konsola" );
    chatbox->load( "widgets/Black.conf" );
    chatbox->setSize( 800, 400 );
    chatbox->setTextSize( 20 );
    chatbox->setPosition( 0, 0 );
    chatbox->setTextSize( 13 );
}

void ServerGui::mainLoop()
{
    network->startServer();
   
   
    while( window->isOpen() )
    {
        sf::Event event;
        while( window->pollEvent( event ) )
        {
           
            if( event.type == sf::Event::Closed )
                 window->close();
           
            gui->handleEvent( event );
        }
       
        network->holdConnection();
        network->holdLogin();
        network->sendOnline();
        network->movementData();
        network->logout();
       
        ticrate++;
        window->clear();
        gui->draw();
       
       
       
        window->display();
    }
}
P-117254
pekfos
» 2014-09-21 00:05:06
C/C++
network->holdConnection();
network->holdLogin();
network->sendOnline();
network->movementData();
network->logout();
Czemu to wszystko jest w pętli głównej?

C/C++
float xs = 0;
float ys = 0;
pack >> xs >> ys;
Sprawdź zachowanie programu dla innych wartości początkowych dla xs i ys.
P-117263
AvShad
Temat założony przez niniejszego użytkownika
» 2014-09-21 01:06:13
a jak powinna wygladac pętla dla obsługi sieci?
P-117264
pekfos
» 2014-09-21 11:09:19
Chyba jest dobrze, nie licząc nazw wprowadzających w błąd. Podaj pętlę główną klienta i odpowiedz na poprzedni post.
P-117270
AvShad
Temat założony przez niniejszego użytkownika
» 2014-09-21 12:01:12
Glowna petla klienta
Dla wartości ustawionych na 1 problem dalej występuje. Przez 10 sekund nie ma lagów i wszystko działa po 10 sec pakiety się gubią/przesuwają postać skacze między pozycją 0,0 a swoją właściwą pozycją i pojawiają się lagi.
C/C++
void Game::mainLoop()
{
   
    while( window->isOpen() )
    {
       
        Event event;
        while( window->pollEvent( event ) )
        {
           
            if( event.type == sf::Event::Closed )
            {
                networkHolder->disconnect( 987 );
                window->close();
            }
           
           
           
            gui->handleEvent( event );
        }
        tgui::Callback callback;
        while( gui->pollCallback( callback ) )
        {
           
            if( callback.id == 1 )
            {
               
            }
        }
       
       
       
        networkHolder->update();
       
        window->clear();
        gui->draw();
        networkHolder->draw();
       
       
        window->display();
    }
}
P-117278
AvShad
Temat założony przez niniejszego użytkownika
» 2014-09-21 17:59:53
Dobra dodałem pętle czasu rzeczywistego i na localhoscie wszystko działa, do czasu aż nie zminimalizuje okna. Jeżeli zminimalizuje klienta i z powrotem go zmaksymalizuje to występuje spore opóźnienie ale postać nie przeskakuje. Za to kolega połączony na hamachi(80 ping) porusza się płynie ale postać skacze i tak samo jak zminimalizuje to ma lagi. W dodatku czasami pojawiają się zwiechy i nie może się wgl ruszać... masakra z tym połączeniem przez sieć. Jakieś pomysły? Pętla wysyła 30 pakietów na sekundę. Jak rozwiązać sterowanie gracza? Wysyłanie wciśniętego klawisza i odbieranie pozycji skutkuje niepłynnym poruszaniem się postaci nawet na localhoście. Macie jakieś pomysły jak wykonać sterowanie ale jednocześnie zabezpieczyć to przed cheaterami czyt. speedhack?
P-117288
pekfos
» 2014-09-21 18:10:06
Modyfikuj pozycję lokalnie i wysyłaj serwerowi. Będzie mógł sprawdzić, czy prędkość poruszania się nie jest za duża.

masakra z tym połączeniem przez sieć.
A czego się spodziewałeś? Bez dobrze przemyślanego projektu komunikacji sieciowej, gry mmo nie napiszesz. Pisanie sieciówki na odwal nie sprawdzi się nawet przy kilku graczach, a co dopiero przy kilkudziesięciu, czy więcej.. Jak nie chcesz dostawać odpowiedzi typu 'za mmo zabierz się kiedy indziej', to chociaż nie prowokuj.
P-117289
AvShad
Temat założony przez niniejszego użytkownika
» 2014-09-21 20:42:21
tak znam to rozwiązanie i chciałem go użyć, ale skoro chcę aby fizykę liczył box2d na serwerze to nie mogę ustawiać pozycji gracza w taki sposób, ale z drugiej strony do postawienia serwera będę potrzebował kompa z NASA i dobrze by było wykorzystać moc obliczeniową graczy ehhh na papierze to wszystko jakoś tak pięknie wyglądało musze to jeszcze raz przemyśleć... Ostatnie pytanie czy pchanie 30 pakietów co klatkę to dobry pomysł? Gdy program ustawiony jest na 30 klatek na sekunde? Czy lepiej ustawić mniej?
P-117297
« 1 » 2
  Strona 1 z 2 Następna strona