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

Développement 2D, 3D et Jeux Discussion :

Quelle structure pour la représentation ?


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut Quelle structure pour la représentation ?
    Salut à toutes et à tous,

    Il y a quelque chose qui me chiffonne, dans la programmation graphique. Alors que je me lance dans le développement d'un petit jeu de type client serveur, je me heurte à cette question qui me taraude depuis des années...

    Mon jeu, ou plutôt son état, est représenté par la classe GameState, qui contient toutes les infos et méthodes nécessaires. Ce GameState sera manipulé par le serveur, et ses modifications retransmises aux clients pour qu'ils aient une version à jour.

    Du coup, je n'ai pas la moindre envie que GameState contienne la moindre information par rapport à la représentation graphique des objets. Ce serait mélanger les concepts.

    Alors dans mon client, qui va faire un rendu sur un JPanel de ce GameState et des objets qu'il contient (joueurs, projectiles, objets sur le terrain...), quelle est la meilleure manière pour faire la correspondance entre les objets et leur représentation graphique ?

  2. #2
    screetch
    Invité(e)
    Par défaut
    un serveur et un client sont souvent deux executables différent, il se pourrait que le mieux soit d'avoir une classe sur le serveur différente de la classe sur le client.

    une info sur la manière dont notre boite (pro) gérait cela: pour chaque type d'objet, il y avait 3 classes: PlayerCommon, PlayerServer, PlayerClient
    ProjectileCommon, ProjectileServer, ProjectileClient... etc etc

    c'est un assez mauvais design au final (duplique beaucoup de code mine de rien) mais ca marche.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 536
    Points
    219 536
    Billets dans le blog
    124
    Par défaut
    Bonjour,

    Pour lié la réprésentation graphique de son modèle (bah oui, car il semble bien que l'on s'approche d'un MVC ici (le truc plaçable partout )), il suffit juste d'avoir une méthode draw (et tout ce qui va avec) dans l'objet. Enfin, c'est ce que je fais et que j'aurais refait. Sinon, on peut dire encore, le World, a une méthode draw, il recevra tout les objets et les affichera lui même (à partir d'une image + position, ou autre, que tout objets contiendra).
    Après, on peut toujours envisager de faire deux classes différentes pour l'objet (PlayerView ; PlayerModel) mais je trouve cela lourd (et cela fait en sorte qu'il y a une trop forte séparation ... du coup, on irai même à faire un troisième Player qui contiendrai View et Model ...

    J'espère que je n'ai pas répondu à coté de la plaque .... et que cela est compréhensible.

    Sinon, il faut savoir que le server s'en fout complétement de la View ... du coup, il ne fera jamais appel aux méthodes draw() ou autre (mais les cachés pour autant serait peut être une erreur, car, disons que en mode debug, ce serait drole de voir ce que le serveur voit ...)
    Et puis, le mieux c'est d'utiliser les mêmes classes cotés serveur et client (car du code dupliqué c'est moche).

  4. #4
    screetch
    Invité(e)
    Par défaut
    en même temps il semble que tes classes aient beaucoup de responsabilités et c'est sans doute pour ca que tu as du mal a les séparer.
    si un objet a une methode draw alors il sait faire au moins deux choses (il est un objet du monde et il est un objet graphique)
    et si le game manager a une méthode draw alors il sait faire trop de choses (il sait deplacer les objets du monde, et il sait les dessiner)

    je verrai plutôt moins de fonctionnalité dans le game manager, ca aiderait a retirer l'affichage du serveur.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 536
    Points
    219 536
    Billets dans le blog
    124
    Par défaut
    D'un coté, faire une forte séparation est un peu extrème de mon point de vue (je veux dire, cas de deux classes). Je ne sais plus trop comment j'ai fait la dernière fois ... :s et je n'ai pas le code sous la main pour m'en rappeler.

    Et puis je doute de l'existence d'un design parfait ...

  6. #6
    screetch
    Invité(e)
    Par défaut
    je ne veux pas dire deux classes une pour le serveur et une pour le client (j'ai dit plus haut que c'était une mauvaise idée au final, bien que ca marche)
    mais plutôt d'être sûr que le concept de "dessiner" n'est ni:
    * dilué dans tout le code
    * ni groupé dans une classe qui a trop de fonctionnalités

    ce qui est valable d'ailleurs pour toute fonctionnalité.

    après pour ne pas dessiner, il te suffit de ne pas créer l'instance de l'objet qui dessine

    une sorte de DrawManager que tu n'es pas obligé de créer, au lieu d'avoir un GameManager qui sait dessiner


    et même si le design parfait n'existe pas, ce n'est pas une raison pour se contenter de tout cochonner

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 536
    Points
    219 536
    Billets dans le blog
    124
    Par défaut
    Citation Envoyé par screetch Voir le message
    et même si le design parfait n'existe pas, ce n'est pas une raison pour se contenter de tout cochonner
    Je n'ai jamais voulu dire cela ... c'est juste que je ne vois pas directement les contraintes des différentes solutions ...
    (Et que je ne vois pas trop comment faire autre chose, pour ne pas avoir une classe mastondonte, ou des classes avec du draw (si ce n'est pas draw, c'est la posiution + représentation graphique (des vertes / images et autres))

  8. #8
    screetch
    Invité(e)
    Par défaut
    (je ne voulais pas te critiquer personnellement, c'était une remarque très générale hein)

    en fait la facon dont j'ai fait ca c'était d'avoir une classe Entité qui contient un Visual, qui lui-même contient une description de mesh, une description de vertex shader et une description de pixel shader (et eventellement, des descriptions de textures, ou des bidules comme ca)

    Lorsqu'on veut faire un rendu, on demande a toute les entités quel est leur visual, et a partir des descriptions, on charge les "vrais" mesh, textures et shaders.
    Par exemple, une description de shader est en fait presque un shader, mais pas compilé; une description de texture serait plutôt un nom de fichier, encore qu'il est possible d'avoir des textures "procédurales" et de les générer a la volée), une description de mesh est un simple nom de fichier.


    L'objet qui affiche, ou qu'il soit, est responsable pour charger les objets a partir de leurs descriptions, et les afficher. Si il n'y a pas d'objet qui affiche, les descriptions ne sont simplement pas chargées et rien n'est affiché.
    Un autre truc sympa; si il y a deux objets qui savent charger et afficher (un OpenGL et un DirectX, par exemple), rien n'empêche d'avoir les deux, ils chargeront tous les deux a partir des descriptions, tout sera dupliqué et afficher deux fois dans deux fenêtres différentes.
    On a ainsi un design assez simple, la barrière c'est la limite entre la description de la donnée et la donnée. Et il n'y a qu'une respnsabilité par objet!

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 536
    Points
    219 536
    Billets dans le blog
    124
    Par défaut
    Citation Envoyé par screetch Voir le message
    (je ne voulais pas te critiquer personnellement, c'était une remarque très générale hein)
    Bien sur que non. Juste que je savais que je rentrais dans la catégorie des personnes crades et que je cherche à améliorer ce genre de points

    en fait la facon dont j'ai fait ca c'était d'avoir une classe Entité qui contient un Visual, qui lui-même contient une description de mesh, une description de vertex shader et une description de pixel shader (et eventellement, des descriptions de textures, ou des bidules comme ca)

    Lorsqu'on veut faire un rendu, on demande a toute les entités quel est leur visual, et a partir des descriptions, on charge les "vrais" mesh, textures et shaders.
    Par exemple, une description de shader est en fait presque un shader, mais pas compilé; une description de texture serait plutôt un nom de fichier, encore qu'il est possible d'avoir des textures "procédurales" et de les générer a la volée), une description de mesh est un simple nom de fichier.


    L'objet qui affiche, ou qu'il soit, est responsable pour charger les objets a partir de leurs descriptions, et les afficher. Si il n'y a pas d'objet qui affiche, les descriptions ne sont simplement pas chargées et rien n'est affiché.
    Un autre truc sympa; si il y a deux objets qui savent charger et afficher (un OpenGL et un DirectX, par exemple), rien n'empêche d'avoir les deux, ils chargeront tous les deux a partir des descriptions, tout sera dupliqué et afficher deux fois dans deux fenêtres différentes.
    On a ainsi un design assez simple, la barrière c'est la limite entre la description de la donnée et la donnée. Et il n'y a qu'une respnsabilité par objet!
    ça semble bien sympa
    Et qu'en est il de la partie modèle de l'entité ? Elle contient une classe Model ?

  10. #10
    screetch
    Invité(e)
    Par défaut
    tu veux dire Modèle comme dans MVC?
    ce n'est pas vraiment basé sur MVC (qui est plutôt orienté objet) ici c'est orienté donnée. Je ne sais pas si ca a vraiment un nom.

    L'entité est une description, contient les descriptions des différents composants (une description de la physique, une description du visuel, etc)
    cette description est constante au cours du temps (par exemple pas besoin de l'enregistrer lors de la sauvegarde de la map, pas besoin de la sérialiser sur le réseau)
    oui bon du coup Entité est un très mauvais nom, mais disons que la cette classe est un type d'objet, pas un objet)

    Le monde n'est pas composé de ces entités, mais le monde est une base de donnée géographique d'objets mobiles, et de leurs propriétés.
    Le moteur physique prend en entrée ce monde, et donne en sortie une copie de ce monde ou tous les objets ont été deplacés, en fonction de leurs propriétés visuelles
    Le moteur de rendu prend en entrée le monde, descend dans chaque case et affiche a leur position les objets, en fonction de leur propriétés visuelles

    et c'est ce monde qu'il faut envoyer sur le réseau, et qu'il faut sauvegarder lors d'une sauvegarde =) (et recharger plus tard)

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 536
    Points
    219 536
    Billets dans le blog
    124
    Par défaut
    J'ai pas trop compris l'histoire d'ou est la position des objets.

    Donc, votre Entity, c'est juste une instance des objets que l'on charge ... je veux dire par là ... ce n'est pas la peine de les sauvegarder car ce sont des objets du monde ?
    Mais alors pourquoi on ne les passe pas par le réseau ? Notamment pour le partage du monde entre joueur ?

    Model -> Dans le sens MVC certes, mais aussi dans le sens, c'est où que l'on met les informations sur la position / état et autre ... de nos objets du jeu ?

  12. #12
    screetch
    Invité(e)
    Par défaut
    hmmm disons que Entity est le "type" de l'objet, en quelque sorte, il ne contient que sa description
    et Mobile (c'est le nom de ma classe) est l'état volatile d'une instance de cette entité (les noms sont sûrement mal choisis et pourraient être inversés)
    Mobile contient:
    * Entity, le type,
    * position
    * état volatile a sérialiser, soit sur sauvegarde soit sur le réseau, sans doute en fonction de l'entité elle même (par exemple les points de vie ou kekchose comme ca, certains objets n'en ont pas)


    la "map" (ou le niveau ou n'importe quoi) est la liste de tous ces Mobiles
    lors du chargement ils sont ajoutés au moteur physique, et le moteur de rendu les dessine.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/09/2009, 17h07
  2. [Architecture] Quelle structure pour mon site ?
    Par bazounet21 dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 08/02/2008, 10h24
  3. Réponses: 3
    Dernier message: 31/10/2007, 15h14
  4. Réponses: 8
    Dernier message: 21/09/2007, 15h51
  5. Quelle technologie pour des représentations schématiques ?
    Par Jéjé81 dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 03/02/2006, 21h11

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