IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Gestion Jeu Réseau


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Gestion Jeu Réseau
    Bonsoir à tous !
    J'ai conçu un jeu dans lequel je voudrai mettre l'option 'réseau'. Effectivement, je voudrai proposer un mode multi-joueur en réseau local. Je sais comment réaliser un serveur et un client. La seule chose que je voudrai, c'est votre opinion sur la manière dont je vois la chose. Peut être que vous me conseillerez autre chose nettement plus efficace !

    Voici un petit explicatif des échanges serveur/clients :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SERVEUR -> En attente de connexion de deux joueurs
     
    CLIENT 1 et 2 -> Se connecte au serveur et se mettent en attente d'une réponse du serveur. Le serveur va choisir au hasard le joueur qui commencera la partie
     
    SERVEUR -> Deux clients connectés donc :
                                -Choix aléatoire d'un joueur (retourne aux clients une valeur booléenne, true pour un client et false pour l'autre client).
     
    CLIENT -> Le joueur recevant la valeur :
                       -true : Joue ! Il commence la partie
                       -false : Se met en attente d'une réponse du serveur (recevoir données)
     
    Le joueur1 joue ! Il envoie des coordonnées x et y (entier int) au serveur, qui lui les enverra au client en attente (joueur2). Le joueur 1 se met à sont tour en attente.
     
    SERVEUR -> Reçoit coordonnées x et y et les transmets au joueur2
     
    CLIENT 2 -> renvoie une coordonnée booléenne (true/false) au serveur pour signaler s'il a était touché ou non.
     
    SERVEUR -> Transmet au joueur1
     
    CLIENT 2 -> Joue à sont tour
     
    etc ...

    Que pensez de cette méthode pour le transfert de données pendant un partie multi-joueur ?

    Autres questions :

    Le serveur ou le ce client recevra des valeurs soit de type entier (int) soit booléen (bool). Sachant que l'on utilise la méthode connect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(nouveauClient, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
    Le problème c'est que dès que l'on reçoit des données on va dans la fonctionne donneesrecues().

    Donc mes deux questions sont :
    -Une fois les données reçues comment peut on reconnaitre le type (bool ou int) des données reçues ? Car si c'est une réponse bool on ira pas dans la même méthode que celle avec les coordonnées (int)

    -A propos des deux coordonnées x et y. Peut on envoyer deux variable int en même temps ?

    Merci d'avance

    Cordialement

    Ju

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    -Une fois les données reçues comment peut on reconnaitre le type (bool ou int) des données reçues ? Car si c'est une réponse bool on ira pas dans la même méthode que celle avec les coordonnées (int)

    -A propos des deux coordonnées x et y. Peut on envoyer deux variable int en même temps ?
    les questions que tu te pose sont lié au fait que tu va devoir définir le protocole de communication entre tes clients et ton serveur.

    pour résumer tu vas devoir définir un grammaire qui te permette d'identifier clairement les informations transmises pour que l'entité qui lit le message comprenne ce que l’émetteur lui dit.


    normalement tu peux transmettre un peu tout et n'importe quoi....
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse jabbounet ! Mais pourrais-tu m'aiguiller ? Car je ne sais ou me renseigner ? Je ne sais pas comment procéder ! Je suis débutant encore je ne connais pas tout

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    L'envoi se fait via send, et comme tu le vois ça envoit uniquement du char*, un buffer
    La signification de ce buffer est à la discrétion de l'application qui les reçoit et envoie
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Re bonjour.
    J'ai oublié de vous préciser, pour mon projet je suis obligé de travailler sur Qt. Existe t-il une fonction sur Qt permettant de différencier le type des données reçu ? ou autre

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    La question est mal posée. Ce n'est pas à Qt de déterminer le type des données reçues, mais à toi. C'est le sens du message de Bousk.

    Autrement dit, il faut que tu définisses le protocole. Le protocole c'est, pour faire simple, la composition des trames. Il y a une infinité de façons de procéder, moi je te conseille une méthode issue des protocoles de l'industrie, à savoir: chaque trame commence par un entier qui définit le type de trame. En fonction de ce type de trame, les parseurs (il y en a un pour le client et un pour le serveur), va savoir la façon dont il doit interpréter la trame.

    Prenons, par exemple, la réponse de ton serveur à une demande de connexion. On l’appellera CON_RESP (connection response. Typiquement, tu aura une partie de code commune au client et au serveur dans lequel tu auras quelque chose du style: const unsigned int CON_RESP = 1; ). Disons qu'elle contient, dans l'ordre:
    1. un entier qui détermine le type de la trame
    2. un booléen d'acceptation. si false, ça veut dire que, pour une raison ou une autre, le serveur n'accepte pas ce client, par exemple parce que la partie est déjà pleine.
    3. un booléen qui détermine si c'est au client de jouer ou non. Moi j'aurais utilisé une autre méthode mais partons là-dessus.
    4. une chaine de caractère, terminée par un caractère spécial, qui donne le nom ou pseudo du joueur adverse. J'ajoute cette donnée juste pour avoir un cas où on a des données de types différents dans la même trame.

    Côté client, on reçoit la trame. On sait que dans tous les cas (c'est le protocole), la première valeur est un entier. On consomme donc cet entier, et en fonction de sa valeur, on effectue le parsing qui correspond. Dans notre exemple, ce sera un CON_RESP. Donc on sait qu'on va avoir ensuite, dans l'ordre, 2 booléens et une chaine de caractère terminée par un caractère spécial. Pour chaque type traité, c'est à toi de faire les casts/traductions qui correspondent.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour r0d,

    Merci pour cette réponse claire et précise ! J'ai compris la méthodologie !
    Je ne pensais pas que l'on pouvait faire cela en C++.
    Sur quoi dois-je me renseigner pour réaliser ses trames ?

    Cordialement

    Ju

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par rastaniete Voir le message
    Sur quoi dois-je me renseigner pour réaliser ses trames ?
    ça par contre, c'est à l'API réseau de s'en occuper, pas à toi. Dans ton cas ce sera Qt, donc je ne peux pas t'aider car je ne connais pas Qt.

    En gros, la trame c'est un tableau de bits qui transite entre le client et le serveur. Cette trame est encapsulée dans tout un tas de choses, des données spécifiques aux protocoles de transfert (TCP, UDP, HTTP, etc.). Mais tout ça toi tu n'as pas à t'en préoccuper. Donc, je ne connais pas Qt, alors je ne peux pas te dire précisément, mais tu dois pouvoir lui "dire", en gros: dans ma trame, je met un int, un booléen, et une chaîne de caractère terminée par un caractère spécial, et je l'envoie au client. Et côté client, tu doit pouvoir lui "dire", lors de la réception de la trame: cette trame contient, dans l'ordre, un int, un bool, etc.

    A la limite, si tu as besoin de plus de précision, tu peux aller demander ça sur le forum Qt. Tu peux aussi te renseigner sur les socket, car c'est probablement ça que tu vas utiliser pour les communications client/serveur. Or je sais que Qt propose une classe Socket.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci à toi r0d pour toutes ses explications ! Je te remercie !
    Par contre là je rencontre un gros problème qui devient important à résoudre dans mon jeu. Je vais donc mettre ça de côté et y revenir par la suite. Je me renseignerai sur le forum Qt et vous ferez part de ce que j'ai pu trouvé

    Bien cordialement

    Ju

Discussions similaires

  1. Jeu réseau UDP
    Par alsahot68 dans le forum Débuter
    Réponses: 1
    Dernier message: 04/05/2008, 19h35
  2. passage d'un jeu en local en jeu réseau
    Par didux67 dans le forum Langage
    Réponses: 2
    Dernier message: 22/01/2008, 19h29
  3. Problème jeu réseau - media center
    Par AsTeR_ dans le forum Windows XP
    Réponses: 1
    Dernier message: 03/12/2006, 13h07
  4. jeu réseau: synchronisation des latences
    Par orelero dans le forum Développement
    Réponses: 2
    Dernier message: 19/04/2006, 11h32
  5. Jeu réseau
    Par goutbouyo dans le forum Développement
    Réponses: 7
    Dernier message: 28/11/2004, 19h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo