Netzwerkspiel ... was muss ich tun?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Akiba

Betreff: Netzwerkspiel ... was muss ich tun?

BeitragDo, Sep 02, 2010 11:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute!

Ich hatte letzte Nacht das Ziel gesetzt, ein kleines Netzwerkspiel zu schreiben. Aber da ich sowas noch nie getan hatte, wollte ich erstmal ein Testprogramm schreiben, mit dem ich die dafür benötigten Befehle kennen lernen wollte.

Ich wollte DirectPlay verwenden. Nach ich fertig mit dem Programm war, schickte ich es einem Freund und wollte es ausprobieren. Host zu sein war kein Problem, doch der Session beizutreten ging nicht. Eine Verbindung konnte nicht aufgebaut werden.

Nachdem ich hier im gelesen hatte, dass sich DirectPlay nicht für Internetspiele eignet, nahm ich mir UDP vor. Da scheiterte es schon in der Programmierung. Denn ich ich hatte keine Ahnung, wie ich aus einer IP-Adresse den Integerwert gewinnen kann.
Und es kam noch schlimmer. Etwas, dass ich gehofft hatte, außer Acht lassen zu können... Und zwar die Geschichte mit den Ports! Um genauer zu sein: Das Portforwarding. Ich hatte das Problem schonmal bei einer anderen Sache (eigener CSS-Server) und es wollte einfach alles nicht so funktionieren, wie ich es gerne gehabt hätte.

Aber okay! Bevor ich mich nun wieder in dieses undurchsichtige Gestrüpp werfe, wollte ich erstmal fragen:
1. Ist DirectPlay dennoch über Internet möglich? Ich benötige keine hohe Geschwindigkeit für mein Spiel. Es soll so 'ne Art Pokémon - Blaue Edition werden. Nur eben als Multiplayer.
2. Welche Ports müssen bei DirectPlay, wenn es denn über Internet möglich ist, beim Host und welche bei den Mitspielern geforwardet werden?
3. Welche Ports sind es bei UDP?
4. Ich benutze B3D. Gibt es Programme, die mir den Umgang mit UDP erleichtern könnten?
5. Wenn 4. = false ist: Wie kann man aus einer IP einen Integer machen? Ich hab mir schonmal das Beispielprogramm aus der Hilfe hier bei blitzforum.de angeschaut und habe die Funktionen NewInput$ und INT_IP einfach übernommen, aber das hat nicht funktioniert.

Bitte helft mir, ich möchte unbedingt mein Netzwerkspiel schreiben!
Luigi, man wendet sich nich gegen Familie...

ZaP

BeitragDo, Sep 02, 2010 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Lass mal lieber DirectPlay sein, das ist einfach zu alt. UDP ist eigentlich gut für deine Zwecke. Den Port, auf dem der Stream läuft, kannst Du auch mit CreateUDPStream selbst festlegen. (1024 - 65535)
Die gesuchte Funktion zur Errechnung des Integers einer IP ist diese:
BlitzBasic: [AUSKLAPPEN]
Function INT_IP(IP$)
a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a3=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a4=Int(IP$)

Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) +a4
End Function


Du musst aber beachten, dass z.B. RecvUDPMsg bereits einen Integer zurück gibt.
Starfare: Worklog, Website (download)

Chrise

BeitragDo, Sep 02, 2010 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm doch SimpleUDP oder LlamaNet her Wink
Da gibts Leute die machen sich schon vor dir Kopfzerbrechen, dann musst du dich selbst nicht mehr durch die ganzen Probleme wühlen, die andere schon vor dir hatten Very Happy

lg Chrise
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

ToeB

BeitragDo, Sep 02, 2010 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop Very Happy

LlamaNet oder SimpleUDP sind im prinzip wie DirectPlay, nur halt auch Internetfähig mit vielen weiteren Features, also komplette Clientverwaltung etc. Probier sie mal aus !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Akiba

BeitragDo, Sep 02, 2010 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für eure Antworten =)

Suche jetzt nach einem Tutorial für LlamaNet bzw. SimpleUDP. Gibt es da welche? Wo kann ich sie finden?
Luigi, man wendet sich nich gegen Familie...

Chrise

BeitragDo, Sep 02, 2010 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei LlamaNet gibts diese Dokumentation: https://www.blitzforum.de/upload/file.php?id=8371
Sie ist allerdings nicht meh auf dem Neuesten Stand. Wenn du dich für LlamaNet entscheiden solltest, werde ich dir auch gerne persönich Ratschläge und Hilfe geben.

Für SimpleUDP einfach in der Hilfe Wink
https://www.blitzforum.de/help/?cat=13
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Akiba

BeitragFr, Sep 03, 2010 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für das Angebot, ich werde ggf. gerne darauf zurück greifen =)

Ich habs derweil erstmal ohne oben genannte Hilfen versucht. Hätte ja eigentlich auch klappen müssen. Tat es bloß leider nicht! Ich zeige euch hier mal mein kleines Testprogramm. Es dient nur dazu, festzustellen, ob sich zwei PCs erreichen. Das Gegenüber muss dabei die IP des jeweils anderen beim Start eingeben. (Es ist also nur mit genau zwei PCs möglich ... aber das nur nebenbei!)
Code: [AUSKLAPPEN]
Graphics 800, 600, 32, 2

warten = CreateTimer(1)

SeedRnd MilliSecs()

empfangs_stream = CreateUDPStream(8100)
sende_stream = CreateUDPStream(8101)
WriteLine sende_stream, "hey"

ip_adr$ = Input("IP eingeben: ")
ip_nr = INT_IP(ip_adr$)

Cls
Locate 0, 0
Print ip_nr

Repeat
   
   
   SendUDPMsg sende_stream, ip_nr
   
   ip_adresse = RecvUDPMsg(empfangs_stream)
   If ip_adresse <> 0 Then
      Color 0, 255, 0
      Print "Empfange Signal von" + ip_adr$
   Else
      Color 255, 0, 0
      If Rand(10) = 10 Then
         Print "Scheiße!"
      Else
         Print "Empfange keine Daten"
      EndIf
   EndIf
   
   If KeyHit(1) Then End
      
   WaitTimer(warten)

Forever


Function INT_IP(IP$)
   a1 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a2 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a3 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a4 = Int(IP$)
   Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8) + a4
End Function


Wäre super, wenn mir jemand sagen könnte, warum es nicht funktioniert!
Luigi, man wendet sich nich gegen Familie...

ZaP

BeitragFr, Sep 03, 2010 1:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Die beiden Programme senden auf dem gleichen Port und empfangen an einem ganz anderen Port, sie reden quasi aneinander vorbei - Versuchs mal mit einem Stream, und einem Port, den man am Anfang und beim Verbinden eingeben muss. Der die Clients müssen dann natürlich den Port vom Gegenüber kennen.
Starfare: Worklog, Website (download)

ToeB

BeitragFr, Sep 03, 2010 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Außerdem musst du bei SendUDPMsg zusätzlich noch den Port angeben, sonst sucht die Funktion sich einen automatisch, und es ist in 99.9% aller Fälle der Falsche Laughing

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Akiba

BeitragMi, Sep 08, 2010 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Leute, vielen Dank! Blitz, inklusive UDP, macht jetzt das, was ich möchte =)

Ich hab aber noch eine Frage zu SimpleUDP 2.0 ...
Nämlich: Bei mir fehlt die Funktion UDP_GetMsg. Sie ist nicht enthalten und in dem mitgelieferten Programm TechDemo auch nirgends verwendet. Wurde sie ersetzt...?
Luigi, man wendet sich nich gegen Familie...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group