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

![]() |
mas93Betreff: Wird das so was?-UDP Multiplayer [NOCHMAL EIN NEUES PROBLEM] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() MfG garret |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.... ![]() |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
[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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab meinen pc auch als Server und der ist Windows... musste nur eine dyndns einrichten und ports freischalten | ||
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
übrigens bei tcp funzt es irgenwie nur mit jeweils einem client pro server woran liegt das | ||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@FTC
Dann machst du wohl was falsch! ^^ |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Firefox und IE benutzen auch den selben Port (80) -.- | ||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ach das problem lag nicht am server sondern am client...^^ups | ||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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] |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group