Multiplayer

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Crayhole

Betreff: Multiplayer

BeitragSa, Mai 01, 2004 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Wusste nich wo das rein gehört,aber:

Weiß einer, wo ich mehr über Multiplayer (In 3d-spielen)
erfahre, wie z.B. wie ich sowas mach?
hab nämlich Kene Ahnung Embarassed

Danke im Voraus
Gewinnen ist nicht alles-so denken die Verlierer

Xadas

BeitragSa, Mai 01, 2004 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
schau dir mal den open source code von YAD - Yet Another Deathmatch and is hier irgendwo im forum
Ey isch schlach disch kaputt!
 

Crayhole

BeitragSa, Mai 01, 2004 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Find ich net Crying or Very sad
Aber ich mein auch allgemein mit Erklärungen etc.
Gewinnen ist nicht alles-so denken die Verlierer

Jolinah

BeitragSa, Mai 01, 2004 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte nicht so schwer sein.

Am besten schaust du dir mal die UDP und TCP Befehle auf Blitzbase.de an. Es spielt keine Rolle ob das Spiel 2D oder 3D ist. Das Prinzip ist das selbe.


Ich mach es persönlich immer so das ich zuerst eine Nummer schicke. Diese dient dazu zu unterscheiden was geschehen soll.

Z.Bsp. schick ich die Nummer 21. Der Server fragt dann ab was 21 bedeutet.

Nehmen wir an es ist ein Positionsupdate in einem 3D Spiel.
Der Server muss wissen welcher Spieler die Position durchgibt, und die Position selber: X,Y,Z.

Das heisst der Client schickt dann folgende werte:
21, Client_id (oder name), X Pos, Y Pos, Z Pos.

Der Server liest als allererstes dann die Erkennungsnummer aus, in diesem Fall 21, da diese Nummer ja bei allen Nachrichten immer Vorabgeschickt wird. Danach weiss er was 21 bedeutet und liest die Client ID aus (ein Int), danach 3 Floats für die XYZ Position.

Wäre aber diese Nummer nicht wüsste der Server ja nicht was es als nächstes auslesen soll, ob Strings, Ints oder Floats etc. denn statt ein Positionsupdate könnte man auch ein Namens Update machen falls der Client den Namen ändern will. Z.Bsp nummer 22.
Sieht dann vielleicht so aus:

22, Client_id, NeuerName$

Dann darf der Server natürlich nicht ein Int und 3 Floats lesen sondern ein Int und ein String.

Deshalb diese Nummer zum unterscheiden, ich hoffe ich konnte dir das Prinzip erklären. Ich finde es so am einfachsten.

Der Rest muss man sich einfach selber überlegen wie man es macht.
Gibt halt auch verschiedene Varianten:

Standalone Server - Clients
1 Server der das ganze Regelt mit den verschiedenen Clients die sich ausschliesslich zum Server verbinden. Will ein Client dem anderen eine Nachricht schicken so wird die Nachricht nicht dem Client direkt übermittelt sondern dem Server und dieser leitet sie dann an den richtigen Client weiter.

Client - Client
Der Client der ein Spiel erstellt dient als Server. Somit ist der Server Code direkt im Client eingebaut damit jeder Client als Server dienen könnte. Clients die dann diesem ServerClient beitreten möchten müssen zu diesem Verbinden. Das ganze wird dann von dem ServerClient aus geregelt, aber da der Server gleichzeitig Client ist kann er auch mitspielen.


Hier mal ein Standalone Server - Client Beispiel:


Für server:

Code: [AUSKLAPPEN]

udp = CreateUDPStream(7000)

If Not udp
   Print "Es konnte kein UDP Stream erstellt werden."
   WaitKey()
   End
EndIf


Const CLIENT_CONNECTED = 1
Const CLIENT_DISCONNECTED = 2
Const CLIENT_MESSAGE = 3

Print "Server gestartet."


Repeat

   If RecvUDPMsg(udp) <> 0
      ip = UDPMsgIP(udp)
      port = UDPMsgPort(udp)
      
      id = ReadInt(udp)

      Select id
         Case CLIENT_CONNECTED
            name$ = ReadString(udp)
            Print "Neuer Client: " + name$
         
         Case CLIENT_DISCONNECTED
            name$ = ReadString(udp)
            Print "Verbindung getrennt: " + name$
            
         Case CLIENT_MESSAGE
            name$ = ReadString(udp)
            message$ = ReadString(udp)
            Print "Message from " + name$ + ": " + message$
      End Select

   EndIf


Until KeyHit(1)

CloseUDPStream(udp)

End


Und für nen Client:

Code: [AUSKLAPPEN]

;UDP Stream erstellen.
udp = CreateUDPStream()

If Not udp
   Print "Es konnte kein UDP Stream erstellt werden."
   WaitKey()
   End
EndIf


