Mesh über Netzwerk steuern

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

ewok1

Betreff: Mesh über Netzwerk steuern

BeitragMi, Jan 04, 2012 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Ich möcht ein 3d Netzwerkspiel programmiere. jedoch weiss ich nicht wie man die x/y/z Position der Gegner (bzw. andere Spieler) auf dem eigenen rechner anzeigen kann.

Ich bedanke mich schon im voraus für eure Hilfe

ewok1

ZEVS

BeitragMi, Jan 04, 2012 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Schwierige Sache... Es gibt nicht einfach zwei, drei Funktionen, mit denen das Spiel auf allen Rechnern synchron läuft. Prinzipiell unterscheidet man zwischen einfacherem, verbuggt langsamen TCP und schnellem, komplizierten UDP. Außerdem gibt es Bibliotheken wie SimpleUDP, die UDP vereinfachen wollen. Die DirectPlay-Befehle sind veraltet.
Schau dir doch einfach mal die Beispiele an!

ZEVS

ewok1

BeitragMi, Jan 04, 2012 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle antwort

ich werds mal mit UDP versuchen und schauen was rauskommt.

Tankbuster

BeitragMi, Jan 04, 2012 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht hilft dir das. Ich wollte mal en UDP/TCP Tutorial machen, aber war dann doch zu faul. Das hier sind son paar Fragmente ....

Programm 1 zuerst starten, dann Programm 2.
Anschauen und lernen. Wink

BlitzBasic: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer(BackBuffer())
AppTitle "Server"
SeedRnd(MilliSecs())

Local sende_ip=0
Local sende_port=0

Local gegner_x=0
Local gegner_y=-100

Local mein_x=Rnd(100,300)
Local mein_y=Rnd(100,300)

Local Byte=0

Local start=0
;Variablen deklarieren




stream=CreateUDPStream(8000)
;Ein Stream wird auf Port 8000 erstellt.
;Das heißt, dass unser Programm nun unter diesem Port erreichbar ist,
;Und auch eigene Nachrichten über diesen Pot nach "außen" schicken kann.


timer=CreateTimer(60)
While Not KeyDown(1)
Bewegung=0
Cls




While RecvUDPMsg(stream)<>0
;Mit diesem Befehl prüfen wir, ob wir eine Nachricht bekommen haben.
;Wenn es so ist, liefert diese Funktion die IP Adresse im Integerformat zurück.
;Darum habe ich auch die Variable "IP" genannt.


;Der Stream wird bis zum Ende ausgelesen
While Not Eof(stream)


Byte=ReadByte(stream)
;Es wird zuerst 1 Byte ausgelesen, das entscheidet, ob diese Nachricht
;Wie eine Anmeldung oder Positions-Übergabe gehandhabt werden soll

If Byte=1 Then
sende_ip=UDPMsgIP(stream) ;IP ermitteln
sende_port=UDPMsgPort(stream) ;Port,auf den gesendet werden muss ermitteln.

WriteByte stream,1
SendUDPMsg stream,sende_ip,sende_port
start=1

ElseIf Byte=2 Then
gegner_x=ReadInt(stream)
gegner_y=ReadInt(stream)
EndIf

Wend

;Diese Schleife ist der eigentliche Kern des Programmes. Es wird
;Solange der Stream ausgelesen, bis dieser nichts mehr enthält.
;Schließlich wird das ausgelesene noch angezeigt
;Mit einem Stream kann man genau wie mit einer Datei, die man mit
;OpenFile öffnet umgehen.



Wend
If start=0
Text 100,100,"Warte auf Client..."+Int(Sin(MilliSecs()))


ElseIf start=1

alt_x=mein_x
alt_y=mein_y



If KeyDown(208) Then mein_y=mein_y+1
If KeyDown(200) Then mein_y=mein_y-1
If KeyDown(205) Then mein_x=mein_x+1
If KeyDown(203) Then mein_x=mein_x-1
;Spielfigur bewegen

If mein_x<>alt_x Or mein_y<>alt_y Then Bewegung=1
;Schauen, ob sich der Spieler in diesem Schleifendurchlauf bewegt hat.


If Bewegung=1 Then
WriteByte stream,2
WriteInt stream,mein_x
WriteInt stream,mein_y
SendUDPMsg stream,sende_ip,sende_port
EndIf
;Wenn der Spieler sich bewegt, wird seine neue Position gesendet.
;Wenn er sich nicht bewegt verursacht das nur unnötigen Traffic.





;Textausgabe



Color 0,200,0
Oval mein_x,mein_y,30,30

Color 200,0,0
Oval gegner_x,gegner_y,30,30
;Spielfiguren malen


EndIf

WaitTimer(timer)
Flip 0

Wend
End
;Ende


