Wird das so was?-UDP Multiplayer [NOCHMAL EIN NEUES PROBLEM]

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

mas93

Betreff: Wird das so was?-UDP Multiplayer [NOCHMAL EIN NEUES PROBLEM]

BeitragDo, Jun 07, 2007 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Ich habe vor den Ferien an einem Multiplayer 2d spiel geproggt.

Wenn man es zu 2. gespielt hat hat alles funktioniert.
Nur ist das langweilig.

Also dachte ich mir bau doch was ein das mehr als 2 spieler zoggen können.
Ich hab also angefangen und hab auch schon so einige funkctions geschrieben und möchte jetzt weitermachen.

Nur bin ich mir nicht sicher ob ich bis jetzt alles richtig gemacht habe, oder alles kompletter schwachsinn war, was ich gecodet habe.

Wäre nett wenn ihr euch die beiden code mal anschen würdet.
Sie sind wie gesagt noch nicht fertig, aber ich wollte mal wissen ob es schon schwerwiegende fehler gibt.

Client:

Code: [AUSKLAPPEN]

Graphics 640,480,16,2
;setbuffer initialisieren
SetBuffer BackBuffer()


;UDP PORTS



Global Port = 8888
Global sendport=8000
Global empfport = CreateUDPStream(Port)


Type player
 Field ppx;X-Position des Charackters
 Field ppy;Y-Position des Charackters
 Field py;Kollisions X-Position des Charackters
 Field px ;Kollisions Y-Position des Charackters
 Field life
 Field typ
 Field lebenminus
End Type

Type gegner
 Field x
 Field y
 Field life
 Field typ
 Field lebenminus
 Field IP$
End Type

Type schuss
 Field x
 Field y
 Field winkel
 Field speed
End Type
 
Global scrolly     ;Die Variable für die ScrollY-Position
Global scrollx     ;Die Variable für die ScrollX-Position
Global mx
Global my
Global mail$

;bilder laden
Global spieler    = LoadImage("Tiles/char.bmp")
Global Tileset = LoadAnimImage("Tiles/tileset.bmp",32,32,0,9)
Global gegnerpic=LoadImage("Tiles/gegner.png")
Global maus=LoadImage("Tiles/maus.png")
 MaskImage maus,255,0,255
Global pfeilpic=LoadImage("Tiles/pfeil.png")
 MaskImage pfeilpic,255,0,255
 MidHandle pfeilpic


Dim pfeil(360)

For i = 0 To 360
  pfeil(i) = CopyImage(pfeilpic)
RotateImage pfeil(i),i
Next

;die map-array
Dim map(20,20)
;die Karte
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,1
Data 1,5,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,4,1
Data 1,5,0,0,7,0,0,0,0,0,0,8,8,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,8,8,0,0,0,0,0,0,0,0,8,8,0,0,0,4,1
Data 1,5,0,0,8,8,0,0,0,0,0,7,0,0,8,8,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
;einlesen und die zahlen der Tiles in der array speichern
For y = 0 To 20
For x = 0 To 20
;einlesen der werte aus der data map in die array
Read map(x,y)
Next
Next



p.player=New player
p\ppx=10*32
p\ppy=7*32
p\py=7
p\px=10
p\life=100


;AUF EINLADUNG WARTEN

RecvInvite()



;____------------__________----------_______________---------___________-_------_________---------_________---_-------
;---------------------------------------------start der hauptschleife-------------------------------------------------
;_______--------____________------------_____________-------------____________----------_________---------__________--
Repeat

mausdruck=MouseHit(1)

;unnütze graficreste löschen
Cls
;esc-taste zum beenden abfragen
If KeyDown(1) Then Exit
;die 20*20 tiles große map laden
For x = 0 To 20
For y = 0 To 20
;malt die karte an der positon x*32,y*32 und man kann die variablen scrollx und scrolly
;von außen manipulieren, um so scrolling zu erzeugen
DrawBlock tileset,x*32-scrollx,y*32-scrolly,map(x,y)
Next
Next


