Notiz: Das hier ist mein erstes Tutorial, ich hoffe es hilft jemandem und ich drück mich nicht zu undeutlich aus.
Nachdem ihr im Tutorial flogys Tutorial gelernt habt, wie man mithilfe der 39Dll eine Verbindung aufbaut, werde ich euch hier zeigen wie ihr ein einfaches Spiel gestalten könnt.
Die Spielidee ist, wie der Titel schon sagt, einfach: Es geht um 2 Spieler, die jeweils einen "Flugpanzer" haben der möglichst schießen können soll. Beginnen wir bei der Umsetzung erstmal mit der grundlegenden Steuerung des "Flugpanzers":
Dieser Panzer besteht aus einem Grundsprite, einem Geschützturm-Sprite und einem Schatten.
obj_unit_self


Alles anzeigen

Dieses Objekt können wir nun in den Raum ro_battle setzen und testen.
Da dies wohl keine große Herausforderung darstellt, machen wir gleich mit dem Connect-Teil weiter.
obj_connect


Alles anzeigen

Dieses Objekt setzen wir in den Raum ro_connect.
So, jetzt haben wir einen beweglichen Flugpanzer und können schonmal connecten. Jetzt fehlt nurnoch die Übertragung der Daten. Dazu bearbeiten wir erst einmal das Objekt obj_unit_self um die Daten zu senden. Danach werden wir den Empfangsteil programmieren.
Das Grundprinzip ist folgendes: Wenn sich der Spieler gerade bewegt, oder eine Kugel abgefeuert wird, werden (fast) jeden Step alle Daten übertragen.
obj_unit_self


Alles anzeigen
Jetzt haben wir schonmal die Koordinaten übertragen, fehlt noch das schießen:

Alles anzeigen
Jetzt werden alle relevanten Informationen übertragen. Diese müssen wir jetzt nurnoch empfangen und verarbeiten, und es ist vollbracht!
Dazu erstellen wir erstmal ein Gegnerobjekt,
obj_unit_other


Alles anzeigen
Gezeichnet wird der Gegner genau wie der eigene, da wir hier die gleichen Variablen zur Verfügung haben.

Um jetzt ein richtiges Spiel zu erstellen, fehlen natürlich noch einige Sachen. Z.B. sowas wie Lebenspunkte oder so.
Im Example habe ich noch ein paar Sachen eingefügt, downloaden könnt ihr es hier.
Im Example befinden sich auch alle Ressourcen.

Nachdem ihr im Tutorial flogys Tutorial gelernt habt, wie man mithilfe der 39Dll eine Verbindung aufbaut, werde ich euch hier zeigen wie ihr ein einfaches Spiel gestalten könnt.
Die Spielidee ist, wie der Titel schon sagt, einfach: Es geht um 2 Spieler, die jeweils einen "Flugpanzer" haben der möglichst schießen können soll. Beginnen wir bei der Umsetzung erstmal mit der grundlegenden Steuerung des "Flugpanzers":
Dieser Panzer besteht aus einem Grundsprite, einem Geschützturm-Sprite und einem Schatten.



GML-Quellcode
- // Geschützturm zur Maus ausrichten
- image_angle=point_direction(x,y,mouse_x,mouse_y)-90;
- //Die Steuerung selbst
- if keyboard_check(ord("W")){motion_add(direction,1);}
- if keyboard_check(ord("S")){speed-=1;}
- if keyboard_check(ord("A")){direction+=5;}
- if keyboard_check(ord("D")){direction-=5;}
- // Geschwindigkeitsbegrenzung
- if speed>4 {speed=4;}
- if speed<0 {speed=0;}

Dieses Objekt können wir nun in den Raum ro_battle setzen und testen.
Da dies wohl keine große Herausforderung darstellt, machen wir gleich mit dem Connect-Teil weiter.



GML-Quellcode
- if (global.wait==true) {
- global.socket=tcpaccept(global.listen, true);
- if(global.socket < 0){
- exit;
- }
- setnagle(global.socket,true);
- room_goto(ro_battle);
- }
- if (keyboard_check(ord("J"))) {
- if (global.wait==false) {
- global.player=1;
- global.wait=3;
- omenu_draw="Trying to join a session...";
- screen_redraw();
- dllinit(0,1,1);
- global.socket = tcpconnect(get_string("IP des Servers",""),555, true);
- if global.socket>-1 {
- omenu_draw="Joining a session...";
- screen_redraw();
- setnagle(global.socket,true);
- room_goto(ro_battle);
- } else {
- omenu_draw="Error - could not join the session. Press escape to exit.";
- screen_redraw();
- }
- }
- }
- if (keyboard_check(ord("C"))) {
- if (global.wait==false) {
- global.player=0;
- omenu_draw="Creating session...";
- global.wait=true;
- screen_redraw();
- dllinit(0,1,1);
- global.listen=tcplisten(555,10,1);
- omenu_draw="Waiting for other players to join...";
- }
- }

