Monster x und y einzeln bestimmen (39dll)

  • GM 7

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Monster x und y einzeln bestimmen (39dll)

    Hi,
    die Überschrift ist etwas undeutlich. Ich möchte euch kurz mein Problem erläutern.
    Ich mache ein Online Game mit 39dll. Es soll mehrere Monster geben, die aber das gleiche Objekt haben.
    Nun möchte ich, das wenn sich ein Spieler einloggt, der Client guckt, wo sich die Monster zur Zeit auf dem Server befinden.
    Soweit sogut. Ich habe es mir so überlegt, das der Server beim Einloggen eines Spielers die x und y werte abfragt und weitergibt. Das habe ich auch schon zum Teil umgesetzt. Da bin ich aber auf das Problem gestoßen, das der Server nur die x und y werte von genau einem Monster weitergibt, da ich ja im create event vom monster auf dem client nur ein x und ein y wert festlegen kann :/
    Ich hoffe ihr konntet mir folgen und vielleicht helfen :)

    Danke schonmal!
    Gruß Terra
  • das hier dürfte dir helfen

    GML-Quellcode

    1. for(i=0; i<instance_number(obj); i+=1) {
    2. k = instance_find(obj,i);
    3. writeshort(k.x);
    4. writeshort(k.y); // usw.
    5. }


    davor und dahinter natürlich die nromalen 39dll befehle zum senden und verschicken. ausserdem ist es ratsam vorher die anzahl einmal mitzuschicken, sodass man auf empfängerseite weiss, wie viele gegner geschickt wurde. habe leider meinen code nicht hier denn dort habe ich genau das gemacht.
  • Vielleicht auch

    with(monster)
    {
    deine messages
    }

    Würde mit allen Monstern das Senden machen, und du könntest auch andere lokale Sachen senden.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • okay dann schreibe ich dir mal die scripte auf und kommentier sie dir.

    Es gibt 2 Messages. Eine zum Senden der Daten, eine zum auslesen.

    Damit das System funktioniert müssen ausserdem alle Monster eine eigene durchnummerierung erhalten, die bei beiden (ich nenne sie jetzt) Clienten gleich ist.

    Damit ergibt sich, das die monster (hier objMonster genannt) beispielsweise 3 attribute haben
    objMonster
    - x
    - y
    - mid

    Nun zum Sendescript

    GML-Quellcode

    1. anzahl = instance_number(objMonster); // Die Anzahl wird 2x benötigt, deswegen kann sie zwischengespeichert werden weil das mit wetten eine langsame funktion ist
    2. clearbuffer();
    3. writeshort(2); // Die Messageidentifizierung beim empfangen
    4. writeshort(anzahl); // Die anzahl der monster
    5. for(i=0; i<instance_number(objMonster); i+=1) {
    6. // Die for Schleife läuft für jedes objMonster einmal durch
    7. k = instance_find(objMonster,i); // k beinhaltet nun die ausgewählte Instanz. Lies die Hilfe zu den Funktionen, wenn du nicht sicher bist was sie machen
    8. writeshort(k.mid); // Wir schicken die MonsterID mit
    9. writeshort(k.x); // und x
    10. writeshort(k.y); // und y
    11. }
    12. sendmessage(global.otherplayer);
    Alles anzeigen



    soweit so gut. Auf empfängerseite sieht das ganze so aus. Dabei ist es wie geschrieben wichtig, dass die Monster auf beiden Seiten die gleiche mid haben.

    GML-Quellcode

    1. case 2: // die erste short wurde schon beim empfangen ausgelesen
    2. anzahl = instance_number(objMonster); // einmaliges auslesen ist deutlich schneller als in jedem for. Die anzahl wird sich auch während dieser berechnung nicht ändern.
    3. for(i=0; i<readshort(); i+=1) {
    4. emid = readshort(); // das hier ist die empfangen MonsterID mit welcher wir jedes monster überprüfen ob sie mt der mid übereinstimmt
    5. // Hier sind ist wohl die größte Bremse und das Problem. Wir müssen die richtigen Monster mit der mid raussuchen und ihnen den richtigen wert übergeben. Was am schnellsten ist, ist eine gute Frage. Ich würde fast sagen ein Liste, wo alle Monster mit dem vom GM vergebenen Objekt id und den mid vertreten sind. Einfachheitshalber machen wir es hier mit einer Schleife.
    6. for(j=0; j<anzahl; j+=1) {
    7. k = instance_find(objMonster, j);
    8. if(k.mid == emid) { k.x=readshort(); k.y=readshort(); }
    9. }
    10. }
    11. break;
    Alles anzeigen


    Ich hoffe ich habe keinen Fehler gemacht. Jedenfalls mache ich es aktuell so und es funktioniert einwandfrei. Das ist ein grobes Konzept. Mit viel Klug- und Weisheit kann man die abläufe und übertragenen Daten optimieren.

    Und der verdammte WYSIWYG editor hat mir die formatierung zersäbelt