CheckNewPlayer()


mx=MouseX()
my=MouseY()



;------------------------------------------------------------------------------------------------
;---------------------------------------JEDEN PLAYER ABFRAGEN------------------------------------
;------------------------------------------------------------------------------------------------


For p.player=Each player

 DrawImage spieler,p\ppx-scrollx,p\ppy-scrolly

;_____________________Bewegungsrutinen für die einzelnen pfeil-tasten________________________________

;diese rutinen funcktionieren ganz einfach, solange aa größer 0 ist bleiben sie
;acktiv und es wird gescrollt
;pfeilrunter-taste
If move = 1 Then
;wenn der wert aa größer 0 ist wird fortgesetzt
If aa > 0
;solange der wert aa größer 0 ist wird um 2 pixel weiter gescrollt
scrolly = scrolly + 2
;die sichtbare figur wird bewegt
p\ppy = p\ppy + 2
;die variable xo wird solange aa > 0 ist erhöht
xo = xo + 1
;wenn xo den wert 16 erreicht hat wird aa wieder auf 0 gesetzt und der kollisionsparameter
;py wird verändert, danach wird xo wieder auf 0 gesetzt
If xo = 16 Then aa = 0:p\py = p\py + 1:xo = 0
End If
End If

;pfeilhoch-taste
If move = 2 Then
If aa > 0
scrolly = scrolly - 2
p\ppy = p\ppy - 2
xo = xo + 1
If xo = 16 Then aa = 0:p\py = p\py - 1:xo = 0
End If
End If
;pfeillinks-taste
If move = 3 Then
If aa > 0
scrollx = scrollx - 2
p\ppx = p\ppx - 2
xo = xo + 1
If xo = 16 Then aa = 0:p\px = p\px - 1:xo = 0
End If
End If
;pfeilrechts-taste
If move = 4 Then
If aa > 0
scrollx = scrollx + 2
p\ppx = p\ppx + 2
xo = xo + 1
If xo = 16 Then aa = 0:p\px = p\px + 1:xo = 0
End If
End If

;rechs-taste
If KeyDown(205) Then
;kollision checken, wie ihr es schon kennt
If map(p\px+1,p\py) < 6 Then
;der nächste tastatur-eingabe-impuls wird möglich sobald aa weniger als 1 wert ist
;das heißt in der zeit wo keine tastatur-eingabe erfolgen kann wird zur zeit gescrollt
If aa < 1 Then
;die scrollrutine move = 4 wird aufgerufen
move = 4
;aa nimmt den wert 1 an dadurch kann man erst wieder auf eine taste drücken, wenn
;aa < 1 wird
aa = 1
End If
End If
End If

;lings-taste
If KeyDown(203) Then
;kollision checken, wie ihr es schon kennt
If map(p\px-1,p\py) < 6 Then
If aa < 1 Then
move = 3
aa = 1
End If
End If
End If

;oben-taste
If KeyDown(200) Then
;kollision checken, wie ihr es schon kennt
If map(p\px,p\py-1) < 6 Then
If aa < 1 Then
move = 2
aa = 1
End If
End If
End If

;unten-taste
If KeyDown(208) Then
;kollision checken, wie ihr es schon kennt
If map(p\px,p\py+1) < 6 Then 
If aa < 1 Then
move = 1
aa = 1
End If
End If
End If

Text 0,0,p\ppy
Text 0,20,p\ppx


For g.gegner=Each gegner
;----------SCHLAG----------------
If ImagesCollide(spieler,p\ppx,p\ppy,0,gegnerpic,g\x,g\y,0) And mausdruck=1 Then g\lebenminus=lebenminus+1

;SACHEN SENDEN
WriteLine empfport, p\ppx
WriteLine empfport, p\ppy
WriteLine empfport, p\life
WriteLine empfport, g\lebenminus

SendUDPMsg empfport, IP(g\IP), sendport
g\lebenminus=0

Color 255,0,0
Text 30,30,g\IP

Text 70,70,IP(g\ip)

Next
Next










For p.player=Each player
;GEGNER ABFRAGEN
For g.gegner=Each gegner

;Nachricht empfangen
If RecvUDPMsg(empfport) Then
 g\x=ReadLine(empfport)
 g\y=ReadLine(empfport)
 g\life=ReadLine(empfport)
 p\lebenminus=ReadLine(empfport)
EndIf

p\life=p\life-p\lebenminus
p\lebenminus=0

DrawImage gegnerpic,g\x-scrollx,g\y-scrolly
Text 50,50,p\life

Next
Next





;Pfeile abfragen
For s.schuss=Each schuss
 wx=s\x-mx
 wy=s\y-my

s\Winkel=ATan2(wx,wy)

s\x = s\x + Sin(-s\winkel)*s\speed
      s\y = s\y + Cos(-s\winkel)*s\speed
      DrawImage pfeil(1),s\x,s\y
Text 200,200,s\winkel
Next


If MouseHit(1) Then

 s.schuss=New schuss
 s\speed=0.5

EndIf

DrawImage maus,mx,my





 












;flippen und zurück zum anfand der hauptschleife
Flip
Forever
;images wieder freigeben
FreeImage tileset
FreeImage spieler
;beenden
End

;------------------------------------

Function 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

;----------------------------------------
Function CheckNewPlayer()
If RecvUDPMsg(empfport) Then mail$=ReadLine(empfport)

npctest$=Mid$ (mail$, 1, 18) ;Die ersten 18 Buchstaben aus dem stream lesen

If npctest="NewPlayerConnected" Then
g.gegner=New gegner ;Neuen Gegner erstellen
 g\ip=Mid (mail$,Instr(mail$,":")+1) ;Und seine IP als float in g\ip speichern
 g\x=13
 g\y=13
 g\life=100
EndIf

End Function

;----------------------------------------

Function RecvInvite()

While Not invite$="Welcome"
 If RecvUDPMsg(empfport) Then invite$=ReadLine(empfport)
 If invite$="Welcome" Then WriteLine empfport,"Started"
 Text 20,20,"Waiting For Invation"
Wend

End Function


host:

Code: [AUSKLAPPEN]
Graphics 640,480,16,2
;setbuffer initialisieren
SetBuffer BackBuffer()


;UDP PORTS



Port = 8888
sendport=8000
empfport = CreateUDPStream(Port)


Type player
 Field ppx;X-Position des Charackters
 Field ppy;Y-Position des Charackters
 Field py;Kollisions X-Position des Charackters
 Field px ;Kollisions Y-Position des Charackters
 Field life
 Field typ
 Field lebenminus
End Type

Type gegner
 Field x
 Field y
 Field life
 Field typ
 Field lebenminus
 Field IP$
End Type

Type schuss
 Field x
 Field y
 Field winkel
 Field speed
End Type
 
Global scrolly     ;Die Variable für die ScrollY-Position
Global scrollx     ;Die Variable für die ScrollX-Position
Global mx
Global my
Global ip$

;bilder laden
Global spieler    = LoadImage("Tiles/char.bmp")
Global Tileset = LoadAnimImage("Tiles/tileset.bmp",32,32,0,9)
Global gegnerpic=LoadImage("Tiles/gegner.png")
Global maus=LoadImage("Tiles/maus.png")
 MaskImage maus,255,0,255
Global pfeilpic=LoadImage("Tiles/pfeil.png")
 MaskImage pfeilpic,255,0,255
 MidHandle pfeilpic


Dim pfeil(360)

For i = 0 To 360
  pfeil(i) = CopyImage(pfeilpic)
RotateImage pfeil(i),i
Next

;die map-array
Dim map(20,20)
;die Karte
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,1
Data 1,5,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,4,1
Data 1,5,0,0,7,0,0,0,0,0,0,8,8,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,8,8,0,0,0,0,0,0,0,0,8,8,0,0,0,4,1
Data 1,5,0,0,8,8,0,0,0,0,0,7,0,0,8,8,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1
Data 1,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
;einlesen und die zahlen der Tiles in der array speichern
For y = 0 To 20
For x = 0 To 20
;einlesen der werte aus der data map in die array
Read map(x,y)
Next
Next



