Multiplayer-Spiel

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Toninator

Betreff: Multiplayer-Spiel

BeitragDi, Sep 30, 2014 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Leute!

Ich habe mich die Tage an der Multiplayer-Programmierung versucht. Dabei habe ich mir zuerst GameNet angeschaut. Ich hatte es aber nicht wirklich zu 100 % verstehen können, weil ich vor allem keine wirklich ausfürhlichen Tutorials dazu finden konnte. In der Hoffnung, damit mehr Glück zu haben, holte ich mir BNetEx, aber auch hier wollte es nicht so wirklich laufen. Bevor ich weiter schreibe, wäre es wohl besser, erst einmal zu schildern, was ich programmieren möchte:

Mir schwebt vor, dass Spieler sich zu einem Server verbinden können. Dort soll man auf einer Map herumlaufen und verschiedene Dinge tun können, also sich Nachrichten schreiben, Mobs abschlachten, sich gegenseitig bekämpfen und miteinander handeln. Ich habe es für mich selbst noch nicht so genau spezifiziert, aber so ungefähr könnte man mein Projekt beschreiben. Wissen würde ich gerne, welche der Möglichkeiten, die einem in BlitzMax zur Verfügung stehen, um ein Online-Spiel zu realisieren, ihr mir empfehlen würdet und wie man sich das Wissen darüber am besten aneignet. Außerdem sei gesagt, dass ich zwar kein Anfänger in Sachen Netzwerke bin, aber auch kein Doktor. Komplizierte Sachen, welche sich außerhalb des Programmierens, also am Router oder so, abspielen, würde ich lieber vermeiden wollen. Alles, was über Port-Weiterleitung und herkömmliche IP-Arbeit hinaus geht, wäre wahrscheinlich eher unpraktisch für mich.

Es sei noch gesagt, dass ich bei den beiden von mir bereits genannten Möglichkeiten, also GameNet und BNetEx, vor allem die Interaktion zwischen Client und Server nicht so sehr gut verstehen konnte. Insbesondere bei GameNet war es mir nicht so klar, welcher Befehl bzw. welcher Befehlsablauf Daten an den Server sendet und welcher Befehl vom Server gesendete Daten empfängt. Auch wie der Server den Datenverkehr, als das Senden und Empfangen von Daten, regelt, erschließt sich mir bis jetzt nicht direkt. Ich habe mir übrigens dieses Tutorial angeschaut.

Ich hoffe, das ich mein Problem ausreichend schildern konnte, und dass mir bitte jemand weiterhelfen kann.
Я люблю тебя, Россия!! <333
 

Hangman

BeitragDi, Sep 30, 2014 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, also ich arbeite auch mit BNetEx.. deswegen werde ich dir mal eine kleine Schritt für Schritt Anleitung schreiben.

Für den Server (TCP):
1. Erstelle dir einen TCP-Stream, [konfiguriere ihn], schalte ihn auf "zuhören":
BlitzMax: [AUSKLAPPEN]
Local testStream:TTCPStream = New TTCPStream
testStream.Init()
testStream.SetLocalPort(9999) 'der Port, auf dem deine Clients connecten können sollen.
testStream.SetTimeouts(300, 300, 300) 'probiere aus, was für dich sinnvoll ist.
testStream.Listen()

Der lokale Port muss geöffnet sein, damit deine Clients connecten können.


2. Nun muss der Stream dauerhaft auf neue Clients geprüft werden. Am besten startest du diese Routine in einem eigenen Thread:
BlitzMax: [AUSKLAPPEN]
While True 'Hier prüfst du am besten, ob dein Stream noch online ist, oder noch online sein soll.
'Neue Clients annehmen (TCP)
Local newStream:TTCPStream = testStream.Accept()
If newStream Then
newStream.SetTimeouts(a, b, c)
'Hier könntest du z.b. noch einen neuen Spieler erstellen, dem du diesen Stream zuweist.
End If

'Evtl. hier noch etwas delayen, je nachdem wie oft du auf neue Clients prüfen willst, berücksichtige dabei deine Timeouts
Wend



