TCP: Problem für erstellen von Cubes für jeden Client

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 10, 2011 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das ist mir klar, dass ich den würfel und client damit finden kann. Nur wie ist mein Problem!

Ich versteh das nicht wirklich. Ich habe den Clientnamen!

Ich muss es doch irgendwie so in der Art machen können:

BlitzBasic: [AUSKLAPPEN]

For p.Player = Each Player

If ClientName$ ist in irgendeinem Objekt p.Player dann setze Empfangende koordinaten darain

Next


Edit:

Wie ist das außerdem mit Clients die joinen.

Wenn jetzt z.B. schon 11 Spieler im Spiel sind,
wie mach ich´s dann, das der Client der dann noch dazu kommt schon weiß, aha da sind schon 11 Spieler
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMo, Okt 10, 2011 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab grad noch mal ein Edit gemacht als du geantwortet hast:
BlitzBasic: [AUSKLAPPEN]
Function FindTest.TTest(w$)
Local T.TTest
For T = Each TTest
If T\wert = w Then Return T
Next
End Function

Du kannst dir eine beliebige such-Funktion für einen Type schreiben, die dir das passende Objekt gibt.

Edit:
Zitat:
wie mach ich´s dann, das der Client der dann noch dazu kommt schon weiß, aha da sind schon 11 Spieler
Der Server muss dem Clienten alles mitteilen, was die wissen müssen... Alle Spieldaten müssen an den neuen Clienten gehen, alle Clienten müssen von dem neuen Clienten informiert werden.
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)

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 10, 2011 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Hab grad noch mal ein Edit gemacht als du geantwortet hast:


Ja sorry, habe ich erst zu spät gesehen ^^.

@Topic

Ich habe das Beispiel mit den ganz vielen Test´s nich kapiert xD Also zumindest was das soll Question

Mal generell ne Frage, was ist das wenn man z.B. Local T.TEST -- was hat der punkt da zu suchen was macht das ich glaube ich habe noch ein paar Syntax Lücken oder etwas in der Art.

Mit den ganzen Test Beispielen komm ich ganz durcheinander Confused
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMo, Okt 10, 2011 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Punkt zeigt an, das es eine Type-Variable wird und der Typename folgt dann. Man muss halt den Variablennamen irgendwie von Typenamen Trennen "TestTTest" sieht nicht nur doof aus - woher soll BB wissen, was ich damit meine?
Wie üblich gibt man einen Datentyp auch bei der Funktion an, damit bekommst du ein TTest Objekt.
Hast du den Code mal ausgeführt? Schau ihn dir an, spiel etwas damit rum, und frag nach, was genau nicht klar ist. Wenn du Types nicht richtig beherrschst wird es echt hart, die in einem Mulitplayer-Projekt richtig zu benutzen. Du solltest ja nicht auf gut glück was zusammenschreiben - funktioniert selten (eigene Erfahrung).
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)

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 10, 2011 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, okay ich gucke mir dieses Test Beispiel nochmal an und mach was damit.

Aber könnte mir vielleicht gerade einer sagen, wie ich das mit den Koordinaten zuteilung mache, ich blick nämlich schon langsam nichts mehr. Und wenn ich den Thread jetzt pausiere, antwortet nachher sicher niemand mehr. Kenne das ja Very Happy

Ich finde dass ich dadurch am besten lerne Rolling Eyes

Edit: ich würde sagen, dass das Projekt von mir nachdem ich (ihr eigentlich) endlich geschafft habe, die Koordinaten an den richtigen Client zu übertragen und bei Login eines neuen Clients die andren clients dazu gesendet werden, dass ich das Projekt beende. Es ist dann für mich genug stoff da, den ich neu lernen kann. So mach ich´s immer. ich lerne nach dem Projekt alles was ich nich verstehe, sodass ich es verstehe Wink und dann später wenn ich für BlitzBasic reif genug bin, fang ich mit großen projekten an.

Ich würde sagen dass das hier immer nur kleine tests sind, die ich später alle in großen Projekten anwenden werde xP
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMo, Okt 10, 2011 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Killerjo96 hat Folgendes geschrieben:
Ich finde dass ich dadurch am besten lerne
Ich widerspreche mal. Jeder lernt am besten, wenn er selbst herumprobiert und dann auf eine Lösung kommt. Fertiger Code ist nur dann eine gute Hilfe, wenn der Hilfe suchende ihn versteht und sein Problem abstrahieren kann. Niemand lernt allein von Beispiel nach Beispiel - du erfragst im Endeffekt den Code den du brauchst, ohne ein tieferes Verständnis dafür entwickelt zu haben. Das siehst du ja auch:
Killerjo96 hat Folgendes geschrieben:
[...] das Projekt von mir nachdem ich (ihr eigentlich)
Lern die Basics, fang ein kleines Projekt an und versuche nicht nach zu fragen, wie du es lösen solltest. Wenn du fertig bist, poste den Code und frag, was du besser machen könntest. Löse dich von der Idee, einfach und schnell nach zu fragen, wenn etwas nicht geht - du lernst einfach weniger.
Killerjo96 hat Folgendes geschrieben:
Aber könnte mir vielleicht gerade einer sagen, wie ich das mit den Koordinaten Zuteilung mache
Nö - ich bin der Meinung, dir wurde vielfach gesagt was zu tun ist. Du kommst schon klar.
Das war der Psalm für heute.

