39DLL 4 Spieler-Problem

  • 39DLL 4 Spieler-Problem

    Hi leute!
    ich bastel immernoch an combat fury und habe jetzt einen LAN-modus für bis zu 4 spieler gebaut.
    einer erstellt das spiel, andere connecten.

    beispiel:
    Wenn sich der spieler auf PC2 bewegt, sendet er die daten an PC1 (server). dieser sendet sie weiter an PC3 und PC4 weiter damit die das auch sehen können.

    jetzt das problem:
    ich schieße mit dem spieler auf PC2 eine kugel ab, die information geht wieder an den PC1 (server), und beim empfangen erstellt auch er eine kugel. jetzt soll das ganze auch auf PC3 und PC4 passieren, also sende ich die daten an PC3 und PC4 weiter und dort sollen auch die beim empfangen eine kugel erstellen.
    HAAAH!!!
    es passiert aber nicht! manchmal passiert es erst nach mehreren sekunden verzögerung und manchmal gar nich es ist total merkwwürdig. hat das vielleicht was mit dem buffer zu tun oder so?
    hier mal mein code beim empfangen:

    GML-Quellcode

    1. //Im STEP Event vom Spieler2-Objekt "obj_otherplayer2"
    2. if global.host receivemessage(2); //Wenn ich der Host bin, empfange vom 2. Spieler
    3. else receivemessage(global.server); //Wenn ich ein Client bin, empfange vom Server
    4. mid=readbyte();
    5. switch (mid) {
    6. case msgShoot2: //Beim Empfangen der Schussinformation...
    7. actShoot(obj_bullet,6); //Kugel erzeugen
    8. clearbuffer(); //Den Buffer leeren
    9. writebyte(msgShoot2); //Die Information "schießen"...
    10. sendmessage(3); //...an PC3 und PC4 weiterleiten
    11. sendmessage(4);
    12. break; //Das wars
    13. }
    Alles anzeigen

    Nur leider kommt selten und wenn nur STARK zeitverzögert bei PC3 und PC4 was an!
    Bitte helft mir is ultrawichtig!!

    ich hoffe es ist einigermaßen verständlich

    "Make love, not Warcraft"
  • habs probiert aber ohne erfolg...
    ich hab es auch so gemacht, dass jedes spielerobjekt für sich daten sendet und empfängt, also komplett ohne control-objekt. sollte ich diese sachen vielleicht über ein controlobjekt laufen lassen, also senden und empfangen?

    "Make love, not Warcraft"
  • kannste mir vielleicht nen tip geben wie ich es am besten mache?
    hab schon so viele exotische varianten ausprobiert :D
    ich will einfach nur ein 4-spieler game machen ohne ne eigene server.exe
    is doch nich zu viel verlangt :D
    danke ;)

    "Make love, not Warcraft"
  • hab mir dein game ma runtergeladen, du benutzt aber die mplay funktionen richtig?
    ich würde gerne ma wissen wie ich es hinbekomme, dass 4 spieler zocken können ohne probleme und ich will auch nich extra ne server.exe laufen lassen das is mir irgendwie zu billig.

    mir ist aufgefallen, dass alle clients ihre informationen (position, kugeln abfeuern,...) an den host pc ohne probleme schicken können, und der host verarbeitete die auch richtig und alles wird richtig angezeigt.
    ich hab es so gemacht dass der host beim empfangen die informationen gleichzeitig an die anderen pcs "weiterleitet".
    da is das problem, das klappt nicht.

    "Make love, not Warcraft"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von HuRr!cAnE ()

  • Also ich mach das ja immer so:

    Neuer Spieler:

    Quellcode

    1. // "zaehler" musst du im Create Event auf 0 stellen.
    2. new = tcpaccept();
    3. if !(new) exit;
    4. o = instance_create(0,0,obj_player);
    5. o.my_id = zaehler;
    6. player_name[zeahler] = 0;
    7. player_socket[zaehler] = new;
    8. zaehler += 1;


    Messages:

    Quellcode

    1. with (obj_player) repeat (10) {
    2. size = receivemessage(player_socket[my_id]);
    3. if !(size) {break;}
    4. switch (readbyte()) {
    5. // ...
    6. }
    7. }


    Naja, dann musst du halt 3 Spieler reinlassen und dann geht das Spiel los.
    Zu deinem Problem kann ich nicht viel sagen weil ich mich so da nicht auskenne :P
  • und alles klappt ohne proböeme bei dir? auch so sachen wie kugeln abfeuern und so?
    seh ich das richtig dass diese beiden quellcodeschnipsel in das stepevent ein controlobjekt reingehören?
    also empfängt ein einziges objekt alle informationen die zum host gesendet werden.

    ach ja, warum repeat (10)? XD

    "Make love, not Warcraft"
  • Jup, auf jeden Fall sieht das so in etwa aus, damit kann man dann alles mögliche machen - was du willst: Chat, Bewegung, Feuern, ...
    Naja, eigentlich ist das für (M)MO gedacht, sollte aber genauso bei dir funktionieren.
    (Ja, beides ins Step Event vom Controller-Objekt (Falls Server).)

    repeat() deshalb weil auch mal mehrere Messages vom gleichen Spieler in einem Step kommen könnten.
  • ich seh gerade du empfängst daten von player_socket[my_id].
    wird er mir denn hier nich nen fehler anzeigen, die variable my_id existiert nicht?
    ich sehe ja du hast o.my_id definiert, aber o is ja ne andere instanz.
    diese my_id ist also in dem spielerobjekt definiert aber nicht in dem controller und global is die auch nicht.

    ---> Ah nein vergiss das, es heißt ja noch vorher with (obj_player) SRRY :D
    danke für die hilfe ich probier das gleich ma aus

    "Make love, not Warcraft"
  • würd eich mich nach deinem code richten würde das bedeuten, dass auf dem server PC nur obj_player "rumlaufen".
    aber das geht ja nich weil MEIN spieelr ja shcon obj_player is den ich bewege.
    müssten das nich außer meinem spieler alles obj_otherplayer sein oder so?
    bist du sicher dass du keine unabhängige server.exe für dein spiel benutzt?
    fiel mir nur gerade so auf

    jetzt hab das objekt dass informationen am Host PC empfängt.
    jetzt muss ich die informationen an die anderen clients weiterleiten.
    da steckt eigentlich mein größtes problem, ich weiß nich wirklich wie ich das am besten anstelle

    "Make love, not Warcraft"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von HuRr!cAnE ()

  • Benutzer online 1

    1 Besucher