p.player=New player
p\ppx=10*32
p\ppy=7*32
p\py=7
p\px=10
p\life=100



g.gegner=New gegner
g\x=13
g\y=13
g\life=100
g\IP=IP$

Global ipt$=Input("Ip des einzuladenden Spielers:  ")
Global newip=IP(ipt$)

invite()

;------------------------start der hauptschleife--------------------------------
Repeat

mausdruck=MouseHit(1)

;unnütze graficreste löschen
Cls
;esc-taste zum beenden abfragen
If KeyDown(1) Then Exit
;die 20*20 tiles große map laden
For x = 0 To 20
For y = 0 To 20
;malt die karte an der positon x*32,y*32 und man kann die variablen scrollx und scrolly
;von außen manipulieren, um so scrolling zu erzeugen
DrawBlock tileset,x*32-scrollx,y*32-scrolly,map(x,y)
Next
Next


mx=MouseX()
my=MouseY()



;------------------------------------------------------------------------------------------------
;---------------------------------------JEDEN PLAYER ABFRAGEN------------------------------------
;------------------------------------------------------------------------------------------------


For p.player=Each player

 DrawImage spieler,p\ppx-scrollx,p\ppy-scrolly

;_____________________Bewegungsrutinen für die einzelnen pfeil-tasten________________________________

;diese rutinen funcktionieren ganz einfach, solange aa größer 0 ist bleiben sie
;acktiv und es wird gescrollt
;pfeilrunter-taste
If move = 1 Then
;wenn der wert aa größer 0 ist wird fortgesetzt
If aa > 0
;solange der wert aa größer 0 ist wird um 2 pixel weiter gescrollt
scrolly = scrolly + 2
;die sichtbare figur wird bewegt
p\ppy = p\ppy + 2
;die variable xo wird solange aa > 0 ist erhöht
xo = xo + 1
;wenn xo den wert 16 erreicht hat wird aa wieder auf 0 gesetzt und der kollisionsparameter
;py wird verändert, danach wird xo wieder auf 0 gesetzt
If xo = 16 Then aa = 0:p\py = p\py + 1:xo = 0
End If
End If

;pfeilhoch-taste
If move = 2 Then
If aa > 0
scrolly = scrolly - 2
p\ppy = p\ppy - 2
xo = xo + 1
If xo = 16 Then aa = 0:p\py = p\py - 1:xo = 0
End If
End If
;pfeillinks-taste
If move = 3 Then
If aa > 0
scrollx = scrollx - 2
p\ppx = p\ppx - 2
xo = xo + 1
If xo = 16 Then aa = 0:p\px = p\px - 1:xo = 0
End If
End If
;pfeilrechts-taste
If move = 4 Then
If aa > 0
scrollx = scrollx + 2
p\ppx = p\ppx + 2
xo = xo + 1
If xo = 16 Then aa = 0:p\px = p\px + 1:xo = 0
End If
End If

;rechs-taste
If KeyDown(205) Then
;kollision checken, wie ihr es schon kennt
If map(p\px+1,p\py) < 6 Then
;der nächste tastatur-eingabe-impuls wird möglich sobald aa weniger als 1 wert ist
;das heißt in der zeit wo keine tastatur-eingabe erfolgen kann wird zur zeit gescrollt
If aa < 1 Then
;die scrollrutine move = 4 wird aufgerufen
move = 4
;aa nimmt den wert 1 an dadurch kann man erst wieder auf eine taste drücken, wenn
;aa < 1 wird
aa = 1
End If
End If
End If

;lings-taste
If KeyDown(203) Then
;kollision checken, wie ihr es schon kennt
If map(p\px-1,p\py) < 6 Then
If aa < 1 Then
move = 3
aa = 1
End If
End If
End If