Viel Spaß & viel Erfolg.
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)

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 10, 2011 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Nö - ich bin der Meinung, dir wurde vielfach gesagt was zu tun ist. Du kommst schon klar.
Das war der Psalm für heute.


Sowas in der Art hatte ich schon befürchtet -.- Naja, okay, es ist wirklich viel gewesen wobei ihr mir geholen habt. Ich werde mir jetzt zuerst das Test Beispiel angucken ^^.

Vielen Dank an dieser Stelle an alle.

Smile Smile Smile

Edit: Habe mir nochmal dieses Test Beispiel angeglotzt Very Happy Habe jetzt nochmal etwas probiert, bekomme jedoch irgendwelche komischen byte zeichen in meiner Server console angezeigt. warum weiß ich auch nicht, eigentlich dürften diese da garnicht stehen.

Hier mal meine bb dateien:

Server:
BlitzBasic: [AUSKLAPPEN]

AppTitle "Teraxia - Game Server"
Graphics 800,320,32,2

Local Frametimer = CreateTimer(60)

Const Client_Joined = 1
Const Client_Left = 2
Const Client_Coords = 3
Const Client_Msg = 4

Global ServerStream,ClientName$,Client_X#,Client_Y#,Client_Z#,Client_Yaw#,ClientIP$,Message$,Port% = 8000
Global Server = CreateTCPServer(Port%)

If Server <> 0 Then

Color 0,255,0
AppTitle "Teraxia - Game Server | Gestartet!"
Print "Der Server wurde gestartet auf Port: " + Port%
Color 255,255,255

Else

Color 255,0,0
Print "Der Server konnte nicht gestartet werden!"
Color 255,255,255
WaitKey()
End

End If


Repeat

UpdateNetwork()

WaitTimer(Frametimer)
Until KeyHit(1)

Color 255,0,0
AppTitle "Teraxia - Game Server | Wird heruntergefahren..."
Print "Der Server wird heruntergefahren..."
Color 255,255,255
Delay 2000

For C.Client=Each Client

CloseTCPStream(C\Stream)

Next

CloseTCPServer Server
End

End

Function UpdateNetwork()

ServerStream = AcceptTCPStream(Server)

If ServerStream Then

C.Client = New Client
C\Stream = ServerStream

End If

For C.Client = Each Client

If ReadAvail(C\Stream) Then
Select ReadByte(C\Stream)

Case Client_Joined

ClientName$ = ReadString(C\Stream) ;Name auslesen.

For Andere.Client = Each Client

If Andere\Stream <> C\Stream
WriteByte(Andere\Stream , Client_Joined)
WriteString(Andere\Stream , ClientName$)
End If

Next

Color 0,255,0
Print "[System]:> " + ClientName$ + " hat das Spiel betreten."


Case Client_Left

ClientName$ = ReadString(C\Stream)

For Andere.Client = Each Client

If Andere\Stream <> C\Stream
WriteByte(Andere\Stream, Client_Left)
WriteString(Andere\Stream, ClientName$)
End If

Next

Color 0,255,0
Print "[System]:> " + ClientName$ + " hat das Spiel verlassen."

Case Client_Coords

ClientName$ = ReadString(C\Stream)
Client_X# = ReadFloat(C\Stream)
Client_Y# = ReadFloat(C\Stream)
Client_Z# = ReadFloat(C\Stream)
Client_Yaw# = ReadFloat(C\Stream)

If Andere\Stream <> C\Stream

