Server und Client?

Anfängerfragen zum Programmieren mit PureBasic.
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Server und Client?

Beitrag von Svking »

Hallo,
Ich bin relativ neu in PB und wollte mal ein kleines Spiel programmieren.
Es ist eine art Rollenspiel.
Das game wollte ich auch online spielbar machen, also brauche ich einen Client und einen Server.
Nur, wie macht man einen? Welche befehle brauche ich?

kann mir da einer weiterhelfen?

Ich hab auch noch einige fragen zum spiel selbst:

Wie kann ich eine animation machen, dass sich die Figur beim laufen bewegt?

Wie macht man einen Mapwechsel?




Das ist mein code bis jetzt:

Code: Alles auswählen

If InitSprite() = 0                                               
  MessageRequester("Fehler","Konnte dx nicht finden",0)         
EndIf                                                       

If InitKeyboard()=0                                               
  MessageRequester("Fehler","Konnte dx nicht finden",0)           
EndIf                                                           


If OpenScreen(1280,1024,32,"Vollbild") = 0                         
  MessageRequester("Fehler","Konnte kein Vollbild erstellen ",0)
EndIf                                                           

LoadSprite(0,"data\playerB.bmp",0)                             
LoadSprite(1,"data\wall.bmp",0)
LoadSprite(2,"data\rasen.bmp",0)
LoadSprite(3,"data\playerF.bmp",0)
LoadSprite(4,"data\playerL.bmp",0)
LoadSprite(5,"data\playerR.bmp",0)
LoadSprite(6,"data\map1street.bmp",0)
LoadSprite(7,"data\map2street.bmp",0)


