salut
voila ce code est tres interesaant masi je l'est modifier un petit peu pour ariver petit a petit a ce que je veux.Le code est loin d'etre bon je pence enfin sa lag encore un peu ... voila tout
ajout:
-Gestion de deux client et plus
edit
Modif des code:
-moins de lag
-supresssion du caré quand deconexion
-numero du client id sur le caré
-choisir la couleur du cube (petit bug jai pas trrouver dou sa vien
Le client
Code : Tout sélectionner
#WIN = 0 ; ID de la fenêtre principale
#COTE = 50 ; taille des côtés du carré
#STEP = 2 ; nombre de pixels de déplacement par pas
;Déclaration des variables globales
Global x, y, mode.s, IP.s, cnxID ,red,green,blue
x = 0 ; initialisation de x
y = 0 ; initialisation de y à 0
mode = ProgramParameter() ; récupération du 1er paramètre de la ligne de commande
IP = ProgramParameter() ; récupération du 2eme paramètre...
InitSprite() ; initialisation de la bilbiothèque des sprites
InitKeyboard() ; initialisation de la bilbiothèque du clavier
InitNetwork() ; initialisation de la bilbiothèque du réseau
port=22 ; Attribution du port 6666 au programme
mode = "-client"
IP = InputRequester("ip","choissiser l'ip du server","193.251.239.32")
Port = Val(InputRequester("port","choissiser le port du server","22"))
Color.l = ColorRequester()
red=Red(Color)
blue=Blue(Color)
green=Green(Color)
If mode = "-server"
;si le prog est en mode "server", alors lancer le server
CreateNetworkServer(Port)
ElseIf mode = "-client"
;si le prog est en mode "client", alors ouvrir la connexion client sur le server
cnxID = OpenNetworkConnection(IP,port)
;si la connexion ne s'est pas faite, alors afficher le message suivant :
If cnxID = 0
MessageRequester("Erreur","Serveur "+IP+" introuvable !", #PB_MessageRequester_Ok)
EndIf
EndIf
Procedure MoveSquare(direction)
;********************************************************************************
; Déplace les coordonnées du carré rouge en fonction de la direction renvoyée
; par la variable 'direction'.
; 0=gauche, 1=droite, 2=haut, 3=bas
;********************************************************************************
Select direction
Case 0 ; gauche
x-#STEP
If x < 0 : x = 0 : EndIf ; empêche le carré de sortir de l'écran (à gauche)
Case 1 ; droite
x+#STEP
If x > 640-#COTE : x = 640-#COTE : EndIf ; empêche le carré de sortir de l'écran (à droite)
Case 2 ; haut
y-#STEP
If y < 0 : y = 0 : EndIf ; empêche le carré de sortir de l'écran (en haut)
Case 3 ; bas
y+#STEP
If y > 480-#COTE : y = 480-#COTE : EndIf ; empêche le carré de sortir de l'écran (en bas)
Case 4
Delay(10)
message$=InputRequester("Message","entrer votre message","")
Delay(10)
Default
EndSelect
;SI le prog est en mode "client", ALORS envoi des coordonnées X & Y au server
;X & Y sont séparés par des ";" et les différents blocs de coordonnées sont séparés par des "#"
If mode = "-client"
Delay(40)
packet.s = Str(x)+";"+Str(y)+";"+Str(red)+";"+Str(blue)+";"+Str(green)+";"+message$+"#"
SendNetworkData(cnxID,@packet,Len(packet))
message$=""
EndIf
EndProcedure
Procedure DisplaySquare()
;********************************************************************************
; Affiche le carré rouge à l'écran
;********************************************************************************
ClearScreen(0,0,0) ; Efface l'écran avec une couleur de fond noire
StartDrawing(ScreenOutput()) ; démarre la fonction "dessiner sur l'écran"
Box(x,y,#COTE,#COTE,RGB(255,0,0)) ; dessine le carré rouge aux coordonnées x & y
StopDrawing() ; arrête la fonction "dessiner sur l'écran"
FlipBuffers() ; affiche le résultat du dessin (permute les buffers)
EndProcedure
OpenWindow(#WIN,0,0,640,480,#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget,mode+" "+ip+" "+Str(Port) )
OpenWindowedScreen(WindowID(#WIN),0,0,640,480,0,0,0)
ssbloc.s="" ; initialisation de la chaine 'ssbloc'
;Boucle principale répétée jusqu'a ce que la fenêtre soit fermée
Repeat
EventID = WindowEvent() ; vérifie si un évènement Windows a été activé
DisplaySquare() ; affiche le carré rouge
ExamineKeyboard() ; vérifie si une touche du clavier a été enfoncée puis relâchée
If KeyboardPushed(#PB_Key_Left) : MoveSquare(0) : EndIf
If KeyboardPushed(#PB_Key_Right) : MoveSquare(1) : EndIf
If KeyboardPushed(#PB_Key_Up) : MoveSquare(2) : EndIf
If KeyboardPushed(#PB_Key_Down) : MoveSquare(3) : EndIf
If KeyboardPushed(#PB_Key_Return): MoveSquare(4) : EndIf
MoveSquare(6)
;SI le prog a été lancé avec le mode "server", et qu'il n'y a pas de bloc...
If mode = "-server" And bloc = 0
SEvent = NetworkServerEvent() ; vérifie si des packets IP ont été recus
If SEvent = 2 ; (2 = réception de données brutes)
;Récupération de l'ID client
clientID = NetworkClientID()
;Alloue 512 octets dans la mémoire pour le buffer de réception
*buffer = AllocateMemory(512)
;Récupère les données recues, et les place dans le buffer
ReceiveNetworkData(clientID, *buffer, 500)
;Renvoie dans la varaible 'packet' la chaine contenue dans le buffer
packet.s = PeekS(*buffer,MemoryStringLength(*buffer))
;Compte le nombre de bloc de coordonnées
bloc = CountString(packet,"#")
;Supprime le buffer
FreeMemory(*buffer)
EndIf
EndIf
;SI il y a au moins un bloc, ALORS faire la bloucle qui récupère les coordonnées de chaque bloc
If bloc > 0
For k=1 To bloc
ssbloc = StringField(packet,k,"#") ; extrait le bloc numéro k
x = Val(StringField(ssbloc,1,";")) ; change x avec la coordonnée X du bloc k
y = Val(StringField(ssbloc,2,";")) ; change y avec la coordonnée Y du bloc k
DisplaySquare() ; Affiche le carré rouge
Next
bloc=0 ; une fois la boucle terminée -> réinitialisation du compteur de blocs à 0
EndIf
Until EventID = #PB_Event_CloseWindow
If mode = "-server"
CloseNetworkServer() ; si le prog est en mode "server", alors fermer le server
ElseIf mode = "-client"
x=0
y=0
packet.s = Str(x)+";"+Str(y)+"#"
SendNetworkData(cnxID,@packet,Len(packet))
CloseNetworkConnection(cnxID) ; si le prog est en mode "client", alors fermer la connexion client
EndIf
End ; Terminaison du programme.
le server
Code : Tout sélectionner
clicli=2
Dim pos(5,50)
#WIN = 0 ; ID de la fenêtre principale
#COTE = 50 ; taille des côtés du carré
#STEP = 2 ; nombre de pixels de déplacement par pas
;Déclaration des variables globales
Global x, y, mode.s, IP.s, cnxID,clicli,clie
x = 0 ; initialisation de x à 0
y = 0 ; initialisation de y à 0
mode = ProgramParameter() ; récupération du 1er paramètre de la ligne de commande
IP = ProgramParameter() ; récupération du 2eme paramètre...
InitSprite() ; initialisation de la bilbiothèque des sprites
InitKeyboard() ; initialisation de la bilbiothèque du clavier
InitNetwork() ; initialisation de la bilbiothèque du réseau
port=22 ; Attribution du port 6666 au programme
mode = InputRequester("type","choissiser -server ou -client","-server")
IP = InputRequester("ip","choissiser l'ip du server","80.10.55.117")
Port = Val(InputRequester("port","choissiser le port du server","22"))
If mode = "-server"
;si le prog est en mode "server", alors lancer le server
CreateNetworkServer(Port)
ElseIf mode = "-client"
;si le prog est en mode "client", alors ouvrir la connexion client sur le server
cnxID = OpenNetworkConnection(IP,port)
;si la connexion ne s'est pas faite, alors afficher le message suivant :
If cnxID = 0
MessageRequester("Erreur","Serveur "+IP+" introuvable !", #PB_MessageRequester_Ok)
EndIf
EndIf
Procedure MoveSquare(direction)
;******************************************************z**************************
; Déplace les coordonnées du carré rouge en fonction de la direction renvoyée
; par la variable 'direction'.
; 0=gauche, 1=droite, 2=haut, 3=bas
;********************************************************************************
For clie = 1 To clicli
Select direction
Case 0 ; gauche
pos(1,clie)-#STEP
If pos(1,clie) < 0 : pos(1,clie) = 0 : EndIf ; empêche le carré de sortir de l'écran (à gauche)
Case 1 ; droite
pos(1,clie)+#STEP
If pos(1,clie) > 640-#COTE : pos(1,clie) = 640-#COTE : EndIf ; empêche le carré de sortir de l'écran (à droite)
Case 2 ; haut
pos(2,clie)-#STEP
If pos(2,clie) < 0 : pos(2,clie) = 0 : EndIf ; empêche le carré de sortir de l'écran (en haut)
Case 3 ; bas
pos(2,clie)+#STEP
If pos(2,clie) > 480-#COTE : pos(2,clie) = 480-#COTE : EndIf ; empêche le carré de sortir de l'écran (en bas)
EndSelect
Next
;SI le prog est en mode "client", ALORS envoi des coordonnées X & Y au server
;X & Y sont séparés par des ";" et les différents blocs de coordonnées sont séparés par des "#"
If mode = "-client"
packet.s = Str(x)+";"+Str(y)+"#"
SendNetworkData(cnxID,@packet,Len(packet))
EndIf
EndProcedure
Procedure DisplaySquare()
;********************************************************************************
; Affiche le carré rouge à l'écran
;********************************************************************************
ClearScreen(0,0,0) ; Efface l'écran avec une couleur de fond noire
StartDrawing(ScreenOutput()) ; démarre la fonction "dessiner sur l'écran"
For clie=1 To clicli
Box(pos(1,clie),pos(2,clie),#COTE,#COTE,RGB(pos(3,Clie),pos(4,Clie),pos(5,Clie))) ; dessine le carré rouge aux coordonnées x & y
Locate(pos(1,clie)+5,pos(2,clie)+12)
FrontColor(255,255,255)
DrawingMode(1)
DrawText(Str(clie))
Next clie
FrontColor(255,255,255)
Locate(10,420)
DrawText("message"+messg$)
StopDrawing() ; arrête la fonction "dessiner sur l'écran"
FlipBuffers() ; affiche le résultat du dessin (permute les buffers)
EndProcedure
OpenWindow(#WIN,0,0,640,480,#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget,mode+" "+ip+" "+Str(Port) )
OpenWindowedScreen(WindowID(#WIN),0,0,640,480,0,0,0)
ssbloc.s="" ; initialisation de la chaine 'ssbloc'
;Boucle principale répétée jusqu'a ce que la fenêtre soit fermée
Repeat
EventID = WindowEvent() ; vérifie si un évènement Windows a été activé
DisplaySquare() ; affiche le carré rouge
ExamineKeyboard() ; vérifie si une touche du clavier a été enfoncée puis relâchée
If KeyboardPushed(#PB_Key_Left) : MoveSquare(0) : EndIf
If KeyboardPushed(#PB_Key_Right) : MoveSquare(1) : EndIf
If KeyboardPushed(#PB_Key_Up) : MoveSquare(2) : EndIf
If KeyboardPushed(#PB_Key_Down) : MoveSquare(3) : EndIf
;SI le prog a été lancé avec le mode "server", et qu'il n'y a pas de bloc...
If mode = "-server" And bloc = 0
SEvent = NetworkServerEvent() ; vérifie si des packets IP ont été recus
If SEvent = 2 ; (2 = réception de données brutes)
;Récupération de l'ID client
clientID = NetworkClientID()
If clientID>clicli
clicli=ClientID
Dim pos(5,ClientID)
EndIf
;Alloue 512 octets dans la mémoire pour le buffer de réception
*buffer = AllocateMemory(512)
;Récupère les données recues, et les place dans le buffer
ReceiveNetworkData(clientID, *buffer, 500)
;Renvoie dans la varaible 'packet' la chaine contenue dans le buffer
packet.s = PeekS(*buffer,MemoryStringLength(*buffer))
;Compte le nombre de bloc de coordonnées
bloc = CountString(packet,"#")
;Supprime le buffer
FreeMemory(*buffer)
EndIf
EndIf
;SI il y a au moins un bloc, ALORS faire la bloucle qui récupère les coordonnées de chaque bloc
If bloc > 0
For k=1 To bloc
ssbloc = StringField(packet,k,"#") ; extrait le bloc numéro k
pos(1,ClientID) = Val(StringField(ssbloc,1,";")) ; change x avec la coordonnée X du bloc k
pos(2,ClientID) = Val(StringField(ssbloc,2,";")) ; change y avec la coordonnée Y du bloc k
pos(3,ClientID) = Val(StringField(ssbloc,3,";"))
pos(4,ClientID) = Val(StringField(ssbloc,4,";"))
pos(5,ClientID) = Val(StringField(ssbloc,5,";"))
messg$ = StringField(ssbloc,6,";")
DisplaySquare() ; Affiche le carré rouge
Next
bloc=0 ; une fois la boucle terminée -> réinitialisation du compteur de blocs à 0
EndIf
Until EventID = #PB_Event_CloseWindow
If mode = "-server"
CloseNetworkServer() ; si le prog est en mode "server", alors fermer le server
ElseIf mode = "-client"
CloseNetworkConnection(cnxID) ; si le prog est en mode "client", alors fermer la connexion client
EndIf
End ; Terminaison du programme.