;oben-taste
If KeyDown(200) Then
;kollision checken, wie ihr es schon kennt
If map(p\px,p\py-1) < 6 Then
If aa < 1 Then
move = 2
aa = 1
End If
End If
End If

;unten-taste
If KeyDown(208) Then
;kollision checken, wie ihr es schon kennt
If map(p\px,p\py+1) < 6 Then 
If aa < 1 Then
move = 1
aa = 1
End If
End If
End If

Text 0,0,p\ppy
Text 0,20,p\ppx


For g.gegner=Each gegner
;----------SCHLAG----------------
If ImagesCollide(spieler,p\ppx,p\ppy,0,gegnerpic,g\x,g\y,0) And mausdruck=1 Then g\lebenminus=lebenminus+1

;SACHEN SENDEN
WriteLine empfport, p\ppx
WriteLine empfport, p\ppy
WriteLine empfport, p\life
WriteLine empfport, g\lebenminus

SendUDPMsg empfport, IP(g\IP), sendport
g\lebenminus=0

Color 255,0,0
Text 30,30,g\IP

Text 70,70,IP(g\ip)

Next
Next










For p.player=Each player
;GEGNER ABFRAGEN
For g.gegner=Each gegner

;Nachricht empfangen
If RecvUDPMsg(empfport) Then
 g\x=ReadLine(empfport)
 g\y=ReadLine(empfport)
 g\life=ReadLine(empfport)
 p\lebenminus=ReadLine(empfport)
EndIf

p\life=p\life-p\lebenminus
p\lebenminus=0

DrawImage gegnerpic,g\x-scrollx,g\y-scrolly
Text 50,50,p\life

Next
Next





;Pfeile abfragen
For s.schuss=Each schuss
 wx=s\x-mx
 wy=s\y-my

s\Winkel=ATan2(wx,wy)

s\x = s\x + Sin(-s\winkel)*s\speed
      s\y = s\y + Cos(-s\winkel)*s\speed
      DrawImage pfeil(1),s\x,s\y
Text 200,200,s\winkel
Next


If MouseHit(1) Then

 s.schuss=New schuss
 s\speed=0.5

EndIf

DrawImage maus,mx,my













;flippen und zurück zum anfand der hauptschleife
Flip
Forever
;images wieder freigeben
FreeImage tileset
FreeImage spieler
;beenden
End

;-----------------------------------------------------------------------------------------------------
;_---------------------------------------------------------------------------------------------------_

Function 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
;-----------------------------------------

Function invite()



g.gegner=New gegner
g\x=13
g\y=13
g\life=100
g\IP=newip

WriteLine empfport,"NewPlayerConnected:"+IP(IP$)
;-----
Repeat

 WriteLine empfport,"Welcome"
 If RecvUDPMsg(empfport) Then msg$=ReadLine(empfport)
 count=count+1

Until msg$="Started" Or count=200

End Function


Ich habe jetzt beide einfach mal so reingetan.

Ich habe wirklich ewig an dem teil geproggt. Auch wenns vllt nich so aussieht, aber ich bin halt noch n anfänger.

mfg
Marius
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]
  • Zuletzt bearbeitet von mas93 am Sa, Jun 16, 2007 14:27, insgesamt 2-mal bearbeitet

Lunatix

BeitragDo, Jun 07, 2007 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
aha. Rechtschreibfehler.... unübersichtlich.... äh, ja kleine frage: wie wäre es, wenn du ein bisschen was dazu erzählst und nicht nurnach dem Motto "Hier ist der Code, guckt mal" ?

Schön und gut, das du wissen willst, ob du so richtig programmierst, aber nur die wenigsten haben die lust und die Zeit sich so einen ellenlangen code anzusehen. Wie wäre es, wenn du nur die sachen reinstellst, bei denen du dir unsicher bist? Und die unsicherheiten auch beschreibst? Wie wär es, wenn du dann postest, wenn es fehler gibt? Und solange es funktioniert, scheinst du doch alles richtig gemacht zu haben?



-> zur Rechstschreibung: Ich bin kein Fan von rechtschrebung, aber irgendwo hörts auf...
grafic -> wennschon Graphic oder Grafik
Funcktion -> sieht schon beim lesen scheisse aus >.<
Funkctions -> ja was denn nun?
rutine -> Routine
Acktiv -> wieder kein ck


Soweit meine Meinung Rolling Eyes
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

mas93

BeitragDo, Jun 07, 2007 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, sry wegen der rechtschreibung.
War in Eile.

Werde das auch noch ändern.

Hm der großteil der probleme is bei den Functions unten.


Ich weiß nicht ob ich das z.b wenn ein neuer connectet einfach in den stream schreiben darf, weil die anderen ja die playerpositionen aus dem stream lesen, nich das die da drauskommen.

mfg
Marius
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

garret

BeitragDo, Jun 07, 2007 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Da die beiden Codes untereinander nahezu gleich sind, könntest du sie auch zusammenfassen und von einer Bedingung (z.B. Hostmodus = True) abhängig machen, ob die Code-Abschnitte für den Host oder den Clienten ausgeführt werden.

Code: [AUSKLAPPEN]


;(Steuerung)

If Hostmodus = True
 ; Verarbeite und sende Daten aller Spieler
Else; Client
 ;  Daten fremder Spieler verarbeiten und eigene senden
EndIf



Oder du schreibst dir ein kleines Programm, dass einen dedizierten Server für dein Spiel erstellt. Dediziert (oder engl. dedicated) heißt, dass der Server nur Daten verarbeitet, aber selber kein Spieler mit diesem Programm spielen kann. Er kann sich aber über das Client-Programm (das eigentliche Spiel) auf diesem ded-Server einklinken. Du hast dann also zwei .exe-Dateien.
Bei kleinen Spielen ist das aber meist nicht nötig, weil die obere Variante einfacher ist. Ein dedizierter Sever bietet sich hauptsächlich im Internet an Wink Ein sehr schönes Beispiel für so ein Programm bietet "Freelancer" - da kann man Spieleranzahl und so bequem einstellen und dann direkt den Server starten.

Also:

Code: [AUSKLAPPEN]

; Clientprogramm, "Spiel"
; (Steuerung)
; (eigene Daten senden und fremde empfangen)
; (Verarbeiten)


;#####
; dedizierter Server, "Verwaltungsprogramm"
; (alle Daten empfangen und versenden)



Der Vorteil: Du hast kürzere Programme und es macht Spaß, sie zu verbinden Very Happy


MfG garret


Eins noch: Nenn' deine Variablen nicht aa oder so - in ein paar Wochen hast du dann nämlich keine Ahnung, wofür sie genutzt wurde. Außerdem erleichtern sinnvolle Namen dir und anderen so die Fehlersuche.
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)
  • Zuletzt bearbeitet von garret am Fr, Jun 08, 2007 0:11, insgesamt einmal bearbeitet

Lunatix

BeitragFr, Jun 08, 2007 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, schon besser.
Natürlich darfst du,wenn du daten von einem anderen client in den stream geschrieben hast, nicht einfach etwas dazuschreiben und einem neuen antworten. Arbeite zuerst alle spieler ab und gehe dann auf neue Anfragen ein. Um zusätzlichen schutz vor Server überlastung zu erreichen kannst du z.b. ein maximales Datenlimit für die clienten festlegen, damit du nicht ewig am auslesen des Streams hängst. Und man sollte auch die kommunikation so aufbauen das sie möglichst wenig sendet, kein langes "Player-X:55.5" z.b., da könnte man einfach nur die Position reinschreiben.
"Welcome" sind z.b. 7 bytes, du könntest aber auch einfach vier bytes ala "FF FF FF FF" senden, was eben nur 4bytes sind.
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

mas93

BeitragFr, Jun 08, 2007 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@Junkprogger:

War das dann in meiner funktion richtig oder falsch??

Und wann soll ich das welcome dann in den stream schicken??

Weil die player fragen ja staendig die position ab.


Achja und garret:

