Jeu en reseau

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Jeu en reseau

Message par Thyphoon »

maintenant que j'ai mis les mains dans les commandes reseau, J'ai commencé a programmé un tout petit jeu en reseau. histoire de comprendre le fonctionnement.
Je trouve ça étonnamment facile ! Merci PB !

Pour l'instant j'arrive a ce que tout les clients se connecte au serveur et a ce que le serveur retourne la liste de tout ceux connecté des qu'il y a une nouvelle connexion !

Mais j'ai 2 Questions

1)Y a t'il un moyen de trouver l'IP automatiquement du server comme dans certain jeu ou on voit automatiquement la liste des parties en cours sur le reseau local sans passer part un serveur exterrieur qui les listes ?

2)Comment ça doit se passer l'envoie des informations durant le jeu !
chaque client envoie ses données au serveur et a chaque fois que le serveur reçois des données il renvoie a tout les autres les données qu'il a reçu ?
Faut il gerer le temps pour l'envoie des informations pour eviter une saturation si une des machines est trop puissante ? bref je ne sais pas trop comment il faut procédé.

pas besoin de code je cherche juste un principe !! :)

merci d'avance
Anonyme

Message par Anonyme »

1)Y a t'il un moyen de trouver l'IP automatiquement du server comme dans certain jeu ou on voit automatiquement la liste des parties en cours sur le reseau local sans passer part un serveur exterrieur qui les listes ?
BDD et script php font largement l'affaire.
2)Comment ça doit se passer l'envoie des informations durant le jeu !
chaque client envoie ses données au serveur et a chaque fois que le serveur reçois des données il renvoie a tout les autres les données qu'il a reçu ?
Faut il gerer le temps pour l'envoie des informations pour eviter une saturation si une des machines est trop puissante ? bref je ne sais pas trop comment il faut procédé.
Oui, tu dois gerer le temps, il est inutile de bombardé la bande passante
d'infos qui parfois s'avèrent inutiles. Pour ma part, je stocke toute les infos dans une "pile" et toute les 25/50 ms j'envois la pile sur le reseau.

Pour les positions des joueurs, afin d'évité un saccadement d'affichage coté client, je n'envois pas les positions brute (x,y)
j'envois l'état des touches,
si touche avance = 1
JoueurAvance = 1
fin si
j'envois que JoueurAvance dans ma pile (1 byte contre 4 pour une position sur un axe (x ou y) )
de l'autre coté (serveur ou client) il n'a plus qu'a interprété ce qu'il recois
cela n'empeche pas d'envoyer les x & y tout les 100ms afin de récuperer le décalage qu'il peut y avoir entre les machines.

Voila, c'est à peu près tout ce que je peut te dire

:wink:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci beaucoup c'est très interessant ! tu m'a donné des pistes et c'est ce que je voulais ... merci beaucoup !! :)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

voici mon premier essais !!
File:1->NetworkGame.zip
Image



Donc 2 programme (Server_Main.PB) pour le serveur a demarrer en premier et (Client_Main.Pb) le jeu lui même ... Si le serveur n'est pas demarrer le jeu quitte automatiquement... le Serveur affiche son adresse IP

1) Demarrer le serveur
2) Demarrer les clients (sur différents pc en reseau local si vous avez...mais ça peu être aussi sur la même machine que le serveur) rentrez l'Adresse IP du serveur et le nom.Le premier client demarrer, est celui qui pourra demarrer le jeu.
3) Appuyer sur espace sur le premier client demarrer pour demarrer le jeu
4) essayer sur tout les clients
fleche gauche et droite, LeftCrt pour la poussé et escape pour quitter !


Voilà qu'en pensez vous ? je trouve que ça s'accade si quelqu'un a des idées pour améliorer la communication reseau. Et même pour le comportement du vaisseau si vous avez des améliorations pour rendre ce petit jeu de gravité réalise (Quand je si jeu...j'exagère un peu car pour l'instant le vaisseau ne fait que se deplacer)

Voilà ! Qu'en pensez vous ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

J'ai vu qu'il y avait déjà 5 personnes qui avait testé ? Alors ? ça donne quoi chez vous ? ça marche ? ça marche pas ? c'est pourrie ? :P
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Je ne suis un pro du NetWork pour tout dire, d'ailleurs ton code me permet
de m'y mettre un peut (tout doucement)

J'ai lancé donc le serveur, puis le client. Le serveur reconnais bien la connexion
du client. Mais je n'ai poussé plus loin... pour le moment :wink:

au connaisseur de te donner les vrai défauts...
Force et sagesse...
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

tmyke a écrit :Je ne suis un pro du NetWork pour tout dire, d'ailleurs ton code me permet
de m'y mettre un peut (tout doucement)

J'ai lancé donc le serveur, puis le client. Le serveur reconnais bien la connexion
du client. Mais je n'ai poussé plus loin... pour le moment :wink:

au connaisseur de te donner les vrai défauts...
Merci tmyke ! C'est vrai que c'est moins facile a developper un jeu en reseau lolllllllll. Chez moi ça marche....mais j'ai des vibrations dans la position des autres vaisseau. Bref c'est pas encore parfait ! Faut peut être que je synchronise la vitesse sur les 2 machines .... je vais voir ça de suite !!
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

Salut
j'ai pas encore regarder dans le detail,mais, faisant actuelement un jeu online, j'ai été confrtonter a ce probleme....
je trouve que ça s'accade si quelqu'un a des idées pour améliorer la communication reseau
meme en augmentant la comunication entre le serveur et le client, il y aura toujours un sacadement lors du deplacement des sprite, pour remedier a ce probleme de sacadement j'utilise un code pour depacer progressivement le sprite de l'ncienne position a la nouvelle, je calcul la distance entre les deux point et plus la distance est grande plus la vitesse est grande, pour recuprer le "retard" sur la position du perso. ensuite tu calcul la distance entre le oint de depart et celui d'arivé sur les axe X et Y pour savoir dans quelle sens doit etre orienter le sprite.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci Scaraber !