WriteByte(Andere\Stream, Client_Coords)
WriteString(Andere\Stream, ClientName$)
WriteFloat(Andere\Stream, Client_X#)
WriteFloat(Andere\Stream, Client_Y#)
WriteFloat(Andere\Stream, Client_Z#)
WriteFloat(Andere\Stream, Client_Yaw#)

End If

Case Client_Msg



End Select
End If

Next

End Function

Type Client

Field Name
Field Stream
Field X
Field Y
Field Z
Field Yaw

End Type


Client:

BlitzBasic: [AUSKLAPPEN]

AppTitle "Teraxia - Ein neues Abenteuer"
Include ".\include\InitClient.bb"
Graphics3D ScreenWidth,ScreenHeight,32,ScreenMode
SetBuffer BackBuffer()

Local FrameTimer = CreateTimer(60)

Const Client_Joined = 1
Const Client_Left = 2
Const Client_Coords = 3
Const Client_Msg = 4

Global ClientName$,Client_X#,Client_Y#,Client_Z#,Client_Yaw#,MyUnDottedIP,MyDottedIP$
Global IP$ = "127.0.0.1",Port% = 8000,Name$
Global Stream = OpenTCPStream(IP$,Port%)

Global MainCam = CreateCamera()
PositionEntity MainCam,0,3,-5

If Stream <> 0 Then
MyUnDottedIP = TCPStreamIP(Stream)
MyDottedIP$ = DottedIP$(MyUnDottedIP)
Name$ = Input("Dein Name:>")
Cls
Color 0,255,0
WriteByte(Stream,Client_Joined)
WriteString(Stream,Name$)
WriteString(Stream,MyDottedIP$)
Include ".\include\gameworld.bb"
CreateMyPlayer(Name$)

Repeat

UpdateNetwork()

KeyControl()

UpdateCam()

RenderWorld()
UpdateWorld()

Flip
WaitTimer(FrameTimer)
Until KeyHit(1)

FlushKeys()
Color 0,255,0
Print "Du verlässt jetzt Teraxia. Wir hoffen es hat dir Spass gemacht und sehen dich bald wieder!"
Color 255,255,255
Print "Bitte drücke jetzt eine beliebige Taste, um zu Windows zurückzukehren..."
WaitKey()
WriteByte(Stream,Client_Left)
WriteString(Stream,Name$)
CloseTCPStream Stream
End

Else

Color 255,0,0
Print "Die Game Server von Teraxia sind momentan nicht online. Wir bitten um Verständnis."
Color 255,255,255
Print "Bitte drücke jetzt eine beliebige Taste, um zu Windows zurückzukehren..."
WaitKey()
End

End If

Type Player

Field Name$
Field Mesh
Field X
Field Y
Field Z
Field Yaw

End Type

Function UpdateNetwork()

If ReadAvail(Stream) Then

Select ReadByte(Stream)

Case Client_Joined

ClientName$ = ReadString(Stream)
CreatePlayer(ClientName$)

Case Client_Left

ClientName$ = ReadString(Stream)


Case Client_Coords

ClientName$ = ReadString(Stream)
Client_X# = ReadFloat(Stream)
Client_Y# = ReadFloat(Stream)
Client_Z# = ReadFloat(Stream)
Client_Yaw# = ReadFloat(Stream)
FindPlayer.Player(ClientName$)


Case Client_Msg



End Select

End If

End Function

Function CreateMyPlayer(P_Name$)

mp.Player = New Player
mp\Name$ = P_Name$
mp\Mesh = CreateCube()
mp\X = 0
mp\Y = 0
mp\Z = 0

End Function

Function CreatePlayer(P_Name$)

p.Player = New Player
p\Name$ = P_Name$
p\Mesh = CreateCube()
p\X = 0
p\Y = 0
p\Z = 0

End Function

Function FindPlayer.Player(P_Name$)

Local p.Player

If p\Name$ = P_Name$ Then

Print "Hallo"

End If

End Function

Function UpdateCam()

For mp.Player = Each Player

EntityParent MainCam,mp\Mesh

Next

End Function

Function KeyControl()

For mp.Player= Each Player

If KeyDown(17) Then

MoveEntity mp\Mesh,0,0,0.1
WriteByte(Stream,Client_Coords)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityX(mp\Mesh))
WriteFloat(Stream,EntityY(mp\Mesh))
WriteFloat(Stream,EntityZ(mp\Mesh))

End If

If KeyDown(31) Then

MoveEntity mp\Mesh,0,0,-0.1
WriteByte(Stream,Client_Coords)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityX(mp\Mesh))
WriteFloat(Stream,EntityY(mp\Mesh))
WriteFloat(Stream,EntityZ(mp\Mesh))

End If

If KeyDown(32) Then

TurnEntity mp\Mesh,0,-3,0
WriteByte(Stream,Client_Yaw)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityYaw(mp\Mesh))

End If

If KeyDown(30) Then

TurnEntity mp\Mesh,0,3,0
WriteByte(Stream,Client_Yaw)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityYaw(mp\Mesh))

End If
Next

End Function

Function DeleteMyPlayer()



End Function

Function DeletePlayer(P_Name$)



End Function


ZUerst starte ich den server -> alles normal. Dann ein Client. Alles normal. Bis ich einen 2.ten Client starte, dann kommen ganz viele komische zeichen in der console. kann mir jemand sagen warum?
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMo, Okt 10, 2011 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Was soll "Andere" hier sein? Wenn du da kein gültiges Objekt rein füllst ist NULL <> C\Stream immer Wahr.
BlitzBasic: [AUSKLAPPEN]
Case Client_Coords
;[...]
If Andere\Stream <> C\Stream

Du benutzt keine Datentypen in deinen Types... Da kann nichts richtiges bei 'rum kommen. Schreib am besten immer explizit % für Integer anstatt es überall weg zu lassen. Alle Variablen Deklarieren und IDEal auf Strict umschalten, damit nicht deklariertes rot markiert wird.
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)

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 10, 2011 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieses Andere hat Midimaster mir gegeben. Mit was soll ich das denn in diesem Falle füllen, was Midimaster da wollte, habe ich auch nicht gecheckt. Eigentlich brauche ich ja nur 2 Objekte im Client.

Also ich blick echt langsam nichts mehr !!! Rolling Eyes

Meine Güte xD
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragMo, Okt 10, 2011 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
oje... du bist ganz schön durcheinander grad, oder?

ich versuch mal was zu sortieren in deinem kopf:

Du musst zwei Dinge auseinanderhalten:

Nachrichten über andere Spieler kommen immer in dem Stream rein. Um Sie irgendwelchen PLAYER-Objekten zuzuordnen, muss der Server neben den Koordinaten auch den Namen des Players mitsenden.

Erhält der Client eine Nachricht, dann geht er alle seine PLAYER-Objekte durch und vergleicht den Namen. Hat er das zutreffende PLAYER-Objekt gefunden, werden bei dem nun die Koordinaten gesetzt.

BlitzBasic: [AUSKLAPPEN]
	Case Client_Coords

ClientName$ = ReadString(Stream)
Client_X# = ReadFloat(Stream)
Client_Y# = ReadFloat(Stream)
Client_Z# = ReadFloat(Stream)
Client_Yaw# = ReadFloat(Stream)
; hier beginnt die suche nach dem zutreffenden Player:
For p.Player = Each Player
If p\Name = ClientName Then
P\X = Client_X
P\Y = Client_Y
.....
EndIf
Next
....



