39 DLL mehr als 2 Spieler???

  • GM 7

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

  • 39 DLL mehr als 2 Spieler???

    Hallo Leute! ICh habe da einige Probleme beim erstellen eines LAN Shooter Games. (2D)

    Also folgendes: Ich habe mich durch tuts durchgeackert und versucht eine verbindung mit 2 Gamern herzustellen. Das klappt soweit ganz gut.
    Jedoch: Wie kann ich während des Games abfragen, ob ein 2ter Spieler hinzugekommen ist? und wie weise ich ihn dann einer variable zu um an ihm Daten versenden zu können?

    Also bei den Tuts gabs einen eigenen room_wait wo man gewartet hat bis der andere Spieler sich verbindet. Man hat währenddessen mit "tcpaccept" den Spieler gefunden und sich mait ihm verbunden. Aber wenn sich nun 2 Spieler verbinden wollen und man beide mit TCP accept auffängt... (bzw der eine ist verbunden und der Andere will sich gerade verbinden) wie kriegt man das hin?
    (also z.B:
    client1 = tcpaccept // spieler1
    client 2 = tcpaccept //player 2
    usw...

    zu 2:

    Man versendet Variablen ja immer mit einer ID numer um sie auf der anderen Seite wieder auslesen zu können. (also writebyte(3) z.B )
    Jedoch wollte ich nun nicht durchgehen ID nummer für einen eigenen Spieler machen sondern diese "ID Nummer" aus einem 2 Dimensionalen Array auslesen.

    Also: Spielerliste[1][3]
    (1 ist dabei die nummer des Spielers [z.B: von acht gamern] und die 3 ist dabei der jeweilige wert wie z.B: Punkte, momentane Waffe, usw...)

    Habe da leider meine schwierichkeiten wenn ich mehr als 2 Spieler machen möchte.

    ICh will hier keine fertigen lösungen oder Scripts. (eine .gmk kommt garnicht in Frage): ICh will nur das ihr mich beim Theoretischen (und leicht) beim Praktischen Teil unterstützt. Sonst lerne ich ja nichts daraus.^^
  • Es gibt ein MMO-Example aber da du ja sowas nicht willst mach ich es so ( die gm6en sind btw kommentiert):
    Es wird eine Player ID verwendet.

    GML-Quellcode

    1. global.player[freie Player ID]=Socket

    Und wenn ein neuer Player da ist musst du den anderen Playern sagen das der neue da ist, am besten Player ID mitsenden. Beim Client wird dann ein Spieler Erstellt und dann die ID unter die Player ID gespeichert.
    Also: Spielerliste[1][3]
    Spielerliste[1,3]
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Hört sich vielleicht blöd an, jedoch weiss ich nicht was ein Socket ist. XD

    Zu deinem Vorschlag: Teilweise verstehe ich ihn und teilweise nicht. ???
    Also wie weise ich dem neuen Player eine neue Verbindung zu? Weil: das funktioniert bei mir über tcpaccept. Also muss der Host den player aktzeptieren um eine Verbindung aufzubauen. Aber wie filter ich aus TCPaccept eine neue Verbindung heraus wenn bereits eine exisitert?
  • Hört sich vielleicht blöd an, jedoch weiss ich nicht was ein Socket ist. XD
    http://de.wikipedia.org/wiki/Socket_(Software)

    Das was ich dir da gesagt hab war eine Server-Client Version.

    Der Master verarbeitet die Verbindungen von jedem Client und sendet sie an jeden Client.
    Wenn ein Spieler zu dem Master verbindet muss der Master eine Instance erstellen das die Verbindung verarbeitet. Du hast einen Array indem du die Socketid speichert.

    GML-Quellcode

    1. //Wenn neuer Player kommt
    2. if (master)
    3. {
    4. var p;
    5. p=tcpaccept(listen,1)
    6. if (p>0)
    7. {
    8. var player;
    9. player=instance_create(0,0,obj_remote)//obj_remote ist das Object das ich oben angesprochen habe
    10. for (i=0;i<=player_anzahl;i+=1;)
    11. {
    12. if (player[i]==-1)
    13. {
    14. player[i]=p;
    15. player.playerid=i;
    16. }
    17. }
    18. player.socketid=p;
    19. //Sage den anderen Clients das ich gejoint habe
    20. clearbuffer();
    21. writebyte(neuer_player)
    22. writeshort(player.playerid)
    23. //An Allen Spieler senden auser den neuen
    24. with(obj_remote)
    25. {
    26. if (id!=other.player)
    27. {
    28. sendmessage(socketid);
    29. }
    30. }
    31. }
    32. }
    Alles anzeigen
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Irgendwie raff ichs nicht...

    Naja... Also ich wollte das so lösen:

    Anfangs (wenn man der host ist) erstellt man ein Array mit sagen wir mal: 4 Spieler. Diese werden mit dem string wert "null" befüllt.

    Nun soll während das Game läuft (man ist in der Arena und kann herumlaufen...) andauernd abgefragt ob eine neue Verbindung hergestellt wird. Wird diese hergestellt, wird diese neue Verbindung in einem Array gespeichert. Dabei soll man gleichzeitig prüfen wo die nächste stelle im Array frei ist. Ist keine stelle im Array frei, wird die Verbindung unterbrochen.

    So in etwa wollte ich es hinkriegen, doch ich raffe es nicht. Das was du mir da gezeigt hast ist nicht so dynamisch "live" während das Games. oder? (Also das man während des Games ne Verbindung aufbauen kann...)
  • Du kannst doch immer noch nach Verbindungen suchen. Guck dir einfach mal die gm6 an. Dort sind Kommentare dabei.
    Anfangs (wenn man der host ist) erstellt man ein Array mit sagen wir mal: 4 Spieler. Diese werden mit dem string wert "null" befüllt.
    Warum Strings? Einfach -1.



    Verbindung von Andere Spieler zu Master steht, aber der Master kann immer noch nach anderen Spieler suchen.

    Hat der Master einen Spieler gefunden, sagt er dem Anderen Spieler das ein Spieler da ist und der Spieler der zu dem Master verbindet bekommt alle anderen Spieler vom Master. Nun kann der Andere Spieler zum Master senden und dieser sendet diese Daten wieder zu den Spieler der zum Master connect hat. Damit der andere Spieler weiß welcher Spieler gemeint ist werden IDs benutzt.

    Hoffentlich verstehst du das jetzt.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Jetzt verstehe ich es. Jedoch weiss ich nicht genau wie der Code den du gepostet hast, da genau in dieses System eingreift. BSP: Wozu ein Objekt Remote erstellen? Ich bin einfach nur dämlich...

    Gibts vielleicht doch nicht ein einfaches example dieser Art? ;( (dann könnte ich mir das in ruhe anschauen...)
  • Mir geht diese Game das ich mache nicht aus dem Kopf. Ich will (und ziwnge mich permanent dazu) diesen (LAN) Multiplayer hoinzukriegen.
    Ich habe mich heute mal rangesetzt und alles zusammengefasst was ich im Multiplayer (in der Grundengine/aufbau) haben wollte. und siehe da:
    Ich habe schon eine teils abstrakt fertige Scriptsammlung die mit bis zu 16 Spielern (beliebig sogar mehr) funktionieren würde.
    Ich weiss wie man auslesen könnte ob ein Spieler im Game ist, wieviele Gamer On sind, und wie man es schafft bei die DAten halbwegs ressourceschonend rüberzubringen.

    Problem: Ich kriege dieses Dynamische Login in bestehende Games nicht hin. Das Problem liegt nicht an deiner Hilfe. Es liegt an mir. Ich verstehe ja das versenden von Daten und wie ich das alles ressourceschonend hinkriege. Aber ich verstehe nicht wie der Aufbau der verbindung (am anfang) gemacht wird. Dadurch verstehe ich deine Scripts so gut wie gar nicht.
    Wenn ich wüsste wie das alles funkt, könnte ich mich mit biegen udn brechen da durchboxen.

    Also noch mal von ganz Anfang an:
    Das Problem liegt an diesen 2 Zeilen:

    GML-Quellcode

    1. listen = tcplisten(14804, 2, true);
    2. client = tcpaccept(listen, true);


    Ich weis nicht was genau bzw wie genau TCPlisten und TCPaccept funktioniert. Wo wird die Verbindung aufgebaut? Wo wird die ID versendet? Wie kann ich mit TCP listen 2 Spieler gleichzeitig abfragen wenn es ja nur 1 eingehende Verbindung aufbauen kann?
    Daran liegt das Problem. (Sry wenn ich zum 2ten oder 3ten mal nachfrage....) ;(

    /Edit: Sry habe noch eine zweite wichtige Frage:
    mit "writebyte()" kann man ja eine Variable versenden. in writebyte gibt man ja eine "ID" an. (wie "1" oder "23". Kann man da auch solche IDs verwenden wie "1,2" oder "5,3" ? )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • Du kannst mehrere Verbindungen haben. Du musst nur das ganze in ein Object verfrachten das während des Spieles benutzt wird.
    Zum Beispiel obj_master.
    Da kommt ins Create Event:

    GML-Quellcode

    1. listen=tcplisten(port,16,1);

    Und in das Step Event:

    GML-Quellcode

    1. var player;
    2. player=tcpaccept(listen,1);
    3. if (player>0)
    4. {
    5. var i;
    6. i=instance_create(0,0,obj_remote);
    7. i.socket=player;
    8. //Anderen Spieler sagen das ein Spieler beigetreten ist
    9. clearbuffer();
    10. writebyte(0) //0 z.b für neuer Player
    11. writestring("") //Nick
    12. writeshort(0) //x
    13. writeshort(0) //y
    14. with(obj_remote)
    15. {
    16. if (id!=other.i)
    17. {
    18. sendmessage(socket);
    19. }
    20. }
    21. with(obj_remote)
    22. {
    23. if (id!=other.i)
    24. {
    25. clearbuffer();
    26. writebyte(0);
    27. writestring(nick);
    28. writeshort(x);
    29. writeshort(y);
    30. sendmessage(other.player);
    31. }
    32. }
    33. }
    Alles anzeigen

    In obj_remote verarbeitest du dann die Daten die von dieser Verbindung kommen.
    Zum Beispiel:

    GML-Quellcode

    1. var size,mid;
    2. size=reactivemessage(socket) //ka wie die funktion jetzt heisst
    3. if (size>0)
    4. {mid=readbyte();}
    5. }
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Also brauch ich listen nur 1 mal aufzurufen?
    Also ist das TCP Accept der "nach Spielern suchende" Befehl?
    Ja.
    und kann ich bei Writebyte solche IDs wie 1,3 und 7,4 benutzen? (also Writebyte(7,4) z.B. Das ist ja die ID der Variable die versendet wird.
    Nein, du kannst es aber mit real(readstring())) überbrücken.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Ah, gut zu wissen.

    Eine Frage Hätte ich da noch: Wie kann ich (falls eine Anfrage bzw eine Verbindung besteht) die Verbindung "unterbrechen" sodass der Client mit einer Hehlermeldung rausgeworfen wird? (z.B: falls einer blödsinn macht, kann der Host ihn rauswerfen bzw falls der Server voll ist....)
  • Verdammt: ích hätte da noc heine Frage:

    Wenn ich an einen Player daten versende. 3 Variablen gleichzeitig:

    GML-Quellcode

    1. clearbuffer()
    2. writefloat(ID) //NetzwerkID
    3. writebyte(0)
    4. writeshort(global.ingameIndex[ID,0])
    5. sendmessage(client)


    wie empfange ich sie dann?

    Beim empfänger ist das ja so geregelt:

    switch (messageID){
    case 0:
    test = readshort;



    Woher weiss ich welche der 3 Variablen ich beim überprüfen anspreche?
  • Nein.Die 39dll arbeiete mit Datentypen.Jeder Datentyp hat eine Größe in Bytes.writebyte==1 Byte.Wenn du nun statt readshort readbyte nimmst wird nur 1 Byte ausgelesen.

    Du kannst zwar lesen, aber da kommen falsche Werte raus. Also immer mit der Reihenfolge wie beim Schreiben verwenden:

    GML-Quellcode

    1. writebyte(1);
    2. writeshort(2)
    3. writefloat(3);
    4. writestring("Bla");
    5. writeint(42);

    GML-Quellcode

    1. readbyte(); //=1
    2. readshort(); //=2
    3. readfloat(); //=3
    4. readstring(); //=Bla
    5. readint();//=42
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%