Je vais essayer de faire pareille !
Tient une question ...Est ce que lorsque tu envoie des données au serveur (ou vis versa) tu renvoie les valeurs pour voir si il n'y a pas eu d'erreur durant le transfert ? En gros tu fait une verification des données envoyé ?

merci en tout cas
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

Je ne verifie pas le bon arrivage des données, normalement tout arive comme apres les deux probleme qui peuvent survenir sont, le manque de mémoire pour recevoir les données, un probleme lors de la lecture de tout les paquet. je regarderais ton code des que j'aurais fini de recoder un truc
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

scaraber a écrit :Je ne verifie pas le bon arrivage des données, normalement tout arive comme apres les deux probleme qui peuvent survenir sont, le manque de mémoire pour recevoir les données, un probleme lors de la lecture de tout les paquet. je regarderais ton code des que j'aurais fini de recoder un truc
Merci je veux bien...car j'ai essayer de coder ce dont tu parlais mais je seche...
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

Voici mon code qui me permet de gerer sa:
Il ets pas commenté mais comme je vais bientot recoder le client.... une fois qua j'aurais fini mon editeur mon clien tet mon serveur (version stable et commenté) je posterait le tout sur le forum sinon ajoute moi sur msn

Code : Tout sélectionner

Procedure GestionJoueurs()
  For JoueurID=0 To 100
    If DataJoueursReception(JoueurID)\action=0 Or DataJoueursReception(JoueurID)\action=3
      If DataJoueursReception(JoueurID)\visible=1
        DistanceX=MaxF(DataJoueursReception(JoueurID)\x,DataJoueursReception(JoueurID)\newx)-MinF(DataJoueursReception(JoueurID)\x,DataJoueursReception(JoueurID)\newx)
        DistanceY=MaxF(DataJoueursReception(JoueurID)\y,DataJoueursReception(JoueurID)\newy)-MinF(DataJoueursReception(JoueurID)\y,DataJoueursReception(JoueurID)\newy)
        Distance=Pow(DataJoueursReception(JoueurID)\newx-DataJoueursReception(JoueurID)\x,2)+Pow(DataJoueursReception(JoueurID)\newy-DataJoueursReception(JoueurID)\y,2)
        DeplacementJoueur=0
        If Distance>9
          Vitesse.f=1/4
          VitesseAnimation=1
        ElseIf Distance>5
          Vitesse.f=1/5
          VitesseAnimation=2
        ElseIf Distance>2
          Vitesse.f=1/6
          VitesseAnimation=3 
        Else
          Vitesse.f=1/9
          VitesseAnimation=4
        EndIf
        If DataJoueursReception(JoueurID)\newx<DataJoueursReception(JoueurID)\x-1/6
          DataJoueursReception(JoueurID)\x-Vitesse
          DeplacementJoueur=1
          If DistanceX>DistanceY
            DataJoueursReception(JoueurID)\Orientation=3
          EndIf 
        ElseIf DataJoueursReception(JoueurID)\newx>DataJoueursReception(JoueurID)\x+1/6
          DataJoueursReception(JoueurID)\x+Vitesse
          DeplacementJoueur=1
          If DistanceX>DistanceY
            DataJoueursReception(JoueurID)\Orientation=1
          EndIf
        EndIf
        If DataJoueursReception(JoueurID)\newy<DataJoueursReception(JoueurID)\y-1/6
          DataJoueursReception(JoueurID)\y-Vitesse
          DeplacementJoueur=1
          If DistanceY>DistanceX
            DataJoueursReception(JoueurID)\Orientation=0
          EndIf
        ElseIf DataJoueursReception(JoueurID)\newy>DataJoueursReception(JoueurID)\y+1/6
          DataJoueursReception(JoueurID)\y+Vitesse
          DeplacementJoueur=1
          If DistanceY>DistanceX
            DataJoueursReception(JoueurID)\Orientation=2
          EndIf
        EndIf 
      EndIf
      If DeplacementJoueur=1
        DataJoueursReception(JoueurID)\animation+1
        If DataJoueursReception(JoueurID)\animation>VitesseAnimation
          DataJoueursReception(JoueurID)\frame+1
          DataJoueursReception(JoueurID)\animation=0
        EndIf
        If DataJoueursReception(JoueurID)\frame>2
          DataJoueursReception(JoueurID)\frame=0
        EndIf
      EndIf
    EndIf
    If DataJoueursReception(JoueurID)\action=1 Or DataJoueursReception(JoueurID)\action=2
      DataJoueursReception(JoueurID)\animation+1
      If DataJoueursReception(JoueurID)\animation>6
        DataJoueursReception(JoueurID)\frame+1
        DataJoueursReception(JoueurID)\animation=0
      EndIf
      If DataJoueursReception(JoueurID)\frame>2
        DataJoueursReception(JoueurID)\frame=0
        DataJoueursReception(JoueurID)\action=0
      EndIf
    EndIf
  Next
EndProcedure
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

Explication en images...en esperant que tu saisisse le principe, situ comprend pas hesite pas a poser des question
Image
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

scaraber a écrit :situ comprend pas hesite pas a poser des question
Image
lol :wink: ou alors essaye un correcteur hortograffic :P
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

Hello, desolé pour l'orthographe... , bon je mettrait bientot a disposition les code de mon jeux, je vais bientot tout reprendre a zero, pour des gros changement, sur l'architecture Client<>Serveur, qui fait quoi(c'est toujours le probleme) et pour le changement du systeme de gestion des map.
a+
Scaraber
Répondre