Das mit dem Andere hast Du fast richtig gemacht! Xeres fragt auch nicht grundsätzlich , warum Du das verwendest, sonder er hat entdeckt, dass Du es einmal falsch verwendest. Du kannst die Zeile
BlitzBasic: [AUSKLAPPEN]
If Andere\Stream <> C\Stream


..natürlich nur im Zusammenhang mit der FOR/NEXT-Schleife verwenden! Schau dir mal an, was Du beim Server bei Case Client_Coords vergessen hast....

Ich dachte wirklich Du hattest das schon gecheckt? Das Andere verwenden wir doch immer um eine Nachricht an alle anderen zuzusenden außer an sich selbst:

BlitzBasic: [AUSKLAPPEN]
	For Andere.Client = Each Client
If Andere\Stream <> C\Stream
WriteByte....
End If
Next
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 10, 2011 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Okey, danke das bringt wieder etwas licht an die sache, ich probier das ganze mal. Wenns funzt übernehm ich´s direkt ma in mein langzeitgedächtniss xD

Danke

Edit: Ja das hab ich jetzt gemacht, aber als ich 2 Clients gestartet hab, ist erstmal bei beiden von keinem 2 Cubes, und dann beim 2.Client nach ein paar sekunden, kann ich für 2-3 sekunden beide cubes aufeinmal bewegen... und dann wieder diese hässliche fehler meldung.

Mein Code bis jetzt:

Server:

BlitzBasic: [AUSKLAPPEN]

AppTitle "Teraxia - Game Server"
Graphics 800,320,32,2

Local Frametimer = CreateTimer(60)

Const Client_Joined = 1
Const Client_Left = 2
Const Client_Coords = 3
Const Client_Msg = 4

Global ServerStream,ClientName$,Client_X#,Client_Y#,Client_Z#,Client_Yaw#,ClientIP$,Message$,Port% = 8000
Global Server = CreateTCPServer(Port%)

If Server <> 0 Then

Color 0,255,0
AppTitle "Teraxia - Game Server | Gestartet!"
Print "Der Server wurde gestartet auf Port: " + Port%
Color 255,255,255

Else

Color 255,0,0
Print "Der Server konnte nicht gestartet werden!"
Color 255,255,255
WaitKey()
End

End If


Repeat

UpdateNetwork()

WaitTimer(Frametimer)
Until KeyHit(1)

Color 255,0,0
AppTitle "Teraxia - Game Server | Wird heruntergefahren..."
Print "Der Server wird heruntergefahren..."
Color 255,255,255
Delay 2000

For C.Client=Each Client

CloseTCPStream(C\Stream)

Next

CloseTCPServer Server
End

End

Function UpdateNetwork()

ServerStream = AcceptTCPStream(Server)

If ServerStream Then

C.Client = New Client
C\Stream = ServerStream

End If

For C.Client = Each Client

If ReadAvail(C\Stream) Then
Select ReadByte(C\Stream)

Case Client_Joined

ClientName$ = ReadString(C\Stream) ;Name auslesen.

For Andere.Client = Each Client

If Andere\Stream <> C\Stream
WriteByte(Andere\Stream , Client_Joined)
WriteString(Andere\Stream , ClientName$)
End If

Next

Color 0,255,0
Print "[System]:> " + ClientName$ + " hat das Spiel betreten."


Case Client_Left

ClientName$ = ReadString(C\Stream)

For Andere.Client = Each Client

If Andere\Stream <> C\Stream
WriteByte(Andere\Stream, Client_Left)
WriteString(Andere\Stream, ClientName$)
End If

Next

Color 0,255,0
Print "[System]:> " + ClientName$ + " hat das Spiel verlassen."

Case Client_Coords

ClientName$ = ReadString(C\Stream)
Client_X# = ReadFloat(C\Stream)
Client_Y# = ReadFloat(C\Stream)
Client_Z# = ReadFloat(C\Stream)
Client_Yaw# = ReadFloat(C\Stream)

If Andere\Stream <> C\Stream

