Netzwerk Konzept: Objekte hinzufügen und entfernen gesucht



  • Hi,

    ich habe ein kleines Framework aufgebaut, mit dem man schon ein bischen rumspielen kann. Das Level des Spiels ist dabei in einzelen "Frames" unterteilt und der Spieler läuft von Frame zu Frame bis er das Ende des Levels erreicht hat.

    Nun versuche ich das ganze Netzwerk tauglich zu bekommen. Den einfacheren Teil also die grobe Synchronisation der einzelnen Spielelemente erreiche ich einfach indem der Server den Spielern mitteilt, was gerade in ihrem Frame passiert.

    Wenn der Spieler vom Server Informationen bekommt, über ein Objekt, dass er bisher noch nicht kannte fügt er es einfach neu hinzu, sonst aktualisiert er nur die Daten des Spielobjekts.

    Nun zum (für mich) schwierigen Teil und meiner eigentlichen Frage:
    Welche effektiven Konzepte gibt es, um dem Client mitzuteilen, dass er ein Objekt wieder entfernen soll?

    Spontan fallen mir nur diese 2 ein:
    1. Der Server passt auf wann ein Objekt entfernt wird und teilt das allen Clients mit.
    Problem:
    - Wie merkt der Server das ein Objekt verschwunden ist?

    2. Der Client ist in der Verantwortung, der Server sendet also weiter nur die Objekte, die er gerade in dem Frame hat und der Client überprüft, ob er mehr als (1, 2, 3) Zyklen lang keine Informationen für ein Objekt bekommen hat und entfernt es dann eigenständig.
    Problem:
    - Eigentmächtige Clients
    - Entfernt der Clients die "richtigen" Objekte?

    Welche Ideen habt ihr dazu?

    MfG
    Scarabol


  • Mod

    ich finde deine fragerei und deine idee relativ seltsam, es klingt wie "wie kann ich drei schritte nach rechts gehen". wenn etwas ein objekt entfernt, benachrichtige alle anderen dass dem so ist, ich weiss, Capt Obvious.

    wenn du dein system wirklich weiterfuehren willst, erschaffe ein limbo "frame" den kein spieler erreichen kann. da schickst du alle toten hin.



  • Das ist aber wirklich Pipifax...

    Variante 1:

    void World::RemoveObject(Object* obj)
    {
        m_mightyList.Remove(obj);
        if (m_server)
            m_server->OnObjectRemoved(obj);
    }
    
    void Server::OnObjectRemoved(Object* obj)
    {
    #ifdef _DEBUG
        assert(std::find(m_removedObjectIDs.begin(), m_removedObjectIDs.end(), obj->GetID()) == m_removedObjectIDs.end());
    #endif
        m_removedObjectIDs.push_back(obj->GetID());
    }
    

    Variante 2:

    Object::~Object()
    {
        if (m_world && m_world->GetServer())
            m_world->GetServer()->OnObjectRemoved(this);
    
        // other stuff
    }
    

    Oder auch auf 100 andere Arten - was halt am besten in dein Konzept passt.


Log in to reply