Probleme mit den Netzwerkfunktionen

Previous topic - Next topic

Tiuz

Hallo zusammen,

Ich versuche gerade ein Netzwerkspiel zu schreiben, und dafür die Funktionen aus dem Net Tutorial der Hilfe umzusetzen. Nachdem ich die neueste Version von GLBasic runtergeladen habe, kann ich keinen Spieler  erstellen, nachdem auf einem Rechner ein Spiel gehostet wurde . Mit der alten Version funktionierte dies noch (ältere 4er).

Was muss bei den Netzwerkbefehlen grundsätzlich beachtet werden (XP Einstellungen, Firewall etc.) ?  Das Netzwerk funktioniert, die PC's können aufeinander zugreifen und Dateien kopieren. Irgendwie funktionieren die Befehle mal, und dann wieder nicht, ohne das ich genau weiss warum.

Kann mir jemand helfen?

Danke, Uli.

Kitty Hello

Da wurde nichts geändert. Bitte evtl. mal (möglichst kurzen) Code posten.

Tiuz

Der Code ist recht umfangreich, ich bereite ihn demnächst mal auf.
Vorneweg:

1. Kann man sagen, woran es meistens liegt, wenn kein Spieler erstellt werden kann(NETCREATEPLAYER), nachdem auf diesem Rechner erfolgreich ein Spiel gehostet wurde (NETHOSTGAME)?

2. Woran liegt es typischerweise, wenn diesem gehosteten Spiel ein aderer PC nicht beitreten kann (NETJOINGAME), korrekter Sessionname und HostIP vorrausgesetzt?

3. Wie funktioniert das mit den Nachrichten, werden die solange vorgehalten, bis der Empfänger sie abruft ?

Danke für alle Antworten,

Uli.

Tiuz

Hallo zusammen,

nachdem der Rest von meinem 2D Rennspiel einigermassen läuft (ist noch viel Feinarbeit nötig) will ich mich um die Netzwerkfunktionalität kümmern. Der gepostete Code führt bei mir zu der Ausgabe von "-1" als Spieler ID, wo eigentlich etwas in der Richtung "00000100" ausgegeben werden sollte.

Wo liegt der Fehler?

Uli.

Code (glbasic) Select
GLOBAL spielerid$

IF Teilnehmen$("0.0.0.0", "Testspiel", "Testspieler2") = ""
spielerid$ = Erstellen$("Testspiel", "Testspieler")
ENDIF

PRINT spielerid$, 100, 100
SHOWSCREEN
MOUSEWAIT


// ------------------------------------------------------------- //
// -=#  ERSTELLEN$  #=-
// ------------------------------------------------------------- //
FUNCTION Erstellen$: name_se$, name_sp$
LOCAL status, ident$
IF name_se$ = "" THEN name_se$ = "unbenannt"
status=NETHOSTGAME(0, name_se$, "", "")
IF status
name_sp$="*"+name_sp$
ident$=NETCREATEPLAYER$(name_sp$)
ENDIF
RETURN ident$
ENDFUNCTION // ERSTELLEN$


// ------------------------------------------------------------- //
// -=#  TEILNEHMEN$  #=-
// ------------------------------------------------------------- //
FUNCTION Teilnehmen$: hostip$, name_se$, name_sp$
LOCAL status, ident$
status=NETJOINGAME(0, name_se$, hostip$, "")
IF status
ident$=NETCREATEPLAYER$(name_sp$)
ENDIF
RETURN ident$
ENDFUNCTION // TEILNEHMEN$

Kitty Hello

versuch die IP leer zu lassen, oder nimm "127.0.0.1" für "lokaler PC".

Tiuz

Danke, werd ich daheim ausprobieren.
Nur die IP Information für das Teilnehmen sollte doch keinen Einfluss darauf haben, dass wenn ein Spiel gehostet wurde, kein Spieler auf dem Host erstellt werden kann?
Beim Debuggen stellt sich so dar:
- Es kann an keinem Spiel teilgenommen werden (beabsichtigt, da keins vorhanden)
- Es wird ein Spiel erstellt
- Nachdem Erstellen kann kein Spieler erzeugt werden (Rückgabewert "-1" von NETCREATEPLAYER$)

Kitty Hello

Ich check's nochmal. Kann auch ein Bug sein.

Kitty Hello

Ja. Ist ein Bug. Sorry, kann noch etwas dauern.

Tiuz

Hallo Gernot,

kein Problem, Software ist ja nie ganz bugfrei.
Bin aber froh, dass es kein (nicht ausschließlich) Anwenderproblem ist, war mit meinem Latein echt am Ende.   :-)

Tiuz.

Tiuz

Hallo,

'Netcreateplayer' funktioniert nach dem Update.
Ich habe meinem Program analog zum Tutorial die Befehle 'Netgetplayerid$' und 'Netplayername$' hinzugefügt, allerdings gibt bereits 'Netnumplayers()' den Wert 0 zurück. (in Sub Net_Abfrage)
Der Ausgabebildschrim des Programms zeigt folglich eine leere Spielerliste.
Lässt man den Befehl weg und setzt n_sp=1, dann geben die Befehle "" bzw. "NO_DATA" zurück.