WriteByte(Andere\Stream, Client_Coords)
WriteString(Andere\Stream, ClientName$)
WriteFloat(Andere\Stream, Client_X#)
WriteFloat(Andere\Stream, Client_Y#)
WriteFloat(Andere\Stream, Client_Z#)
WriteFloat(Andere\Stream, Client_Yaw#)

End If

Case Client_Msg



End Select
End If

Next

End Function

Type Client

Field Name
Field Stream
Field X
Field Y
Field Z
Field Yaw

End Type


Client:

BlitzBasic: [AUSKLAPPEN]

AppTitle "Teraxia - Ein neues Abenteuer"
Include ".\include\InitClient.bb"
Graphics3D ScreenWidth,ScreenHeight,32,ScreenMode
SetBuffer BackBuffer()

Local FrameTimer = CreateTimer(60)

Const Client_Joined = 1
Const Client_Left = 2
Const Client_Coords = 3
Const Client_Msg = 4

Global ClientName$,Client_X#,Client_Y#,Client_Z#,Client_Yaw#,MyUnDottedIP,MyDottedIP$
Global IP$ = "127.0.0.1",Port% = 8000,Name$
Global Stream = OpenTCPStream(IP$,Port%)

Global MainCam = CreateCamera()
PositionEntity MainCam,0,3,-5

If Stream <> 0 Then
MyUnDottedIP = TCPStreamIP(Stream)
MyDottedIP$ = DottedIP$(MyUnDottedIP)
Name$ = Input("Dein Name:>")
Cls
Color 0,255,0
WriteByte(Stream,Client_Joined)
WriteString(Stream,Name$)
WriteString(Stream,MyDottedIP$)
Include ".\include\gameworld.bb"
CreateMyPlayer(Name$)

Repeat

UpdateNetwork()

KeyControl()

UpdateCam()

RenderWorld()
UpdateWorld()

Flip
WaitTimer(FrameTimer)
Until KeyHit(1)

FlushKeys()
Color 0,255,0
Print "Du verlässt jetzt Teraxia. Wir hoffen es hat dir Spass gemacht und sehen dich bald wieder!"
Color 255,255,255
Print "Bitte drücke jetzt eine beliebige Taste, um zu Windows zurückzukehren..."
WaitKey()
WriteByte(Stream,Client_Left)
WriteString(Stream,Name$)
CloseTCPStream Stream
End

Else

Color 255,0,0
Print "Die Game Server von Teraxia sind momentan nicht online. Wir bitten um Verständnis."
Color 255,255,255
Print "Bitte drücke jetzt eine beliebige Taste, um zu Windows zurückzukehren..."
WaitKey()
End

End If

Type Player

Field Name$
Field Mesh
Field X
Field Y
Field Z
Field Yaw

End Type

Function UpdateNetwork()

If ReadAvail(Stream) Then

Select ReadByte(Stream)

Case Client_Joined

ClientName$ = ReadString(Stream)
CreatePlayer(ClientName$)

Case Client_Left

ClientName$ = ReadString(Stream)


Case Client_Coords

ClientName$ = ReadString(Stream)
Client_X# = ReadFloat(Stream)
Client_Y# = ReadFloat(Stream)
Client_Z# = ReadFloat(Stream)
Client_Yaw# = ReadFloat(Stream)

For p.Player = Each Player
If p\Name = ClientName$ Then
p\X = Client_X#
p\Y = Client_Y#
p\Z = Client_Z#
p\Yaw = Client_Yaw#

PositionEntity p\Mesh,p\X#,p\Y#,p\Z#
RotateEntity p\Mesh,EntityPitch(p\Mesh),p\Yaw#,EntityRoll(p\Mesh)

EndIf
Next

Case Client_Msg



End Select

End If

End Function

Function CreateMyPlayer(P_Name$)

mp.Player = New Player
mp\Name$ = P_Name$
mp\Mesh = CreateCube()
mp\X = 0
mp\Y = 0
mp\Z = 0

End Function

Function CreatePlayer(P_Name$)

p.Player = New Player
p\Name$ = P_Name$
p\Mesh = CreateCube()
p\X = 0
p\Y = 0
p\Z = 0

End Function

Function UpdateCam()

For mp.Player = Each Player

EntityParent MainCam,mp\Mesh

Next

End Function

Function KeyControl()

For mp.Player= Each Player

If KeyDown(17) Then

MoveEntity mp\Mesh,0,0,0.1
WriteByte(Stream,Client_Coords)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityX(mp\Mesh))
WriteFloat(Stream,EntityY(mp\Mesh))
WriteFloat(Stream,EntityZ(mp\Mesh))

End If

If KeyDown(31) Then

MoveEntity mp\Mesh,0,0,-0.1
WriteByte(Stream,Client_Coords)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityX(mp\Mesh))
WriteFloat(Stream,EntityY(mp\Mesh))
WriteFloat(Stream,EntityZ(mp\Mesh))

End If

If KeyDown(32) Then

TurnEntity mp\Mesh,0,-3,0
WriteByte(Stream,Client_Yaw)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityYaw(mp\Mesh))

End If

If KeyDown(30) Then

TurnEntity mp\Mesh,0,3,0
WriteByte(Stream,Client_Yaw)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityYaw(mp\Mesh))

End If
Next

End Function

Function DeleteMyPlayer()



End Function

Function DeletePlayer(P_Name$)



End Function
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragMo, Okt 10, 2011 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ist ein Denkfehler in deiner Anmelde-Prozedur:

Zunächst ist alle Supi!!!

Du meldest den ersten Client an. Bravo. Nun kennt der Server den 1.Client. Und der 1.Client kennt sich selber, logo! Wenn du jetzt mit dem EGO-PLAYER herumfährst, sendet der Client die Daten zum Server, der sie gern an andere weiterleiten würden, aber da sind ja noch keine anderen! Alles Bravo!

Jetzt meldest Du den 2.Client an. Nun kennt der Server 2 Clienten. Und der 2.Client kennt sich selber (EGO-PLAYER), logo! Jetzt meldet der Server dem 1. Client einen neuen Mitspieler. Der 1.Client legt daraufhin ein erstes EXTERN-PLAYER-Objekt an, um zukünftig einen 2.Cube zu bewegen, wenn vom Server Meldungen kommen.

Wenn du jetzt auf dem 2. Client mit dem dortigen EGO_PLAYER herumfährst, sendet dessen Client die Daten zum Server, der sie gern an den anderen (dem 1.Client) weiterleitet. Dort wird der EXTERN-PLAYER\Cube bewegt. Alles Bravo!


Jetzt kommts:

Wenn du jetzt auf dem 1.Client mit dem dortigen EGO-Player herumfährst, sendet dessen Client die Daten zum Server, der sie gern an den anderen (dem 2.) weiterleitet. Dort soll der Client das EXTERN-PLAYER\Cube bewegen. Aber dort wurde nie ein EXTERN-PLAYER-Objekt angelegt!!! Absturz!!!