; _____ _ _ _
;|_ _| | | | | | |
; | | __ _ _ __ | | __| |__ _ _ ___| |_ ___ _ __
; | |/ _` | '_ \| |/ /| '_ \| | | / __| __|/ _ \ '__|
; | | (_| | | | | < | |_) | |_| \__ \ |_| __/ |
; \_/\__,_|_| |_|_|\_\|_.__/ \__,_|___/\__|\___|_|


BlitzBasic: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer(BackBuffer())
AppTitle "Client"
SeedRnd(MilliSecs())

Local sende_ip=INT_IP("127.0.0.1") ;IP eingeben. Im LAN die Lokale IP, im internet die globale IP.
Local sende_port=8000

Local gegner_x=0
Local gegner_y=-100

Local mein_x=Rnd(100,300)
Local mein_y=Rnd(100,300)

Local Byte=0


;Variablen deklarieren




stream=CreateUDPStream(8001)
;Ein Stream wird auf Port 8000 erstellt.
;Das heißt, dass unser Programm nun unter diesem Port erreichbar ist,
;Und auch eigene Nachrichten über diesen Pot nach "außen" schicken kann.



WriteByte stream,1
SendUDPMsg stream,sende_ip,sende_port
;"Anmelde-Nachricht" schicken

timer=CreateTimer(60)
While Not KeyDown(1)
Bewegung=0
Cls


While RecvUDPMsg(stream)<>0


While Not Eof(stream)


Byte=ReadByte(stream)
;Es wird zuerst 1 Byte ausgelesen, das entscheidet, ob diese Nachricht
;Wie eine Anmeldung oder Positions-Übergabe gehandhabt werden soll


If Byte=1 Then
start=1

ElseIf Byte=2 Then
gegner_x=ReadInt(stream)
gegner_y=ReadInt(stream)
EndIf

Wend

;Diese Schleife ist der eigentliche Kern des Programmes. Es wird
;Solange der Stream ausgelesen, bis dieser nichts mehr enthält.
;Schließlich wird das ausgelesene noch angezeigt
;Mit einem Stream kann man genau wie mit einer Datei, die man mit
;OpenFile öffnet umgehen.



Wend


If start=0
Text 100,100,"Warte auf Client..."+Int(Sin(MilliSecs()))


ElseIf start=1



alt_x=mein_x
alt_y=mein_y




If KeyDown(208) Then mein_y=mein_y+1
If KeyDown(200) Then mein_y=mein_y-1
If KeyDown(205) Then mein_x=mein_x+1
If KeyDown(203) Then mein_x=mein_x-1
;Spielfigur bewegen

If mein_x<>alt_x Or mein_y<>alt_y Then Bewegung=1
;Schauen, ob sich der Spieler in diesem Schleifendurchlauf bewegt hat.


If Bewegung=1 Then
WriteByte stream,2
WriteInt stream,mein_x
WriteInt stream,mein_y
SendUDPMsg stream,sende_ip,sende_port
EndIf
;Wenn der Spieler sich bewegt, wird seine neue Position gesendet.
;Wenn er sich nicht bewegt verursacht das nur unnötigen Traffic.










Color 200,0,0
Oval mein_x,mein_y,30,30
Color 0,200,0
Oval gegner_x,gegner_y,30,30

;Spielfiguren malen


EndIf

WaitTimer(timer)
Flip 0

Wend
End
;Ende




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

; _____ _ _ _
;|_ _| | | | | | |
; | | __ _ _ __ | | __| |__ _ _ ___| |_ ___ _ __
; | |/ _` | '_ \| |/ /| '_ \| | | / __| __|/ _ \ '__|
; | | (_| | | | | < | |_) | |_| \__ \ |_| __/ |
; \_/\__,_|_| |_|_|\_\|_.__/ \__,_|___/\__|\___|_|


mfg
Twitter
Download Jewel Snake!
Windows|Android

ewok1

BeitragMi, Jan 04, 2012 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank Tankbuster.
Das ist genau das was ich brauchen kann. bis ich es vollständig verstehe werde ich zwar noch eine weile brauchen Wink , aber für mein jetztiges Projekt verstehe ich den Code genug gut.

ewok1

ZEVS

BeitragMi, Jan 04, 2012 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm bitte zur Kenntnis, dass der von Tankbuster gepostete Code sehr schön die Grundstrukturen einer Netzwerkanwendung verdeutlicht. Für ein netzwerkfähiges Spiel ist er allerdings oft ungeeignet, da Nachrichten verzögert oder verdoppelt werden oder verschwinden können. Wenn du also etwas mehr brauchst, als die aktuelle Position ungefähr gleich zu haben, musst du den Code zum Abfangen o.g. Probleme erweitern.
Nur um eine weitere Nachfrage zu verhindern und damit du dich bei der Wahl des Protokolls / der Engine keinen falschen Hoffnungen hingibst. Vielleicht stellst du am Ende deiner Studien enttäuscht fest, dass UDP dir zu kompliziert ist...

ZEVS

Tankbuster

BeitragMi, Jan 04, 2012 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt schon. Das Spiel wird auch nur im LAN funktionieren. Ich habe noch einen Code, der auch Hole-Punching unterstützt aber das wird zu kompliziert.

Bis man diesen Code hier als Anfänger entschlüsselt hat und in ähnlichen Situationen perfekt anwenden kann, sollte ja schon einige Zeit vergehen, da darf man mit sowas nicht übertreiben. Wink
(ich erinner mich an meine ersten UDP-Versuche. Man, was hätte ich damals für so ein tolles Beispiel gegeben Razz)
Erst die Grundlagen lernen, und dann das fortgeschrittene Smile
Twitter
Download Jewel Snake!
Windows|Android
 

BIG BUG

BeitragDo, Jan 05, 2012 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit kleinen Änderungen kann man das aber noch erheblich verbessern:
-Anstatt nur die Position zu übergeben, übergib auch noch die Richtung und Geschwindigkeit in die sich der Spieler bewegt (also z.B. SpeedX und SpeedY (noch zu definieren)).
Der Netzwerkspieler wird dann solange in diese Richtung bewegt bis das nächste Päckchen ankommt.
-Diese Daten sollten generell z.B. 6 mal pro sekunde (also jeden 10. Schleifendurchlauf) übertragen werden oder falls sich die Bewegungsrichtung geändert hat.

Somit hat man mit einfachen Mitteln schon einen ganz brauchbaren Netzcode der einem zumindest im LAN schon eine Menge Freude bereiten kann.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group