3. Nun kannst du den neu erstellten TTCPSTream, den du aus der Clientannahme erhalten hast auslesen, auch die Leseroutine sollte pro Client in einem eigenen Thread gestartet werden:
BlitzMax: [AUSKLAPPEN]
'Lese Stream
If newStream.RecvAvail() Then
While newStream.RecvMsg()
While Not newStream.Eof()
'Lese Nachricht, hier kannst du mit den ganz normalen Stream-Lesebefehlen arbeiten, z.B.:
Local command:Int = ReadInt(newStream))
Wend
Wend
End If



4. Dem Client kannst du wie folgt eine Nachricht senden:
BlitzMax: [AUSKLAPPEN]
newStream.WriteInt(12345)
newStream.SendMsg()

Auch hier kannst du alle Stream-Schreibbefehle benutzen.


Client:
Beim Client geht es im Grunde genauso, nur muss sich dieser verbinden, statt einen Stream zu erstellen, auf dem er ankommende Connections akzeptiert. Also das Verbinden funktioniert so:
BlitzMax: [AUSKLAPPEN]
Local cStream:TTCPStream = New TTCPStream
cStream.init()
cStream.SetTimeouts(a, b, c)
cStream.SetRemoteIP(TNetwork.IntIP("Hier die IP des Servers angeben"))
cStream.SetRemotePort(Hier den Port angeben, den du beim Server als Localport konfiguriert hast)
cStream.Connect()

Diesen Stream kannst du nun genauso wie beim Server den "newStream" zum Senden und Empfangen benutzen.
Ich habe Berthold gebrochen.
  • Zuletzt bearbeitet von Hangman am Do, Okt 02, 2014 10:47, insgesamt einmal bearbeitet
 

Toninator

BeitragMi, Okt 01, 2014 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für deine ausführliche Antwort, Hangman Smile Ich habe mir deine Anleitung zu Herzen genommen und so implementiert. Mit Threads hatte ich bis jetzt aber noch nichts zu tun und das benötigte Modul habe ich auch noch nicht, deswegen habe ich versucht, den Quelltext anders zu realisieren, nämlich indem ich alle Streams in einer Liste speichere. Aber dann meint der Compiler, dass er TList nicht kenne. Wie kann das sein Question

Hier mein Programm (der Client) im gegenwärtigen Zustand:

Code: [AUSKLAPPEN]
SuperStrict

Framework Vertex.BNetEx

Local testStream:TTCPStream = New TTCPStream
Local stream_works:Byte = testStream.Init()
testStream.SetLocalPort(8888)
testStream.SetTimeouts(5000, 5000, 5000)
testStream.Listen()

Global clients:TList = CreateList()

Repeat

   'überprüfen, ob neue Clients verbunden sind
   While Local newStream:TTCPStream = testStream.Accept()
      If newStream Then
         newStream.SetTimeouts(5000, 5000, 5000)
         'Clients_Lesen_Thread.Run(newStream)
      EndIf
   Wend
   
   'Streams nach neuen Nachrichten abhören
   For Local Stream:TTCPStream = EachIn clients
      If Stream.RecvAvail() Then
         While Stream.RecvMsg()
            While Stream.Eof()
               Local command$ = ReadString(newStream)
               Print command$
               Stream.WriteString("Ich habe deine Nachricht erhalten")
               Stream.SendMsg()
            Wend
         Wend
      EndIf
   Next
   
   Delay 5
Until KeyHit(KEY_ESCAPE)
End
Я люблю тебя, Россия!! <333

Xeres

Moderator

BeitragMi, Okt 01, 2014 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Schuld ist
BlitzMax: [AUSKLAPPEN]
Framework Vertex.BNetEx

Wenn du Framework benutzt, musst alle Module die du sonst brauchst mit Import einbinden.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

N0X

BeitragMi, Okt 01, 2014 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du ein Framework benutzt wird ausschließlich dieses Framework benutzt.
Du musst die benötigten Module noch einbinden oder BNetEx eben als Modul einbinden.

MfG,
N0X

EDIT:
Mist, zu spät.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

Hangman

BeitragDo, Okt 02, 2014 10:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry, ich habe mich verschrieben... es muss natürlich While Not stream.Eof() heißen.
Ich habe Berthold gebrochen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group