Fazit


Dein Denk-Fehler war:

meldet sich ein neuer Client an, muss er vom Server über alle bereits vorhandenen anderen Clients informiert werden. Erst so legt der neue Client für all die "alten Hasen" jeweil ein EXTERN-PLAYER-Objekt an. Kommen dann Bewegungsmeldungen von anderen, weiß der neue Client bereits etwas damit anzufangen.


Wow! Die Erklärungen werden immer komplizierter, die Sätze immer länger. Ich hoffe, du konntest folgen?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

GearTechDE

ehemals 'KillerJo96'

BeitragDi, Okt 11, 2011 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
ja bin soweit mitgekommen. Damit der Server eine Liste aller Clients hat, lege ich dafür am besten ein Array an oder? Oder ist ein Type auch gleichzeitig so was wie eine Liste? Die Liste kann ich ja dann im Client_Joined sofort senden.

Hmm, schwierig schwierig.
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragDi, Okt 11, 2011 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Unter BB ist das nicht nötig. Eigene TYPEN werden immer in einer autom. angelegten Liste verwaltet und du verwendest das auch schon: Deshalb kannst du ja auch immer mit einer FOR EACH/NEXT-Schleife alle Objekte auflisten:

BlitzBasic: [AUSKLAPPEN]
Type TestTyp
Field Nr% , Wert%
End Type

For i%=1 To 5
loc.TestTyp = New TestTyp
loc\Nr = i
loc\Wert = i*i
Next

lump.TestTyp = New TestTyp
lump\Nr = 101
lump\Wert = 1234

looser.TestTyp = New TestTyp
looser\Nr = 102
looser\Wert = 5432


For back.TestTyp = Each TestTyp
Print back\Nr + " " + back\Wert
Next


Das grasse ist, das die "Namen" keine Rolle spielen! Das siehst Du in dem Beispiel. Dort werden 7 Objekte angelegt und beim Erstellen heißen sie im Prinzip einige loc und andere looser oder lump und trotzdem werden sie niicht verwechselt.

Und beim Printen findet man sie plötzlich alle wieder unter back und es handelt sich wieder um die 7 erstellten Objekte
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

GearTechDE

ehemals 'KillerJo96'

BeitragDi, Okt 11, 2011 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
also muss ich jetzt einfach in Client_Joined:

BlitzBasic: [AUSKLAPPEN]

For C.Client = Each Client

WriteString(C\Client,C\Stream)

Next


oder?

Edit: ne das ist falsch ist mir gerade aufgefallen.

Könntest du vielleicht beispiele zum thema machen das wäre glaub ich verständnisvoller ^^
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragDi, Okt 11, 2011 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
naja,... eigentlich sollst du sich ja auch mal gedanklich anstrengen es zu verstehen und umzusetzen... (sog. "Transferleistung") Wink

Aber im Prinzip hast Recht... gleich beim Joinen sendest du dem neuen Client ein ganzes Paket aus Daten. Erst eine Runde mit Join-Meldungen der anderen, dann eine Runde mit Koordinaten der anderen.

Schreib mal einen Versuch, wie das aussehen könnte, dann sag ich was dazu!

Im Prinzip hast du sowas ja schon genau in der Join-Abteilung auf dem Server stehen. Hier jedoch sendest Du allen die Nachricht über den einen neuen:

BlitzBasic: [AUSKLAPPEN]
For Andere.Client = Each Client
If Andere\Stream <> C\Stream
WriteByte(Andere\Stream , Client_Joined)
WriteString(Andere\Stream , ClientName$)
End If

Next


und jetzt folgt anschließend eine Nachricht an den Stream des einen mit den Namen der anderen.

Wie heißt der Stream des einen? C\Stream!

Wie heißen die Namen der anderen? Andere\Namen!

Krieg das erst mal hin und meld dich wieder. Das mit den Koordinaten wird dann genauso sein!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

GearTechDE

ehemals 'KillerJo96'

BeitragDi, Okt 11, 2011 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Okey, das ist ja jetzt wie ein Test ^^ Ich probiers mal ^^

Also... Wenn ich eine Nachricht an andere schreiben will, muss ich:

BlitzBasic: [AUSKLAPPEN]

For Andere.Client = Each Client

WriteByte(Andere\Stream,...)
WriteString(Andere\Stream,....)

Next


Und wenn ich mich selbst raus nehmen will, sieht das ganze so aus:

BlitzBasic: [AUSKLAPPEN]

For Andere.Client = Each Client

If Andere\Stream <> C\Stream Then

WriteByte(Andere\Stream,...)
WriteString(Andere\Stream,....)

End If

Next


So dann müsste es doch eigentlich so aussehen, wenn ich nur eine Nachricht an mich schicken will und an keinen andren:

BlitzBasic: [AUSKLAPPEN]

For C.Client = Each Client

WriteString(C\Stream,...) ;Was ich hier versenden soll fehlt mir, das versteh ich nich, das wäre ja die liste.

Next


Ich weiß nich ob´s stimmt aber ich probiers mal.

Danke für den Hinweis Wink

Edit: Aber wie kann ich denn jetzt die Liste verschicken. Was brauch ich dafür? Das hab ich nicht ganz verstanden.
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragDi, Okt 11, 2011 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
du verschickst nicht "die Liste" (was meinst du damit?), sondern die Namen-Eigenschaft der Objekte:

BlitzBasic: [AUSKLAPPEN]
For Andere.Client = Each Client
If Andere\Stream <> C\Stream
WriteByte(C\Stream , Client_Joined)
WriteString(C\Stream , Andere\Name)
End If
Next


Du sendest quasi dem neuen Clienten die "verspätete Anmeldung" der vorherigen Clienten.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

GearTechDE

ehemals 'KillerJo96'

BeitragDi, Okt 11, 2011 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Achsoo...

Ich habe ja das Type mit den Eigenschaften Name,Stream,X,Y,Z,Yaw...

Aber die kriegen keinen Wert zugewiesen außer Stream, dann muss ich Bei Client_Coords denen die Koordinaten zusenden oder?

Ok das probier ich mal.

Oh man das braucht wirklich noch Übung Rolling Eyes

Edit: So ich blick langsam echt nichts mehr. Das mit den hässlichen Byte Zeichen im Server ist immer noch nicht weg.

Ich poste hier nochmal meinen jetzigen Code:

Server:

BlitzBasic: [AUSKLAPPEN]

AppTitle "Teraxia - Game Server"
Graphics 800,320,32,2

Local Frametimer = CreateTimer(60)

Const Client_Joined = 1
Const Client_Left = 2
Const Client_Coords = 3
Const Client_Msg = 4

Global ServerStream,ClientName$,Client_X#,Client_Y#,Client_Z#,Client_Yaw#,ClientIP$,Message$,Port% = 8000
Global Server = CreateTCPServer(Port%)

If Server <> 0 Then

Color 0,255,0
AppTitle "Teraxia - Game Server | Gestartet!"
Print "Der Server wurde gestartet auf Port: " + Port%
Color 255,255,255

Else

Color 255,0,0
Print "Der Server konnte nicht gestartet werden!"
Color 255,255,255
WaitKey()
End

End If


Repeat

UpdateNetwork()

WaitTimer(Frametimer)
Until KeyHit(1)

Color 255,0,0
AppTitle "Teraxia - Game Server | Wird heruntergefahren..."
Print "Der Server wird heruntergefahren..."
Color 255,255,255
Delay 2000

For C.Client=Each Client

CloseTCPStream(C\Stream)

Next

CloseTCPServer Server
End

End

Function UpdateNetwork()

ServerStream = AcceptTCPStream(Server)

If ServerStream Then

C.Client = New Client
C\Stream = ServerStream

End If

For C.Client = Each Client

If ReadAvail(C\Stream) Then
Select ReadByte(C\Stream)

Case Client_Joined

ClientName$ = ReadString(C\Stream) ;Name auslesen.

For Andere.Client = Each Client

If Andere\Stream <> C\Stream
WriteByte(Andere\Stream , Client_Joined)
WriteString(Andere\Stream , ClientName$)
End If

Next

For Andere.Client = Each Client

If Andere\Stream <> C\Stream Then

WriteString(C\Stream,ClientName$)
WriteFloat(C\Stream,C\X)
WriteFloat(C\Stream,C\Y)
WriteFloat(C\Stream,C\Z)
WriteFloat(C\Stream,C\Yaw)

End If

Next

Color 0,255,0
Print "[System]:> " + ClientName$ + " hat das Spiel betreten."


Case Client_Left

ClientName$ = ReadString(C\Stream)

For Andere.Client = Each Client

If Andere\Stream <> C\Stream
WriteByte(Andere\Stream, Client_Left)
WriteString(Andere\Stream, ClientName$)
End If

Next

Color 0,255,0
Print "[System]:> " + ClientName$ + " hat das Spiel verlassen."

Case Client_Coords

ClientName$ = ReadString(C\Stream)
Client_X# = ReadFloat(C\Stream)
Client_Y# = ReadFloat(C\Stream)
Client_Z# = ReadFloat(C\Stream)
Client_Yaw# = ReadFloat(C\Stream)

For Andere.Client = Each Client

C\Name = ClientName$
C\X = Client_X#
C\Y = Client_Y#
C\Z = Client_Z#
C\Yaw = Client_Yaw#

Next

If Andere\Stream <> C\Stream