position_x = 0
position_y = 0
look = 3
level = 1
Repeat                                             
  FlipBuffers()                                     
  ClearScreen(31,80,33)                       
  ExamineKeyboard()                               
  If KeyboardPushed(#PB_Key_Right)               
    position_x + 2
    look = 5                             
    If position_x > 1000                             
      position_x = 1000 
      
    EndIf                                           
  EndIf                                             
  
  If KeyboardPushed(#PB_Key_Left)             
    position_x  - 2
    look = 4                             
    If position_x < 0                         
      position_x = 0 
      
    EndIf                                           
  EndIf                                           
  If KeyboardPushed(#PB_Key_Up)       
    position_y  - 2
    look = 0                           
    If position_y < 0                         
      position_y = 0
      
    EndIf         
    
    If KeyboardPushed(#PB_Key_F1) 
    EndIf                         
  EndIf                                           
  
  If KeyboardPushed(#PB_Key_Down)               
    position_y + 2 
    look = 3                                 
    If position_y > 1000                             
      position_y = 1000   
      
    EndIf                         
  EndIf                                             
  
  If SpriteCollision(look,position_x,position_y,1,200,200) = 1
    position_y + 5
  EndIf                     
  DisplayTransparentSprite(look,position_x,position_y)         
  
  If SpriteCollision(look,position_x,position_y,1,232,200) = 1
    position_y + 5
  EndIf                     
  DisplayTransparentSprite(look,position_x,position_y)         
  
  
  If SpriteCollision(look,position_x,position_y,1,264,200) = 1
    position_y + 5
    
    If SpriteCollision(look,position_x,position_y,0,10,287) = 1
      level = 2
      
    EndIf
  EndIf
  If level = 1
    DisplayTransparentSprite(2,0,0)
    DisplayTransparentSprite(1,296,200)
    DisplayTransparentSprite(1,264,200)
    DisplayTransparentSprite(1,232,200) 
    DisplayTransparentSprite(1,200,200)
    DisplayTransparentSprite(6,0,0)                         
    DisplayTransparentSprite(look,position_x,position_y)                                 
  EndIf
  
  If level = 2
    DisplayTransparentSprite(7,0,0)
    DisplayTransparentSprite(look,position_x,position_y)   
  EndIf
  If KeyboardPushed(#PB_Key_Escape)                           
    End                                                       
  EndIf                                                       
ForEver
mfg Sv

Edit by Kiffi: Code-Tags gesetzt und Code formatiert
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

1. codetags setzen
2. ich würde keinen screen mit 1280 * 1024 öffnen. entweder zum einstellen oder 1024 * 768 weil letzteres hat so ziemlich jeder...
3. zu deinem problem mit den maps, die frage ist nicht wie man sie wechselt sondern wie du sie anzeigst. wenn du die map mit displaysprite(#map1,0,0) anzeigst, wechselst du sie in dem du schreibst displaysprite(#map2,0,0).
4. wegen den animationen, du musst einfach z.B. 4 verschiedene bilder anzeigen immer hintereinander.

wegen dem netzwerkproblem könnte ich dir zwar helfen aber ich hab jetzt wenig zeit und kann kein beispiel schreiben. vieleicht hilf dir nen anderer ansonsten später :allright:
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Beitrag von Svking »

hmm ich weis nicht, wie du das meinst mit der animation, bin halt noch ein noob in PB :)

aber wenn ich das so mache:

Code: Alles auswählen

   If KeyboardPushed(#PB_Key_Left)              
    position_x  - 2
    look = 4  
    playerskin = 0
    playerskin = 4               
    If position_x < 0                          
      position_x = 0 
dann macht er nur den letzten skin und bewegt sich wieder nicht.

Achja, wie macht man eigendlich, dass man über einen sprite nicht rüberlaufen kann sondern diesen blockt?[/c]
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Schau dir mal spritecollision() an. :allright:

Edit:

Code: Alles auswählen

If KeyboardPushed(#PB_Key_Left)             
position_x  - 2
look = 4 
playerskin  + 1
if playerskin = 5 : playerskin = 1 : endif               
If position_x < 0                         
  position_x = 0
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Re: Server und Client?

Beitrag von Laurin »

Svking hat geschrieben: Das game wollte ich auch online spielbar machen, also brauche ich einen Client und einen Server.
Nur, wie macht man einen? Welche befehle brauche ich?
Ich hab hier was gecodet. Schicke bitte keine Dateien zu Server, sonst bockt er, weil keine Empfangsroutine dafür eingebaut ist.


Server.pb

Code: Alles auswählen

; Hinweis:
; Die Prozedur GetCienIP() funktioniert nur unter Windows.

Procedure.s GetClientIP(ClientID)
  ;
  ; Author: olejr
  ; http://forums.purebasic.com/english/viewtopic.php?t=14280
  ;
  Structure IPType
    Reserved.w
    Port.w
    StructureUnion
      IPLong.l
      IP.b[4]
    EndStructureUnion
    Zeros.l[2]
  EndStructure
 
  s = SizeOf(IPType)
 
  res = getpeername_(ClientID, @IP.IPType, @s)
  If res = 0
    remotip$ = StrU(IP\IP[0], #Byte)+"."+StrU(IP\IP[1],#Byte)+"."+StrU(IP\IP[2], #Byte)+"."+StrU(IP\IP[3], #Byte)
  Else
    remotip$ = ""
  EndIf
 
  ProcedureReturn remotip$
 
EndProcedure

Procedure SendeBestaetigung(ClientID, Flag)
  If Flag = 1
    Text.s = "die Verbindung bestätigt."
  ElseIf Flag = 2
    Text = "die Daten epfangen."
  ElseIf Flag = 3
    Text = "den Dateiempfang abgelehnt."
  EndIf
  SendNetworkString(ClientID, "Der Server hat " + Text)
EndProcedure

If InitNetwork() ; Überprüfen, ob Netzwerk verfügbar ist.
  If CreateNetworkServer(6832) ; Server starten
    If OpenConsole()
      MemoryID = AllocateMemory(1024) ; 1 KByte Speicher
     
      If MemoryID
        PrintN("Server betriebsbereit.")
        PrintN("")
        PrintN("Das Programm kann jederzeit durch einen Tastendruck abgebrochen werden.")
        PrintN("---")
       
        Repeat
          Delay(1) ; Damit unser Programm nicht 100% Prozessorlast erzeugt.
         
          KeyboardEvent.s = Inkey() ; Tastendruck speichern
           
          NetworkEvent = NetworkServerEvent() ; Gucken, ob was passiert ist.
         
          If NetworkEvent = 1 ; Client hat sich mit Server verbunden.
            PrintN("Neuer Client hat eine Verbindung geöffnet.")
            PrintN("Client hat die ID " + Str(NetworkClientID()))
            PrintN("Client IP ist " + GetClientIP(NetworkClientID()))
            SendeBestaetigung(NetworkClientID(), 1)
            PrintN("---")
          ElseIf NetworkEvent = 2 ; Cient hat Daten geschickt.
            PrintN("Client " + Str(NetworkClientID()) + " hat Daten gesendet.")
            Laenge = ReceiveNetworkData(NetworkClientID(), MemoryID, 1024) ; Daten in den Speicher kopieren
            If Laenge = 1024
              PrintN("Es wurden mehr als 1 Kilobyte Daten empfangen. Es werden nur die ersten 1024 Zeichen angezeigt.")
            EndIf
            PrintN(PeekS(MemoryID, Laenge))
            SendeBestaetigung(NetworkClientID(), 2)
            PrintN("---")
          ElseIf NetworkEvent = 3 ; Client hat eine Datei geschickt.
            PrintN("Client " + Str(NetworkClientID()) + " hat eine Datei geschickt.")
            PrintN("Dateiempfang nicht unterstützt.") ;  ;)
            SendeBestaetigung(NetworkClientID(), 3)
            PrintN("---")
          ElseIf NetworkEvent = 4
            PrintN("Client " + Str(NetworkClientID()) + " hat die Verbindung geschlossen.")
            PrintN("---")
          EndIf
        Until KeyboardEvent
        PrintN("Server wird heruntergefahren.")
        Delay(1000)
        FreeMemory(MemoryID)
        PrintN("Speicher freigegeben.")
        Delay(1000)
        CloseNetworkServer()
        PrintN("Server beendet.")
        Delay(3000)
        End
      Else
        MessageRequester("Fehler", "Zuwenig Speicher frei.", 0)
      EndIf
      CloseConsole()
    Else
      MessageRequester("Fehler", "Consolenfenster konnte nicht geöffnet werden.", 0)
    EndIf
  Else
    MessageRequester("Fehler", "Server konnte nicht gestartet werden.", 0)
  EndIf
Else
  MessageRequester("Fehler", "Netzwerkumgebung konnte nciht geladen werden.", 0)
EndIf
Client.pb

Code: Alles auswählen

If InitNetwork() ; Überprüfen, ob Netzwerk verfügbar ist.
  MemoryID = AllocateMemory(1024)
  If MemoryID
    If OpenConsole()
      PrintN("Geben Sie die IP des Servers ein:")
      ServerIP.s = Input()
      PrintN("")
      PrintN("Geben Sie den Port des Servers ein:")
      ServerPort.s = Input()
      PrintN("")
      PrintN("---")
      ConnectionID = OpenNetworkConnection(ServerIP, Val(ServerPort)) ; Verbindung zum Server herstellen.
      Debug ConnectionID
      If ConnectionID
        PrintN("Verbindung zum Server hergestellt.")
        PrintN("---")
        PrintN("Tastenbelegung:")
        PrintN("[1] Nachricht schicken")
        PrintN("[2] Datei schicken")
        PrintN("[3] Verbindung trennen und Client beenden")
        PrintN("---")
        Repeat
          KeyboardEvent.s = Left(Inkey(), 1) ; Wir brauchen nur den ASCII-Wert
          If KeyboardEvent = "1"
            PrintN("Geben Sie eine Nachricht ein und drücken Sie zum Abschluß [Return]:")
            Nachricht.s = Input()
            SendNetworkString(ConnectionID, Nachricht)
            PrintN("Nachricht gesendet.")
            PrintN("---")
          ElseIf KeyboardEvent = "2"
            PrintN("Geben Sie den Pfad der zu übertragenden Datei ein. Beenden Sie Ihre Eingabe mit [Return].")
            Datei.s = Input()
            SendNetworkFile(ConnectionID, Datei)
            PrintN("Datei wurde versendet.")
            PrintN("---")
          ElseIf KeyboardEvent = "3"
            Break ; Repeat-Forever-Schleife verlassen
          EndIf
          NetworkEvent = NetworkClientEvent(ConnectionID)
          If NetworkEvent = 3 ; Text wurde übertragen
            PrintN("Daten vom Server wurden empfangen:")
            Laenge = ReceiveNetworkData(ConnectionID, MemoryID, 1024) ; Daten in den Speicher kopieren
            If Laenge = 1024
              PrintN("Es wurden mehr als 1 Kilobyte Daten empfangen. Es werden nur die ersten 1024 Zeichen angezeigt.")
            EndIf
            PrintN(PeekS(MemoryID, Laenge))
            PrintN("---")
          EndIf
        ForEver
        PrintN("Client wird beendet.")
        Delay(1000)
        FreeMemory(MemoryID)
        PrintN("Speicher freigegeben.")
        Delay(1000)
        CloseNetworkConnection(ConnectionID)
        PrintN("Verbindung geschlossen.")
        Delay(3000)
        End
      Else
        PrintN("Verbindung zum Server konnte nicht hergestellt werden.")
        Delay(3000)
        End
      EndIf
    Else
      MessageRequester("Fehler", "Console konnte nicht geöffnet werden.", 0)
    EndIf
  Else
    MessageRequester("Fehler", "Zuwenig Speicher frei.", 0)
  EndIf
Else
  MessageRequester("Fehler", "Netzwerkumgebung konnte nciht geladen werden.", 0)
EndIf
Einfach beide Codes auf deinem Rechner starten (Server zuerst). Beim Clienten fragt er dich nach der Server IP und den Port. Da gibst du einfach "127.0.0.1" und "6832" ein.

Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Beitrag von Svking »

cool thx :) nur, wie kann ich das in mein game einbauen? also wie funktioniert der datenaustausch damit, damit der server die positionen der spieler läd und an alle anderen spieler sendet?
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Naja, ich denke mal, DU willst ein Programm schreiben, oder? Da musst du eben auch selber ein bisschen rumexperimentieren (nur so lernt man, alles andere ist bestenfalls staubtrockene Theorie). Wenn wir dir dein Spiel fertig programmiert liefern, besteht ausserdem noch die Gefahr, dass du nix dabei lernst, weil du dir den Code nicht genau (genug) anschaust, und ihn nicht verstehtst. Schau dir deinen Code an, schau dir den von LAurin an, und versuch, die beiden zu verschmelzen. Wenn du bei irgendeinem ganz spezifischen Befehl (oder in einer bestimmten Zeile) nicht weiterkommst, kannst du ja ruhig fragen. Aber ein Minimum an Engagement solltest du auch zeigen, findest du nicht? :wink:
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Beitrag von Svking »

hm, stimmt^^ Ich werde mir die Codes mal genauer anschauen,
das ist ja auch eigendlich das, wieso ich mir PureBASIC gekauft habe :)
(um Programmieren zu lernen) ;)
Das Ende meines Lebens:
If leben = 0
End
Endif
Antworten