Thread et réseau
Publié : mer. 01/févr./2012 14:46
salut
J'ai commencé à regarder un peu comment ajouter une fonction style "réseau" LAN (ou via internet) pour mon jeu Arkeos Chronicle.
J'ai réussi, grâce à l'exemple client\server à créer un système de server + client, ajouter des clients, transférer des messages différents, faire des actions différents (client se connecte/client se déconnecte, client bouge, tchat...) et tout fonctionne très bien.
Ensuite, j'ai voulu ajouter des mobs depuis le serveur vers les clients. Du coup, pour que tout soit encore fluide, j'ai ajouté un thread pour les mobs.
Et là, je rencontre un petit problème.
Dans mon serveur, j'utilise des map() pour gérer mes joueurs, mobs, fx, etc..
Je mets un identifiant en tant que clef$ pour les joueurs. Cet identifiant, je l'obtiens lorsque je fais ceci dans le client :
Par exemple, cela renvoie 114586585 et hop, ça me fait mon identifiant du coté serveur, pour ce joueur.
Le problème est que j'utilise donc un thread pour les mobs. Lorsqu'un mob bouge, je dois envoyer aux clients qu'il a bougé (et les coordonnées).
Je fais donc ceci (pour le moment j'envoie en SendNetworkString, mais je passerai ensuite en data je crois que c'est mieux).
C'est juste pour tester le déplacement, hein
.
Et là, le server plante en me disant :
la map listclient() n'a pas d'élément courant.
Bon, je suppose que la raison est que cette map est partagée entre ce thread et le reste du programme (j'ai d'autres procédures qui utilisent :
Mais savez-vous comment on fait ce genre de chose dans un server\client : envoyer l'état des mobs par exemple aux clients dans un thread ?
J'imagine qu'il faut faire une "pile" et qu'on envoie les données toutes les 10ms par exemple, mais comment ?
Il faut peut être utiliser les mutex ou semaphore ?
Mais je ne comprends pas encore comment utiliser tout cela pour un server\client.
Si vous avez des informations ou des conseils supplémentaires sur l'organisation d'un code server\client, n'hésitez pas
.
J'ai commencé à regarder un peu comment ajouter une fonction style "réseau" LAN (ou via internet) pour mon jeu Arkeos Chronicle.
J'ai réussi, grâce à l'exemple client\server à créer un système de server + client, ajouter des clients, transférer des messages différents, faire des actions différents (client se connecte/client se déconnecte, client bouge, tchat...) et tout fonctionne très bien.
Ensuite, j'ai voulu ajouter des mobs depuis le serveur vers les clients. Du coup, pour que tout soit encore fluide, j'ai ajouté un thread pour les mobs.
Et là, je rencontre un petit problème.
Dans mon serveur, j'utilise des map() pour gérer mes joueurs, mobs, fx, etc..
Je mets un identifiant en tant que clef$ pour les joueurs. Cet identifiant, je l'obtiens lorsque je fais ceci dans le client :
Code : Tout sélectionner
OpenNetworkConnection(server$, Port)
Le problème est que j'utilise donc un thread pour les mobs. Lorsqu'un mob bouge, je dois envoyer aux clients qu'il a bougé (et les coordonnées).
Je fais donc ceci (pour le moment j'envoie en SendNetworkString, mais je passerai ensuite en data je crois que c'est mieux).
C'est juste pour tester le déplacement, hein

Code : Tout sélectionner
For i=0 To MapSize(mob())-1
If mob(Str(i))\cibleOK <= 0
mob(Str(i))\cibleOK = 500
mob(Str(i))\cibleX = mob(Str(i))\x + Random(50)-Random(50)
mob(Str(i))\cibley = mob(Str(i))\y + Random(50)-Random(50)
Else
mob(Str(i))\cibleOK -1
If mob(Str(i))\x >mob(Str(i))\cibleX
mob(Str(i))\x-1
ElseIf mob(Str(i))\x <mob(Str(i))\cibleX
mob(Str(i))\x+1
EndIf
If mob(Str(i))\y >mob()\cibley
mob(Str(i))\y+1
ElseIf mob(Str(i))\y <mob(Str(i))\cibley
mob(Str(i))\y-1
EndIf
If Mob(Str(i))\x = mob(Str(i))\cibleX And mob(Str(i))\y =mob(Str(i))\cibley
mob()\cibleOK = -1
EndIf
EndIf
If mob(Str(i))\cibleOK > 0 And Not(Mob(Str(i))\x = mob(Str(i))\cibleX And mob(Str(i))\y =mob(Str(i))\cibley)
If MapSize(ListClient())>0
ForEach ListClient()
FindMapElement(ListClient(), Str(ListClient()\id))
SendNetworkString(ListClient()\id , Str(#SM_MobMove)+";"+Str(mob(Str(i))\MapId)+";"+Str(mob(Str(i))\x)+";"+Str(mob(Str(i))\y)+";")
;Delay(15) ; utile ?
Next
EndIf
EndIf
Next i
la map listclient() n'a pas d'élément courant.
Bon, je suppose que la raison est que cette map est partagée entre ce thread et le reste du programme (j'ai d'autres procédures qui utilisent :
Code : Tout sélectionner
ForEach ListClient()
SendNetworkString(ListClient()\id ,...)
next
J'imagine qu'il faut faire une "pile" et qu'on envoie les données toutes les 10ms par exemple, mais comment ?
Il faut peut être utiliser les mutex ou semaphore ?
Mais je ne comprends pas encore comment utiliser tout cela pour un server\client.
Si vous avez des informations ou des conseils supplémentaires sur l'organisation d'un code server\client, n'hésitez pas