Dieses Objekt setzen wir in den Raum ro_connect.
So, jetzt haben wir einen beweglichen Flugpanzer und können schonmal connecten. Jetzt fehlt nurnoch die Übertragung der Daten. Dazu bearbeiten wir erst einmal das Objekt obj_unit_self um die Daten zu senden. Danach werden wir den Empfangsteil programmieren.
Das Grundprinzip ist folgendes: Wenn sich der Spieler gerade bewegt, oder eine Kugel abgefeuert wird, werden (fast) jeden Step alle Daten übertragen.



GML-Quellcode
- // In diesem Skript senden wir die Koordinaten des eigenen Spielers
- if (!(x==xprev)||!(y==yprev)) { // Wenn sich der Spieler bewegt hat...
- i+=1
- if (i!=10) { // Alle 10 Frames wird das senden ausgelassen
- clearbuffer(); //...löschen wir den Puffer...
- writebyte(1); //...schreiben der "Switch" Variable...
- writeshort(x); // und sämtliche anderen Variablen in Die Nachricht,
- writeshort(y);
- writeshort(image_angle);
- writeshort(direction);
- writeshort(speed);
- sendmessage(global.socket); // und schicken diese dann schließlich ab.
- xprev=x;yprev=y; // Hier werden die Prüfvariablen wieder gesetzt
- }
- }
- if (i=10) {
- i=0;
- }
Jetzt haben wir schonmal die Koordinaten übertragen, fehlt noch das schießen:

GML-Quellcode
- if (mouse_check_button_pressed(mb_left)) {
- // Wenn die linke Maustaste gedrückt wurde, erstellen wir eine Kugel und schicken das an den anderen Spieler
- o=instance_create(x+lengthdir_x(8,image_angle+90),y+lengthdir_y(8,image_angle+90),obj_rocket); // Hier wird die Kugel erstellt
- o.speed=7;
- o.direction=image_angle+90;
- o.image_angle=image_angle;
- o.image_xscale=0.75+speed/16;
- o.image_yscale=0.75+speed/16;
- scr_send_static(); // Hier senden wir nochmal Position und den aktuellen Stand des Geschützturms
- clearbuffer();
- writebyte(2); // Und hier schließlich, das eine Kugel abgefeuert wurde
- sendmessage(global.socket);
- }
Jetzt werden alle relevanten Informationen übertragen. Diese müssen wir jetzt nurnoch empfangen und verarbeiten, und es ist vollbracht!
Dazu erstellen wir erstmal ein Gegnerobjekt,



GML-Quellcode
- var recieve;
- recieve=receivemessage(global.socket);
- if (recieve>0) {
- switcher=readbyte();
- switch switcher {
- case 1:
- // Empfangen von Position, Ausrichtung des Geschützturms, Geschwindigkeit, Richtung
- x=readshort();
- y=readshort();
- image_angle=readshort();
- direction=readshort();
- speed=readshort();
- break;
- case 2:
- // Eine Kanonenkugel wurde abgefeuert
- var i;
- i=instance_create(x+lengthdir_x(8,image_angle+90),y+lengthdir_y(8,image_angle+90),obj_rocket);
- i.speed=7;
- i.direction=image_angle+90;
- i.image_angle=image_angle;
- i.image_xscale=0.75+speed/16;
- i.image_yscale=0.75+speed/16;
- break;
- }
- }
- if (recieve=0) {
- // Der Gegner hat das Spiel verlassen
- show_message("Your opponent has left");
- game_end();
- }
Gezeichnet wird der Gegner genau wie der eigene, da wir hier die gleichen Variablen zur Verfügung haben.

Um jetzt ein richtiges Spiel zu erstellen, fehlen natürlich noch einige Sachen. Z.B. sowas wie Lebenspunkte oder so.
Im Example habe ich noch ein paar Sachen eingefügt, downloaden könnt ihr es hier.
Im Example befinden sich auch alle Ressourcen.