Const CLIENT_CONNECTED = 1
Const CLIENT_DISCONNECTED = 2
Const CLIENT_MESSAGE = 3

Print "Client gestartet."

;Name abfragen
Print
name$ = Input("Name: ")


;Dem Server bescheid sagen das es nen neuen Client gibt
;und wie er heisst.
WriteInt(udp,CLIENT_CONNECTED)
WriteString(udp,name$)

SendUDPMsg udp,Int_IP("127.0.0.1"),7000




Repeat

   command$ = Input("Command: ")

   If Lower$(command$) = "end" Then Exit
   
   ;Dem Server sagen das wir ihm ne Nachricht schicken wollen
   ;also schicken wir ihm unseren Namen und die Nachricht selber.
   WriteInt(udp,CLIENT_MESSAGE)
   WriteString(udp,name$)
   WriteString(udp,command$)
   
   SendUDPMsg udp,Int_IP("127.0.0.1"),7000   


Until KeyHit(1)

;Dem Server sagen das sich der Client trennt
WriteInt(udp,CLIENT_DISCONNECTED)
WriteString(udp,name$)

SendUDPMsg udp,Int_IP("127.0.0.1"), 7000


;Udp Stream schliessen
CloseUDPStream(udp)

End



;----------------- IP Umwandlungs Funktion ----------------------------------------

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

Function val(String$)
ac=String$
Return ac
End Function
 

Crayhole

BeitragSa, Mai 01, 2004 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
aber wie erstellt man ganze Srver, Menü-auflistungen, etc.???
Gewinnen ist nicht alles-so denken die Verlierer

Hubsi

BeitragSa, Mai 01, 2004 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier gibt's ein Tut von *weißnichtmehr* dazu:
http://www.shit-seite.de/udp.bb
Das Menü dazu, Serverkonfiguration, etc. ist nur eine grafische Oberfläche über die Funktionen. Sollte also nicht allzu schwer zu realisieren sein Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Crayhole

BeitragSa, Mai 01, 2004 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke!
Ich gucks mir ma An
Gewinnen ist nicht alles-so denken die Verlierer
 

alliswrong

BeitragFr, Jul 10, 2009 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiß, ich hole ein altes thema aus der versenkung. trotzdem, sowas muss gelobt werden: Danke @Jolinah für dieses super beispiel! Mit diesem code als vorlage kann man problemlos ein multiplayer spiel erstellen. Sowas müsste normalerweise als sticky thread ganz oben stehen!

[edit]
allerdings gibts nen klitze kleine bug beim client:

Code: [AUSKLAPPEN]

; Name abfragen
Print name$ = Input$("Name: ")


Muss heißen:

Code: [AUSKLAPPEN]

name$ = Input$("Name: ")


Ohne "print", sonst wird der name nicht übertragen!
 

aletes

BeitragFr, Jul 10, 2009 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
??
Also das 'Print' steht aber eine Zeile über dem 'Input'. Heißt ja nur, dass eine Zeile frei gelassen wird Wink
 

Herox

BeitragFr, Jul 10, 2009 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich hatte mal was veröffentlicht das mit Multiplayer zu tuhen hatte weil ich daran Probleme hatte,
aber dieser Code wird dir sicherlich nützlich sein und bedenk du musst noch an dem Code was ändern nehmich die 2 Fehler aber wen du weiter unten schaust in dem Thread steht wie du die Abändern kannst
der Code wird hoffentlich helfen da auch schon die steuerung eines Objectes eingebaut ist nur der Code ist etwas unübersichtlich!

Der Link zum Thread:
https://www.blitzforum.de/foru...hp?t=31826

MFG. Herox
SYSTEMINFO: AMD Phenom 9850 Quad-Core Processor 2500 MHz||4 GB RAM ||MAINBOARD: ASUSTek M3N78-EM|| GRAFIK: NVIDIA GeForce 9600 GT
|| SERVER-HOMEPAGE: http://gamerxl.de/ [IM AUFBAU]
  • Zuletzt bearbeitet von Herox am Fr, Jul 10, 2009 11:56, insgesamt einmal bearbeitet
 

alliswrong

BeitragFr, Jul 10, 2009 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ups ja, habe es in der gleichen zeile stehen gehabt Wink
sorry deswegen.

aber der code ist fantastisch (so sagt es zumindest immer der peter von den ludolfs).
dadurch ist es wirklich einfach koordinaten zu übermitteln und und und...
ich wäre für sticky!

[edit]
ich glaube als einstieg ist dieser code mehr als ausreichend und sehr einfach erweiterbar. zudem ist er wirklich sehr übersichtlich

@Herox, dein code ist bisschen zu unübersichtlich für anfänger. kurz und knapp hilft besser um ein verständnis aufzubauen. der code über uns ist wirklich nur auf udp beschränkt also perfekt zum lernen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group