Seite 1 von 1

Networkverbindung Programmierungsfehler?

Verfasst: 12.01.2008 23:15
von Milchshake
Hi,
ich probiere mich gerade am Network, und ich glaube, ich habs schon so ziemlich draußen.
ABER:
Dieses kleine "Spiel" (was eig. erst ein Spiel werden soll) hat denke ich einen schwerwiegenden Fehler, der das ganze um so einiges Verzögert.
Hier mal der Code:
Server:

Code: Alles auswählen

If InitNetwork() = 0
MessageRequester("Fehler","Konnte das Network nicht starten")
End
EndIf 

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Fehler", "Konnte DirectX 7 nicht starten", 0)
  End
EndIf

If OpenWindow(0,0,0,410,310,"The little Spider Game-Server",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)


  If OpenWindowedScreen(WindowID(0),5,5,320,300,0,0,0)
     CreateSprite(0,20,20)
     StartDrawing(SpriteOutput(0))
     Box(0,0,20,20,#White)
     StopDrawing()
     
     CreateSprite(1,20,20)
     StartDrawing(SpriteOutput(1))
     Box(0,0,20,20,#Green)
     StopDrawing()
    EndIf
  Else
    MessageRequester("Fehler", "Konnte den Screen nicht öffnen", 0)
    End
  EndIf



direction = 1
playerX = 150
playerY = 280
Buffer2 = AllocateMemory(1000)
CreateNetworkServer(0,6666)
Buffer = AllocateMemory(1000)
Repeat
  Event.l = WindowEvent()    
  
  If Event = #PB_Event_Gadget
    ; do the normal application stuff here...
    Gadget  = EventGadget()  

  Else
    ; do the sprite & screen stuff here...
    FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up)    And playerY > 0   : playerY -3 : EndIf  
    If KeyboardPushed(#PB_Key_Down)  And playerY < 280 : playerY +3 : EndIf  
    If KeyboardPushed(#PB_Key_Left)  And playerX > 0   : playerX -3 : EndIf  
    If KeyboardPushed(#PB_Key_Right) And playerX < 300 : playerX +3 : EndIf  
    
    ; Clear the screen and draw our sprites
    ClearScreen(RGB(0,0,0))
    DisplaySprite(0, playerX, playerY)
   If Start = 1
   DisplaySprite(1,sentx,senty)
   EndIf 
  
  
  
  Client = EventClient()
  Server = NetworkServerEvent() 

  Select Server
  Case 1
  Start = 1
  Case 2 

  If State = 0
  ReceiveNetworkData(EventClient(),Buffer,1000)
  sentx = PeekQ(Buffer)
  State = 1
  EndIf 
  
  If State = 1
  ReceiveNetworkData(EventClient(),Buffer,1000)
  senty = PeekQ(Buffer)
  State = 0
  EndIf 

  EndSelect   

  EndIf


Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

End   
Client:

Code: Alles auswählen

If InitNetwork() = 0
MessageRequester("Fehler","Konnte das Network nicht starten")
End
EndIf 

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Fehler", "Konnte DirectX 7 nicht starten", 0)
  End
EndIf

If OpenWindow(0,0,0,410,310,"The little Spider Game-Client",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)


  If OpenWindowedScreen(WindowID(0),5,5,320,300,0,0,0)
     CreateSprite(0,20,20)
     StartDrawing(SpriteOutput(0))
     Box(0,0,20,20,#White)
     StopDrawing()
     
     CreateSprite(1,20,20)
     StartDrawing(SpriteOutput(1))
     Box(0,0,20,20,#Green)
     StopDrawing()
    EndIf
  Else
    MessageRequester("Fehler", "Konnte den Screen nicht öffnen", 0)
    End
  EndIf


Buffer2 = AllocateMemory(1000)
direction = 1
playerX = 150
playerY = 280
Server = OpenNetworkConnection("127.0.0.1",6666)
Buffer = AllocateMemory(1000)
Repeat
  Event.l = WindowEvent()    
  
  If Event = #PB_Event_Gadget
    ; do the normal application stuff here...
    Gadget  = EventGadget()  

  Else
    ; do the sprite & screen stuff here...
    FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up)    And playerY > 0   : playerY -3 : EndIf  
    If KeyboardPushed(#PB_Key_Down)  And playerY < 280 : playerY +3 : EndIf  
    If KeyboardPushed(#PB_Key_Left)  And playerX > 0   : playerX -3 : EndIf  
    If KeyboardPushed(#PB_Key_Right) And playerX < 300 : playerX +3 : EndIf  
    
    ; Clear the screen and draw our sprites
    ClearScreen(RGB(0,0,0))
    DisplaySprite(0, playerX, playerY)
   
   
  
 PokeQ(Buffer2,PlayerX)
 SendNetworkData(Server,Buffer2,1000)
 PokeQ(Buffer2,PlayerY)
 SendNetworkData(Server,Buffer2,1000)
  
 ServerEvent = NetworkClientEvent(Server) 
 
 Select ServerEvent 
 Case 0
 State = 0
 Case 2
 If State = 1
 ReceiveNetworkData(Server,Buffer,1000)
 sentx = PeekQ(Buffer)
 State = 2
 EndIf 
 If State = 2
 ReceiveNetworkData(Server,Buffer,1000)
 senty = PeekQ(BUffer)
 State = 1
 EndIf 
 
 EndSelect 

  EndIf

Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

End   
Wenn man jetzt beides öffnet, also Server und Client, und den Client nachher mithilfe der Pfeiltasten bewegt, dann ist das (also die Bewegung des Clienten) auf den Serverbildschirm um einiges Verzögert.
Was mache ich falsch, bzw. wie mache ich es richtig?

lg Milchshake

Verfasst: 13.01.2008 00:22
von STARGÅTE
das problem ist das du dauerhaft "Spamst" der Client läuft etwas schneller als der Server (denke ich mal).

Wenn nun der Client in jedem Schleifendurchlauf daten sendet kommt der Server da nicht mit.

du musst es anders machen:

Meine Variante wäre:
Du sendest immer noch ob eine Taste und welche gerade runter gedrückt wurde und wann wieder losgelassen wird.
Der server sendet diese rohdaten an alle anderen, die dann die Daten als Bewegung interpretieren.
Beispiel:
W-Down
(4s vergeheen)
W-Up

dann läuft der Spieler 4 s nach vorn

Verfasst: 13.01.2008 01:15
von gnasen
ich bin selber in dem Gebiet noch nicht so bewandert deswegen eine Frage:

Könnte man auch alle Aktionen in einem Zeitrahmen einfangen und als Paket abschicken, zB 100 ms. Der Client baut anschließend aus den Daten das Geschehen nach.

Oder ist das zu langsam oder gar anfällig als system?

Ich hätte gerne mal einen Beispielcode für ein Spiel ala Pong fürs Netzwerk, um mir die Technik mal genauer anzuschauen.

Wäre für Codeschnipsel, oder noch besser ausführbaren, seeehr Dankbar!