Simple Platform Online Multiplayer für 2 Spieler

    • GM 8

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

    • Simple Platform Online Multiplayer für 2 Spieler

      Hi,
      hier erkläre ich wie man einen 2D Platform Online Multiplayer macht.
      Ich mache das mit der Netzwerk Funktion des GMs also Mplay.
      In diesem Tutorial erkläre ich regelrecht, wie man bei einem bestehendem 2D Platform Spiel einen Multiplayer Modus macht.


      Diese Tutorial Basiert auf der
      Simple Platform Engine von Mark Overmars

      Ich nehme einfach mal die von YoyoGames, weil sie am unkompliziertesten ist.
      ____
      Na dann los!

      Zuerst muss man ihrgendwie auswählen ob man ein Spiel hosten oder einem beitreten will.
      Wie ihr das macht, ist euch überlassen.

      Der Code für den Host:

      GML-Quellcode

      1. ip=string(get_string("Your Partner's IP:",""))
      2. if mplay_init_tcpip(ip)
      3. {name=get_string("Your Name:","x")
      4. mplay_session_create("",0,name)
      5. global.player=1}
      6. else
      7. {show_message("Fehler beim Verbindungsaufbau!")}


      ip=string(get_string("Your Partner's IP:",""))=Man gibt die IP ein, des Partners, mit dem man sich verbinden will.mplay_init_tcpip(ip) //Die Verbindung wird hergestellt
      mplay_init_tcpip(ip)=Die Verbindung mit der Partner IP wird hergestellt
      name=get_string("Your Name:","x")=Man gibt einen Spielernamen ein
      mplay_session_create("",0,name)=Session wird erstellt. Argument 1 ist der Sessionname, den ihr gerne ändern könnt. Argument 2 ist die maximale Spielerzahl. Argument 3 Ist der eigene Spieler name. In diesem Fall die Variable name.
      global.player=1=Man ist Spieler

      Wir eröffnen ein Spiel. Wenn dies nicht möglich ist, aus welchen gründen auch immer... errort das Spiel

      Der Code für den Beitretenden:

      GML-Quellcode

      1. ip=string(get_string("Your Partner's IP:",""))
      2. if mplay_init_tcpip(ip)
      3. {name=get_string("Your Name:","x") //Der Name...
      4. if mplay_session_find()=0
      5. {show_message("Keine Sessions gefunden!")}
      6. {if not mplay_session_join(0,name)
      7. {show_message("Fehler beim Verbinden!")}
      8. else
      9. {global.player=2}}}
      10. else
      11. {show_message("Fehler beim Verbindungsaufbau!")}
      Alles anzeigen


      Die meisten Funktionen wurden oben schon erklärt.
      Hier wird auf der Ziel IP ein Spiel gesucht und wenn eins existiert treten wir bei und wenn nicht errort das Spiel.

      /!\ Achtung! - Man muss die Session, zu der man verbindet so nennen, wie man sie beim Erstellen nennt!

      Jetzt erstellen wir ein Obj_wait
      Create Event:

      GML-Quellcode

      1. if mplay_player_find()<2{instance_deactivate_all(1)}


      Wenn der 2. Spieler noch fehlt, wird erstmal alles deactiviert.
      Sieht nicht schön aus, aber verschönern könnt ihr es.

      Jetzt kommt ins Stepp Event des Obj_wait

      GML-Quellcode

      1. if not mplay_player_find()<2{instance_activate_all()instance_destroy()}


      Jetzt im Step Event des Spielers:

      GML-Quellcode

      1. if global.player=1
      2. {mplay_data_write(11,x)
      3. mplay_data_write(12,y)
      4. mplay_data_write(13,sprite_index)}
      5. if global.player=2
      6. {mplay_data_write(21,x)
      7. mplay_data_write(22,y)
      8. mplay_data_write(23,sprite_index)}
      9. if global.player=2{if mplay_data_read(19)=1{with instance_nearest(x,y,obj_otherplayer){instance_destroy()mplay_data_write(19,0)}}}
      10. if global.player=1{if mplay_data_read(29)=1{with instance_nearest(x,y,obj_otherplayer){instance_destroy()mplay_data_write(29,0)}}}
      11. score=mplay_data_read(31)
      12. next=mplay_data_read(38)
      13. if next=1{room_goto_next()}
      14. restart=mplay_data_read(39)if restart=1{room_restart()}
      Alles anzeigen


      if global.player=1=Wenn man Spieler 1 ist, werden die Variablen von Spieler 1 gesendet.
      mplay_data_write(11,x) =11 : Erste 1 = Spieler 1, Zweite 1 = Eine der drei Variablen, die gesendet werden müssen. 11=X von Spieler 1
      mplay_data_write(12,y)=12=Y von Spieler 1
      mplay_data_write(13,sprite_index)} //13=sprite index von Spieler 1

      if global.player=2 =Wenn man Spieler 2 ist, werden die Variablen von Spieler 2 gesendet
      Jetzt folgt eigentlich das gleiche wie bei Spieler 1, nur das die erste Zahl eine 2 ist, was heißt, das man Spieler 2 ist

      Danach ließt er die Data 19 (1=Player 1 9=keine Ahnung wieso ich das nehme), diese müsste die Instance sein, welche von Spieler 1 getötet wurde, wenn momentan keine getötet wurde, ist der Wert 0
      Ist der Wert aber nicht 0, so zerstört er das Objekt, welches von Spieler 1 getötet wurde bei Spieler 2.
      Und umgedreht bei Spieler 1.

      Zum Schluss werden noch die Punkte synchronisiert.
      Alle Daten mit 3 am Anfang nehme ich als Spielerübergreifende Daten. Also Daten, die für beide Spieler wichtig sind.

      Wenn wir ein Objekt zerstören (z.B. töten eines Monsters), dann fügen wir folgenden Code hinzu:

      GML-Quellcode

      1. if global.player=1{mplay_data_write(19,1)}
      2. if global.player=2{mplay_data_write(29,1)}

      Man sendet einfach die ID der getöteten Instance an Spieler 1/2.

      Wenn jetzt der Spieler stirbt wird dieser Code ausgeführt:

      GML-Quellcode

      1. if instance_exists(obj_otherplayer){if global.player=1{mplay_data_write(19,obj_otherplayer)}
      2. if global.player=2
      3. {mplay_data_write(29,obj_otherplayer)}}else{mplay_data_write(39,1)room_restart()}


      Wenn man Punkte bekommt (Wodurch ist eure Entscheidung) fügt ihr diesen Code hinzu:

      GML-Quellcode

      1. score+=1mplay_data_write(31,score)



      Wenn wir den nächsten Raum erreichen fügen wir diesen Code hinzu:

      GML-Quellcode

      1. mplay_data_write(38,1)



      Jetzt erstellen wir ein Objekt mit dem Namen obj_otherplayer.
      Dieses wird der jeweils andere Spieler sein.
      In das Step Event des Objektes kommt dieser Code:

      GML-Quellcode

      1. if global.player=1
      2. {x=mplay_data_read(21)
      3. y=mplay_data_read(22)
      4. sprite_index=mplay_data_read(23)}
      5. if global.player=2
      6. {x=mplay_data_read(11)
      7. y=mplay_data_read(12)
      8. sprite_index=mplay_data_read(13)}
      9. if mplay_player_find()>2{instance_destroy()}


      Mal liest die Daten, die oben gesendet wurden und passt x, y und sprite_index dem entsprechend an.

      Jetzt das Draw Event:

      GML-Quellcode

      1. if mplay_player_find()>1
      2. {draw_sprite(sprite_index,-1,x,y)
      3. mplay_player_find()
      4. draw_text(x,y-16,mplay_player_name(1))}


      Man drawt das Sprite des anderen an die stelle des Objektes, aber nur wenn mehr als ein Spieler im Raum ist und man drawt noch den Namen des anderen Spielers über das Objekt.


      ___
      Ich habe lange überlegt welchen Nutzen einem Leben bringen könnten, aber mir viel nicht was zur Engine ohne veränderungen gepasst hätte ein. Z.B. Man muss die Welt neu beginnen. oder Man startet am letzten Level mit Savepoint.

      Edit: Hier das ganze als download:
      Dateien

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Robinx ()

    • Wenn man jetzt hostet, muss man dann auch die IP des Partners angeben oder die von sich selber oder ist es egal was man eingibt?

      GML-Quellcode

      1. ip=string(get_string("Your Partner's IP:",""))
      Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.