Server wäre schon was feines^^ nur versteh ich von php ... garnix und hab kein server. Das kann ich also vergessen
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

garret

BeitragFr, Jun 08, 2007 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Du brauchst dafür kein PHP, denn du kannst das auch in Blitz programmieren. Die Netzwekbefehle sind dieselben - lediglich die Struktur deiner Programme ist unterschiedlich.
Für einen dedizierten Server brauchst du zum Beispiel nur eine minimale Ausgabe (über den Netzwerkverkehr, Spieleranzahl etc.) und theoretisch keine Grafik. Es geht halt nur darum, möglichst schnell alle Spielerdaten ohne irgendwelchen Schnickschnack verwalten zu können Very Happy

Außerdem benötigst du keinen extra PC zum Testen. Wenn du den dedizierten Server auf deinem PC startest, kannst du dich mit dem Clientprogramm auch in den Server einklinken.

Und zum Thema Versenden: Wenn du deinen Nachrichten Codes zuweist, kannst du kürzere (und damit schnellere) Daten verschicken.
Zum Beispiel in der Form: Nachrichtenkategorie, Unterkategorie, Spieler, Details
-> Das verschickte Paket sähe dann zum Beispiel so aus: 1 (Spielnachricht) 1 (Bewegung) 2 (von Spieler 2) 1 (X) 0 (Y)

Mit WriteShort()/WriteByte() brauchst du außerdem weniger Platz als bei WriteInt() (und WriteShort()), da die versendeten Werte in dem Beispiel keine 4 Byte Platz benötigen Wink


MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Lunatix

BeitragFr, Jun 08, 2007 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Achja, und wo bekommt er mal so eben den windowsserver her? Der dazu noch um einiges mehr kostet? Aber garret hat schon recht - wenn du dir einen Linux VServer (ab 10euro) holst, ist das schonmal ein Anfang, dann musst du nurnoch BlitzMax lernen.... Wink
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

garret

BeitragFr, Jun 08, 2007 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube allerdings nicht, dass er für sein kleines Spiel einen extra PC als Server braucht. Um es zu testen, reicht es sicher aus, wenn einer der Teilnehmer das Spiel hostet. Oder soll es ein MMORPG werden? Wink
Von Windows-/Linux-Servern verstehe ich zwar recht wenig, aber so ein dedizierter Server macht doch eh erst bei mehreren Spielern Sinn, bzw. wenn er rund um die Uhr laufen soll. Und für dessen Programmierung sollte dann eher eine geeignetere Sprache als Blitz genommen werden.

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Lunatix

BeitragFr, Jun 08, 2007 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich schrieb ja auch BlitzMax. Mit ein bisschen "umbauen" der brl module braucht man z.b. keine Grafische oberfläche, somit kann man gut nen eigenen Server damit schreiben Wink
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Silver_Knee

BeitragFr, Jun 08, 2007 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab meinen pc auch als Server und der ist Windows... musste nur eine dyndns einrichten und ports freischalten

mas93

BeitragMo, Jun 11, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm, oder gibts vllt ein tutorial über das UDP mit mehr als 2 spielern?
Also einer Hostet beliebeig andere conecten?


mfg
Marius
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Tankbuster

BeitragMo, Jun 11, 2007 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also nicht das ich wüsste!
Es gibt leider nicht viele UDP, TCP oder ähnliche Tutorials. Und wenn, dann sind es nur Tuts, wie Z.B. EIN Client sender EINEM anderen eine Nachricht..
Ich könnte ja mal eins schreiben, aber ich hab nicht so viel Zeit! Confused
Twitter
Download Jewel Snake!
Windows|Android

Silver_Knee

BeitragMo, Jun 11, 2007 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
übrigens bei tcp funzt es irgenwie nur mit jeweils einem client pro server woran liegt das

Tankbuster

BeitragMo, Jun 11, 2007 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@FTC
Dann machst du wohl was falsch! ^^
Twitter
Download Jewel Snake!
Windows|Android

Silver_Knee

