eindeutige ID - Umsetzung



  • Scarabol schrieb:

    also was die "Projektile" treffen, entscheidet der Client, dass lässt sich auch erstmal nicht ändern, aber indem ich die Bereiche kleiner mache und mehrere ID Bereiche anlege kann ich die Zeiten erstmal reduzieren, danke dafür.

    Naja die projektile solte man im Idialfall so gestalten: Der Client der schießt sagts dem Server, der Server sagt es allen Clienten und entscheidet ob das projektil trifft oder nicht, das shcützt 1. vor manipulation und sorgt 2. dafür das das Projektil überall das gleiche tut, sonst könnte es in einigen Clienten treffen und in anderen nicht.

    Scarabol schrieb:

    Ich hatte gerade die Idee einfach die Speicheradresse zu benutzen, diese kann nur einmal vergeben sein. Problem ist das die Daten von Server und Client sehr wohl die gleiche Speicheradresse haben können, also hänge ich noch vorne eine 1 oder 0 dran für Server oder Client und dann sollte es gut sein...

    Funktioniert das?

    Naja ichw eis nicht so recht, Speicheradressen sind nicht so toll, ein Hex Wert ist zB eindeutig, bei ner adresse ist das sone Sache. Werte anhängen ist auch sone sache bei nem Hex Wert geht das nicht 0x ist die Identifikation für Hex, da darfste nix dran machen.

    Das einfachste verhalten wäre aus meienr Sicht wenn die Spielwelt ansich schon eindeutige IDs hat für Objekte und der Rest vom Server verwaltet wird, dh ein Client meldet sich an, der server weist der Spielfigur eine ID zu und sendet die ID weiter, damit wäre jedes Objekt eindeutig Identifiziert.

    Scarabol schrieb:

    Wie ermitell ich die Speicheradresse eines Klasse bzw. einer Variabel?

    Mit dem & Operator, wies bei zeigern funktioniert.



  • Xebov schrieb:

    Das einfachste verhalten wäre aus meienr Sicht wenn die Spielwelt ansich schon eindeutige IDs hat für Objekte und der Rest vom Server verwaltet wird, dh ein Client meldet sich an, der server weist der Spielfigur eine ID zu und sendet die ID weiter, damit wäre jedes Objekt eindeutig Identifiziert.

    Das ist ja das Problem, der Server hat eine Menge Daten und müsste mehrere Listen (ich sag nicht hunderte aber einige) durchsuchen nur um an eine geeignete ID zu kommen...

    Kann ich einen Pointer speichern, ohne zu wissen worauf er zeigt? Bei Basic waren das immer schöne long Werte soweit ich weiß 😞

    Gruß
    Scarabol



  • Scarabol schrieb:

    Das ist ja das Problem, der Server hat eine Menge Daten und müsste mehrere Listen (ich sag nicht hunderte aber einige) durchsuchen nur um an eine geeignete ID zu kommen...

    Wieso einige Hundert? Das verstehe ich nicht ganz, nehmen wir an du machst dir nen Pool auf, einen für Figuren udn einen für Projektile, dann müsstest du im Zweifel ja immer nur den nächsten freien Platz suchen von deienr Aktuellen position ind er Liste aus, das wäre eine Liste und eine Suche, die im Zweifel auch nicht so sehr lang wäre, gerade bei Objekten mit eienr Kurzen lebensdauer könnte es passieren das du nichtmal scuhen musst sondern der nächste Listenplatz fast garantiert immer frei wäre.

    Scarabol schrieb:

    Kann ich einen Pointer speichern, ohne zu wissen worauf er zeigt? Bei Basic waren das immer schöne long Werte soweit ich weiß 😞

    Naja wenn du nen Zeiger erstellst zeigt er irgendwo hin. Wenn du dem Zeiger ne Adresse zuweist die auf irgendwas zeigt haste das Problem du weist nicht auf was er zeigt, ist es das angenommene Objekt, ein anderer Teil des Programms oder etwas anderes wofür du ne Access Violation kassierst, das is ein Zweischneidiges Schwert.



  • Naja die Variabeln sind doch auch nur Konstanten die beim Programmstart durch Speicheradressen ersetzt werden oder? Das heißt ja das der Pointer den Wert dieser Konstanten enthält, also die Speicheradresse und die kann ja nicht sooo unterschiedlich sein, höchstens hex oder int oder sowas...

    Gruß
    Scarabol



  • Naja doch untershciedlich schon, wenn ich dich richtig verstehe willst du die adresse der Variable auf dem Server nehmen und an den Client schicken, und sowas geht in die Hose, den die Variablen landen ja im RAM wo Platz ist und das ist unberechenbar.



  • Ist ne RAM Adresse nicht immer 6 oder 8 Zeichen lang?

    Gruß
    Scarabol



  • wenn ich dich richtig verstehe willst du die adresse der Variable auf dem Server nehmen [...] sowas geht in die Hose, den die Variablen landen ja im RAM wo Platz ist und das ist unberechenbar.

    Die Speicheradresse bleibt fuer die Lebensdauer des Objektes konstant und eignet sich darum sehr gut als ID.



  • Juhu,

    endlich einer der mir zustimmt, hast du auch ne Idee wie ich die Adresse verwenden kann?

    Kann man da vielleicht was mit Struktur Union machen?
    Dann müsste ich ja nen Pointer erhalten der auf mehrere Typen zeigt/zeigen kann?

    Gruß
    Scarabol



  • Kann man da vielleicht was mit Struktur Union machen?

    Wenn Du unbedingt verschiedene Objekt-Typen unterscheiden musst, kannst Du einfach von einer Basisklasse erben die solche Funktionalitaet bereitstellt:

    class Object
    {
    public:
      enum Type { Thing, Enemy, Projectile, ... };
    
      Object(Type type) : mType(type)
      {
      }
    
      Type getType() const
      {
        return mType;
      }
    
    private:
      Type mType;
    };
    
    class Projectile : public Object
    {
      Projectile() : Object(Object::Projectile)
      {
      }
    
      void explode()
      {
      }
    };
    
    Object *obj= new Projectile();
    if (obj->getType()==Object::Projectile)
    {
      Projectile *p= (Projectile*)obj;
      p->explode();
    }
    

    Eleganter ist jedoch ein gemeinsames Interface fuer alle Objekte bereitzustellen und jeweils mit sinnvoller Funktionalitaet zu ueberschreiben.



  • Scarabol schrieb:

    Ist ne RAM Adresse nicht immer 6 oder 8 Zeichen lang?

    Falls du mit "Zeichen" "Bytes" meinst: Auf 32-Bit-Rechnern ist eine Speicheradresse in der Regel 4 Bytes groß, auf 64-Bit-Rechnern aber schon 8 Bytes.



  • hellihjb schrieb:

    wenn ich dich richtig verstehe willst du die adresse der Variable auf dem Server nehmen [...] sowas geht in die Hose, den die Variablen landen ja im RAM wo Platz ist und das ist unberechenbar.

    Die Speicheradresse bleibt fuer die Lebensdauer des Objektes konstant und eignet sich darum sehr gut als ID.

    Ja aber da er auch von Zeigern sprach hatte ich eher das Gefühl das er mit der Adresse vom Server auf die Stelle im RAM das Clients zugreifen will, deswegen hate ich das geschrieben.



  • mit der Adresse vom Server auf die Stelle im RAM das Clients zugreifen

    Muesste aber jedem klar sein dass das nicht geht 😃



  • Nein, nein, das die Speicheradressen auf beiden Systemen unterschiedlich sind ist mir klar, ich will die Adresse nur als Zahlenwert benutzen, um das Objekt eindeutig zu identifizieren...

    Stimmt auf einem 32 bit System sind die Adressen 4 byte, dann sollte es doch möglich sein, die Adresse von einer beliebigen Variabeln in einer signed long zu speichern und dann mit sprintf in einen String zu "drucken" und an die Clients mit nem WinSocket zu verteilen, oder?

    Gruß
    Scarabol



  • Ja das ginge, müsstest halt das Problem mit den 4 und 8Bytes lösen. In einen String würde ichs allerdings nicht drucken, damit wird die variable nur unnötig lange und du brauchst sie ja nur für einen Vergleich, was am Ende genau drin steht ist ansich ja egal. Wenn dus so machen willst würde ich direkt das int oder long verteilen.



  • hmm,

    soweit ich weiß kann man Programme doch immer nur entweder für 32 bit ODER für 64 BIT compilieren, also währe das ja nur eine Compiler If Frage um das "Problem" zwischen 4 und 8 byte zu lösen, aber ich schaffs nicht das int bzw. long auszulesen, wie geht das?

    Gruß
    Scarabol



  • nimm einfach long, der wächst mit.



  • Tut mir leid Leute, ich kapier einfach nicht wie ihr das meint, würde mich riesig über nen kurzen Codeschnippsel freuen, wie ich es schaffe aus die Speicheradresse der long a in long b zu speichern???

    So?

    long a = 10;
    long * b = &a;
    

    Was ist wenn a eine Struktur verwendet?

    struct1 a.x = 10;
    struct2 b.z = 20;
    long * c = &a bzw = &b;
    

    Gruß
    Scarabol



  • vielleicht sowas?

    long a = 10;
    long b = reinterpret_cast<long>(&a);
    


  • Mist zu langsam 🙂
    Vielen Dank!!!!

    Ihr seid Spitze!!!

    [trash]
    hmm, ich denke ich habs:

    long id = long(&projektile);
    

    Richtig so?
    [/trash]

    Gruß
    Scarabol



  • So nächstes Problem 🙂

    Also ich verwende eine LinkedList, dazu gehört, dass ich einen Iterator habe, dieser zeigt auf ein Element der Liste. Problem ist jetzt das der Link zu dem ListenElement als Privat makiert ist, ergo hab ich erstma keinen Zugriff darauf.

    Kann ich das ändern, ich hab von dem Iterator nur die Headerdatei?
    Was passiert, wenn ich den Link zu dem Element in den Public Bereich verschiebe?

    Eigentlich will ich ja nur lesen, also brauch ich doch keinen Vollzugriff, C++ müsste mich nur mal kurz draufschauen lassen 😉

    Gruß
    Scarabol


Anmelden zum Antworten