Grüsse, Uli.

Code (glbasic) Select
// Globale Variablen
GLOBAL spielerid$[], spielername$[], i, n_sp
DIM spielerid$[1]; DIM spielername$[1]

// Erstellen oder Einloggen
spielerid$[0] = Teilnehmen$("", "Testspiel", "Testspieler2")
IF spielerid$[0] = "" THEN spielerid$[0] = Erstellen$("Testspiel", "Testspieler")

// Vorhandene Spieler anzeigen
WHILE TRUE
GOSUB Net_Abfrage
PRINT "Spielername" ,20, 10; PRINT "SpielerID" ,220, 10
FOR i = 0 TO n_sp-1
PRINT spielername$[i], 20, (i+1)*20 ; PRINT spielerid$[i], 220, (i+1)*20
NEXT
SHOWSCREEN
WEND


// ------------------------------------------------------------- //
// -=#  ERSTELLEN$  #=-
// ------------------------------------------------------------- //
FUNCTION Erstellen$: name_se$, name_sp$
LOCAL status, ident$
IF name_se$ = "" THEN name_se$ = "unbenannt"
status=NETHOSTGAME(0, name_se$, "", "")
IF status
name_sp$="*"+name_sp$
ident$=NETCREATEPLAYER$(name_sp$)
ENDIF
RETURN ident$
ENDFUNCTION // ERSTELLEN$

// ------------------------------------------------------------- //
// -=#  TEILNEHMEN$  #=-
// ------------------------------------------------------------- //
FUNCTION Teilnehmen$: hostip$, name_se$, name_sp$
LOCAL status, ident$
status=NETJOINGAME(0, name_se$, hostip$, "")
IF status
ident$=NETCREATEPLAYER$(name_sp$)
ENDIF
RETURN ident$
ENDFUNCTION // TEILNEHMEN$

// ------------------------------------------------------------- //
// -=#  NET_ABFRAGE  #=-
// ------------------------------------------------------------- //
SUB Net_Abfrage:
LOCAL i
n_sp = NETNUMPLAYERS()
REDIM spielername$[n_sp]; REDIM spielerid$[n_sp]
FOR i=0 TO n_sp-1
spielerid$[i] = NETGETPLAYERID$(i)
spielername$[i] = NETPLAYERNAME$(spielerid$[i])
NEXT
ENDSUB // NET_ABFRAGE

Tiuz

Hallo liebe GLBasic Gemeinde,

darf ich nochmal mein Problem mit den Netzwerkfunktionen ins Gespräch bringen: :)
Nach dem Update funktioniert der Befehl Netcreateplayer$, aber der darauf verwendete Befehl NETNUMPLAYERS() liefert 0 zurück.

Das kann nat. auch an meinem Code liegen (s.o.)

Wer kann helfen?

Danke, Uli.

Tiuz

Bins nochmal mit meinen Netzwerkfunktionen ;)

Problembeschreibung unverändert, Code s.o.

Wäre auch gerne bereit ein gut verständliches Beispiel für den Showroom zu schreiben, das alle Anfänger bei Netzwerkspielen unterstützt. Dafür müsste ich aber erstmal selber mit den Befehlen klarkommmen.  

Das Problem stellt sich so dar, dass nach dem erfolgreichen Hosten und Erzeugen eines Spielers NETNUMPLAYERS() 0 zurückgibt (statt 1).

Edit: Habe eben die neuste Version runtergeladen, und jetzt schlägt mit identischem Code das Erstellen eines Spielers wieder fehl?!  :S

Tiuz

Gibts denn niemanden in der GLBasic Gemneinschaft, der Interesse an den Netzwerkfunktionen hat? :(

Falls in meinem Code ein dummer Fehler steckt, oder er auf euren Systemen problemlos läuft, bitte kurze Rückmeldung !!
Ich möchte auch mein Angebot nochmal wiederholen, dass ich ein gut dokumentiertes Netzwerkbeispiel für den Showroom mache (kein Chat), wenn ich mit den Befehlen endlich klarkomme.

Grüsse,  Tiuz.

D2O

Hi, ich würd ja gerne.
Aber ich habe mich mit den Netzwerksachen noch garnicht beschäftigt.
Ich wollte in der Hilfe mal etwas nachlesen, finde da aber nichts mit "NETNUMPLAYERS()"

Ansonsten reagiert das Programm bei mir wie Du es beschrieben hast.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Tiuz

Hallo Slayer,

danke für deinen Beitrag. :)

der Befehl NETNUMPLAYERS() ist nicht im Befehlsindex, aber im Net Tutuorial aufgeführt.

Ich denke die Netzwerkbefehle sind für eine Spieleentwicklungsumgebung eine ganz wichtige Sache. Die Befehle sind ja in der Tat sehr einfach gehalten, bloss steht mann dann auch ziemlich hilflos da, wenn sie nicht funktionieren.

Mein Ziel ist es ein einfaches Rennspiel fürs LAN zu schreiben, ich komme aber bei der Net Geschichte nicht weiter.

Grüsse, Tiuz.