BeitragMo, Jun 11, 2007 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe auf einem pc via Createtcpserver() einen server auf port 80 erstellt und habe mit meinem firefox darauf gejoined und da kam die message "Client from xxx.xxx.xxx.xxx" danach hab ich mim iexplorer während der firefox noch on war drauf gejoined und nix.... erst als ich den firefox rausgeschmissen hab kam der iexplorer hoch

Tankbuster

BeitragMo, Jun 11, 2007 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Firefox und IE benutzen auch den selben Port (80) -.-
Twitter
Download Jewel Snake!
Windows|Android

Silver_Knee

BeitragMo, Jun 11, 2007 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ach das problem lag nicht am server sondern am client...^^ups
 

BIG BUG

BeitragMo, Jun 11, 2007 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sage das jetzt nur ungern, aber Dein Programm ist ziemlich übel aufgebaut und zeigt keine Struktur.
So dürfte es ziemlich schwierig werden, hier einen gescheiten Multiplayermodus zu implementieren.

- Grafik- und Spielsteuerung immer trennen. Das uralte EVA-Prinzip kann man auch innerhalb einer Gameloop einsetzen.
Also zuerst werden alle Steurungseingaben(lokal & Netzwerk) für alle Objekte abgefragt. (Eingabe)
Dann werden alle Objekte mit den neuen Eingaben bewegt und auf Kollisionen geprüft. (Verarbeitung)
Und dann erfolgt in einem eigenen Schritt das Zeichnen am Bildschirm (Ausgabe).

- "Gleichwertige" Objekte wie z.B. "Spieler" oder "Gegner" solltest Du innerhalb einer Typeliste verwalten. Ob es sich um einen Spieler oder z.B. KI handelt, wird in einem eigenen Field hinterlegt.

- Jeder Spieler bekommt vom Host eine eindeutige Nummer zugewiesen, mit welcher er identifiziert werden kann. Diese wird ebenfalls im Type hinterlegt.
Spieler "rot" hat also z.B. immer die Nummer 3 und ist unter dieser Nummer bei jedem anderen Spielteilnehmer bekannt. Jeder andere PC weiss somit, falls einen Info über/von Spieler 3 kommt, es sich um den roten Spieler handelt.

- Im Verarbeitungsteil werden alle Spieler auf die gleiche Weise verwaltet, egal ob diese jetzt über Netzwerk oder lokal gesteuert werden.
Neben den Positionsangaben wird auch die Bewegungsrichtung/-geschwindigkeit bzw. die gedrückten Tasten übermittelt. Dadurch brauchen wir diese neue Info nur vor der Verarbeitung setzen und lassen den Rest unsere Verarbeitungsroutine machen.

- Jeder PC sendet seine geänderten Positionen nur z.B. 10 Mal pro Sekunde, falls sich hier etwas geändert hat.

- Wenn möglich sollten alle Informationen, die zu einem Zeitpunkt bekannt sind, in ein einziges UDP-Paket geschnürt werden.

- Es gibt nur ein Programm, welches sowohl als Host- als auch Client agieren kann(Ausnahme dedizierter Server), da sonst jede Änderung doppelt gemacht werden müsste.

Die obigen Tipps lassen sich jetzt vielleicht nicht auf jedes Spielprinzip optimal anwenden, aber für die meisten Situationen sollte das schon helfen.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

mas93

BeitragDi, Jun 12, 2007 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
so, ich hab ein neues problem.
Und zwar will ich, das wenn ein neuer spieler dazukommt, der server ihm alle spielernamen zuschickt.

Der server hat alle spielernamen in einem typ

Ich wollte das jetzt so machen:
Code: [AUSKLAPPEN]

WriteByte(udp,4)
c.client=Each client
WriteString(udp,c\name$)  ;dem neuen spieler alle spieler zuschicken
SendUDPMsg udp,neuerplayerip,neuerplayerport  ;UDP Message senden



so, jetzt sendet er aber alle namen auf 1-mal.
Wie kann ich machen das er name für name einzelnt in einem string schickt??


mfg
marius
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group