j'ai essayé de faire marcher un dialogue entre PC, à 2J ca marche nickel, ils s'échange les infos correctement, mais le troisième joueur ne marche pas (et tous ceux qui suivent non plus) !
Il n'envoie aucun message au serveur, ne répond pas quand on lui parle, etc...(en essayant sur un meme PC)
Je post mon code, si vous voyez une erreure ou des trucs a optimiser:
Code : Tout sélectionner
; --------------------------------------------
; EXEMPLE RESEAU
; Un dialogue efficace
; --------------------------------------------
;- Initialisation de DirectX
InitNetwork()
InitSprite()
;- Activation des plugins et fonctions à déclarer
UsePNGImageDecoder()
Declare.l GetPlayer(clientid)
;- Variables
Title$="Un dialogue Efficace"
Flag= #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_SystemMenu
Win_X=640
Win_Y=480
#Win=0
IP$="127.0.0.7"
Port = 6832
*Buffer = AllocateMemory(1000)
ID=1
;- Ouverture de la fenetre
;OpenWindow(#Win,0,0,Win_X,Win_Y,Flag,Title$)
;OpenWindowedScreen(WindowID(#Win),0,0,Win_X,Win_Y,0,0,0)
;- Liste des joueurs
Structure Player
id.l
client.l
nom.s
x.l
y.l
pck.s
flag.l
EndStructure
NewList Player.Player()
;- Choix entre HOST et CLIENT
Nom$=InputRequester(Title$,"Votre nom ?","")
Choix:
CHOIX$=InputRequester(Title$,"HOST ou CLIENT","HOST")
Message$=InputRequester(Title$,"Votre message ?","")
;- Choix Host
If CHOIX$="HOST"
AddElement(Player())
Player()\id=1
Player()\nom=Nom$
Player()\pck=Message$
Player()\flag=1
;Creer la partie
CreateNetworkServer(Port)
;Boucle
Repeat
;Recupère les infos Event
SEvent = NetworkServerEvent()
If SEvent
;Recupère le client qui envoie
ClientID = NetworkClientID()
;Utilise un select
Select SEvent
Case 1 ;Un client se connecte
MessageRequester(Title$, "Un client s'est connecté !", 0)
;Ajoute un element dans la liste
AddElement(Player())
Player()\client=ClientID
Player()\id=ID
Player()\flag=0
ID=ID+1
Debug "Le client n°"+Str(Player()\id)+", a été ajouté !"
Case 2 ;Un client envoie des data
FreeMemory(*Buffer)
*Buffer = AllocateMemory(1000)
ReceiveNetworkData(ClientID, *Buffer, 1000)
Msg$=PeekS(*Buffer)
;Si c'est la 1ere fois qu'il parle
If StringField(Msg$,1,"*")="0"
SelectElement(Player(),GetPlayer(ClientID))
;On prend son nom
Player()\nom=StringField(Msg$,2,"*")
Player()\pck=StringField(Msg$,3,"*")
Player()\flag=1
flag=1
;Sinon
Else
SelectElement(Player(),GetPlayer(ClientID))
;On regarde ce qu'il a à dire
Player()\pck=StringField(Msg$,2,"*")
Debug Player()\nom +" send: "+Msg$
flag=0
EndIf
;On informe le client de ce qui se passe (=on répond)
For j=0 To CountList(Player())-1
SelectElement(Player(),j)
If j=0
;Si c'est nos propres infos, on les mets à jour
MsgToSend$=Str(flag)+"*"+Str(j)+"*"+Str(Player()\client)+"*"+Player()\nom+"*"+Message$+"*"
Else
;Sinon on envoie ce qu'on a
MsgToSend$=Str(flag)+"*"+Str(j)+"*"+Str(Player()\client)+"*"+Player()\nom+"*"+Player()\pck+"*"
EndIf
Debug "Send: "+MsgToSend$
SendNetworkString(ClientID,MsgToSend$)
Next j
;Debug "String: "+Msg$
Case 3 ;Un client envoie un fichier
MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
ReceiveNetworkFile(ClientID, "C:\TEST_Network.txt")
Case 4 ;Un client se déconnecte
SelectElement(Player(),GetPlayer(ClientID))
MessageRequester(Title$, Player()\nom+" s'est déconnecté !", 0)
;On supprime son element
DeleteElement(Player())
FirstElement(Player())
EndSelect
EndIf
;Rattrapage, si le joueur n'a rien envoyé automatiquement
For x=0 To CountList(Player())-1
SelectElement(Player(),x)
If Player()\flag=0
;On l'aborde
SendNetworkString(Player()\client,"Reveille toi !")
Debug "Rattrapage !"
EndIf
Next x
Until DO=1
;- Choix Client
ElseIf CHOIX$="CLIENT"
;Rejoind la partie
ConnectionID = OpenNetworkConnection(IP$,Port)
;Donne notre nom et lance le processus de discution (ce message est le déclancheur)
SendNetworkString(ConnectionID,"0*"+Nom$+"*"+Message$+"*")
;Boucle
Repeat
;Recupère les infos Event
SEvent = NetworkClientEvent(ConnectionID)
If SEvent
;Utilise un select
Select SEvent
Case 2 ;le serveur envoie des data
FreeMemory(*Buffer)
*Buffer = AllocateMemory(1000)
ReceiveNetworkData(ConnectionID,*Buffer, 1000)
Msg$=PeekS(*Buffer)
;On trie les infos que le serveur à envoyé
ClientID=Val(StringField(Msg$,2,"*"))
flag=Val(StringField(Msg$,1,"*"))
If flag=1
;Si on n'avais encore jamais rencontré ce joueur on lui créer un élément
AddElement(Player())
Player()\client=Val(StringField(Msg$,3,"*"))
Player()\nom=StringField(Msg$,4,"*")
Player()\pck=StringField(Msg$,5,"*")
Debug "UN NOUVEAU JOUEUR A ETE CREER"
Else
;Bah sinon on met à jour ses infos
SelectElement(Player(),GetPlayer(ClientID))
Player()\pck=StringField(Msg$,5,"*")
EndIf
Debug Player()\nom +" dit: "+Player()\pck
;Et on répond
SendNetworkString(ConnectionID,"1*"+Message$+"*")
Case 3 ;le serveur envoie un fichier
MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
ReceiveNetworkFile(ClientID, "C:\TEST_Network.txt")
EndSelect
EndIf
Until DO=1
;- Choix Erreur
Else
MessageRequester(Title$,"Tappez HOST ou CLIENT !")
Goto Choix
EndIf
;Trouve l'ID du joueur (l'ID de l'élement en fait) grace à son ClientID
Procedure.l GetPlayer(clientid)
For x=0 To CountList(Player())-1
SelectElement(Player(),x)
If Player()\client=clientid
Break
EndIf
Next x
ProcedureReturn x
EndProcedure