WriteByte(Andere\Stream, Client_Coords)
WriteString(Andere\Stream, ClientName$)
WriteFloat(Andere\Stream, Client_X#)
WriteFloat(Andere\Stream, Client_Y#)
WriteFloat(Andere\Stream, Client_Z#)
WriteFloat(Andere\Stream, Client_Yaw#)

End If

Case Client_Msg



End Select
End If

Next

End Function

Type Client

Field Name
Field Stream
Field X
Field Y
Field Z
Field Yaw

End Type


Client:
BlitzBasic: [AUSKLAPPEN]

AppTitle "Teraxia - Ein neues Abenteuer"
Include ".\include\InitClient.bb"
Graphics3D ScreenWidth,ScreenHeight,32,ScreenMode
SetBuffer BackBuffer()

Local FrameTimer = CreateTimer(60)

Const Client_Joined = 1
Const Client_Left = 2
Const Client_Coords = 3
Const Client_Msg = 4

Global ClientName$,Client_X#,Client_Y#,Client_Z#,Client_Yaw#,MyUnDottedIP,MyDottedIP$
Global IP$ = "127.0.0.1",Port% = 8000,Name$
Global Stream = OpenTCPStream(IP$,Port%)

Global MainCam = CreateCamera()
PositionEntity MainCam,0,3,-5

If Stream <> 0 Then
MyUnDottedIP = TCPStreamIP(Stream)
MyDottedIP$ = DottedIP$(MyUnDottedIP)
Name$ = Input("Dein Name:>")
Cls
Color 0,255,0
WriteByte(Stream,Client_Joined)
WriteString(Stream,Name$)
WriteString(Stream,MyDottedIP$)
Include ".\include\gameworld.bb"
CreateMyPlayer(Name$)

Repeat

UpdateNetwork()

KeyControl()

UpdateCam()

RenderWorld()
UpdateWorld()

Flip
WaitTimer(FrameTimer)
Until KeyHit(1)

FlushKeys()
Color 0,255,0
Print "Du verlässt jetzt Teraxia. Wir hoffen es hat dir Spass gemacht und sehen dich bald wieder!"
Color 255,255,255
Print "Bitte drücke jetzt eine beliebige Taste, um zu Windows zurückzukehren..."
WaitKey()
DeleteMyPlayer()
CloseTCPStream Stream
End

Else

Color 255,0,0
Print "Die Game Server von Teraxia sind momentan nicht online. Wir bitten um Verständnis."
Color 255,255,255
Print "Bitte drücke jetzt eine beliebige Taste, um zu Windows zurückzukehren..."
WaitKey()
End

End If

Type Player

Field Name$
Field Mesh
Field X
Field Y
Field Z
Field Yaw

End Type

Function UpdateNetwork()

If ReadAvail(Stream) Then

Select ReadByte(Stream)

Case Client_Joined

ClientName$ = ReadString(Stream)

For p.Player = Each Player

p\Name = ClientName$
p\X = ReadFloat(Stream)
p\Y = ReadFloat(Stream)
p\Z = ReadFloat(Stream)
p\Yaw = ReadFloat(Stream)

Next
CreatePlayer(ClientName$)

Case Client_Left

ClientName$ = ReadString(Stream)


Case Client_Coords

ClientName$ = ReadString(Stream)
Client_X# = ReadFloat(Stream)
Client_Y# = ReadFloat(Stream)
Client_Z# = ReadFloat(Stream)
Client_Yaw# = ReadFloat(Stream)

For p.Player = Each Player
If p\Name = ClientName$ Then
p\X = Client_X#
p\Y = Client_Y#
p\Z = Client_Z#
p\Yaw = Client_Yaw#

PositionEntity p\Mesh,p\X#,p\Y#,p\Z#
RotateEntity p\Mesh,EntityPitch(p\Mesh),p\Yaw#,EntityRoll(p\Mesh)

EndIf
Next

Case Client_Msg



End Select

End If

End Function

Function CreateMyPlayer(P_Name$)

mp.Player = New Player
mp\Name$ = P_Name$
mp\Mesh = CreateCube()
mp\X = 0
mp\Y = 0
mp\Z = 0

End Function

Function CreatePlayer(P_Name$)

p.Player = New Player
p\Name$ = P_Name$
p\Mesh = CreateCube()
p\X = 0
p\Y = 0
p\Z = 0

End Function

Function UpdateCam()

For mp.Player = Each Player

EntityParent MainCam,mp\Mesh

Next

End Function

Function KeyControl()

For mp.Player= Each Player

If KeyDown(17) Then

MoveEntity mp\Mesh,0,0,0.1
WriteByte(Stream,Client_Coords)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityX(mp\Mesh))
WriteFloat(Stream,EntityY(mp\Mesh))
WriteFloat(Stream,EntityZ(mp\Mesh))

End If

If KeyDown(31) Then

MoveEntity mp\Mesh,0,0,-0.1
WriteByte(Stream,Client_Coords)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityX(mp\Mesh))
WriteFloat(Stream,EntityY(mp\Mesh))
WriteFloat(Stream,EntityZ(mp\Mesh))

End If

If KeyDown(32) Then

TurnEntity mp\Mesh,0,-3,0
WriteByte(Stream,Client_Yaw)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityYaw(mp\Mesh))

End If

If KeyDown(30) Then

TurnEntity mp\Mesh,0,3,0
WriteByte(Stream,Client_Yaw)
WriteString(Stream,Name$)
WriteFloat(Stream,EntityYaw(mp\Mesh))

End If
Next

End Function

Function DeleteMyPlayer()

For mp.Player = Each Player

WriteByte(Stream,Client_Left)
WriteString(Stream,Name$)
FreeEntity mp\Mesh
Delete mp.Player

Next

End Function

Function DeletePlayer(P_Name$)



End Function


Also langsam... boah echt.. ^^ xD das kostet wirklich kraft ^^
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragDi, Okt 11, 2011 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
aha, ich seh schon...

du merkst dir im Server gar nicht die Namen der Clients, die sich anmelden. Hole das nach!

im Server:
BlitzBasic: [AUSKLAPPEN]
Select ReadByte(C\Stream)
Case Client_Joined
ClientName$ = ReadString(C\Stream) ;Name auslesen.
C\Name = ClientName


und das selbe auch dort, wo die Koordinaten reinkommen.



Und ich habe gleich noch einen Fehler entdeckt:

Du hast dir ja ausgedacht, dass jede Kommunikation mit einem anderen Teilnehmer immer mit einem Byte beginnt, dass die Aktion beschreibt. Das hast Du bei dem neuen Code nicht durchgehalten. Hier beginnt die Kommunikation plötzlich mit einem WriteString()
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group