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 :

[conception] Gerer les interactions ente objets


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut [conception] Gerer les interactions ente objets
    Salut,
    Mon probleme ne se refere a aucun langage de programmation en particuler, j'ai donc prefere poster ici.
    A chaque fois que j'essaye de creer un jeu video(3D ici), je me heurte a un probleme bien particulier: Comment gerer les interactions entre mes objets?
    Avec un exemple ca sera plus clair, imaginons un jeu de tir (quake like)
    Le joueur est un objet, il peut tirer des "roquettes"
    l'ennemi est un objet
    la "roquette" est un objet

    J'ai un moteur physique qui detecte les collisions. Pour lui, le "joueur", "ennemi", et "roquette" sont de simple objets.
    Comment faire en sorte que l'ennemi meurt lorsqu'une roquette le touche? Sachant que le moteur physique ne connait pas le type exact de chaque objet.

    J'ai pense a creer une fonction du genre notify_collision_with(Objet* obj) dans la classe Objet, mais le meme probleme se pose. L'Objet lui meme ne connait pas le type de "obj"

    merci d'avance
    dommage

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par bachir006 Voir le message
    J'ai pense a creer une fonction du genre notify_collision_with(Objet* obj) dans la classe Objet, mais le meme probleme se pose. L'Objet lui meme ne connait pas le type de "obj"
    Et les class templates en C++ à quoi cela sert-il ?
    C'est pour la décoration ?
    Ceci dit la question demeure pertinente

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Et les class templates en C++ à quoi cela sert-il ?
    C'est pour la décoration ?
    Ceci dit la question demeure pertinente
    J'ai jamais dit que je comptais utiliser le C++(j'utilise Python plutot)
    et puis en quoi les template peuvent me servir dans ce cas precis?
    dommage

  4. #4
    Membre éprouvé

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 1 116
    Points
    1 116
    Par défaut
    Et en définissant une variable myClassName dans chaque classe où tu en as besoin ?

    Je suis tombé sur un problème similaire lors de la conception d'un moteur pour système multi-agents : le moteur avait besoin de connaître la classe d'un agent (n'importe lequel) en cours d'exécution, par exemple pour appeler tous les agents de la classe 'Toto'.

    La solution que nous avions retenu était d'initialiser un attribut "name" dans le constructeur de l'agent. La solution est simple et rapide à mettre en oeuvre. Le souci inhérent à cette implémentation est qu'il ne faut donc jamais oublier dans une classe (et dans les sous classes surtout) de rappeler manuellement l'accesseur de cet attribut dans le constructeur de la nouvelle classe, sinon une sous classe porte le nom de sa super classe (donc le programme marche mais la fonctionnalité est corrompue). Ce souci a été résolu en proposant un générateur de classes et en incluant de multiples mises en garde dans la documentation.

    Voilà je ne sais pas si ça peut t'aider =)
    [|]

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par bachir006 Voir le message
    J'ai jamais dit que je comptais utiliser le C++(j'utilise Python plutot)
    et puis en quoi les template peuvent me servir dans ce cas precis?
    il fallait préciser que tu utilises Python.
    Sinon si Python le permet tu peux faire une classe de base par exemple CProjectile et faire des classes héritées de cette classe de base.
    Mais avec Python cela me parait difficile..
    et puis en quoi les template peuvent me servir dans ce cas precis?
    Est-ce que tu connais le C++ ? Un template c'est un type générique

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    Oui je connais le C++, je connais les templates.

    je crois que tu n'as pas bien comrpis mon probleme.
    Toute collision N' engendre PAS le meme comportement
    Si l'ennemi entre en collision avec une maison, il doit changer de direction.
    Si l'ennemi entre en collision avec une roquette, il doit mourir.
    ...
    Comment prendre la decision exacte en fonction du type de l'objet que l'ennemi(dans cet exemple) entre en collision avec Si j'utilise un type generique?
    dommage

  7. #7
    Membre éprouvé

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 1 116
    Points
    1 116
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Est-ce que tu connais le C++ ? Un template c'est un type générique
    Oui mais son souci est qu'il veut pouvoir récupérer le type de l'objet genre "objet.type()", chose que les langages sans introspection comme le c++ ne permettent pas.

    A priori un template ne suffit pas parce qu'il faudrait qu'il obtienne et le type de l'objet significatif (le joueur) et le type de l'objet qui le touche (une roquette fais moins de dégats qu'une balle par exemple).

    De mémoire les templates permettent surtout d'avoir des méthodes qui marchent pour plusieurs types de classes (mais je suis pas spécialiste...).
    [|]

  8. #8
    Membre éprouvé

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 1 116
    Points
    1 116
    Par défaut
    Citation Envoyé par bachir006 Voir le message
    Oui je connais le C++, je connais les templates.

    je crois que tu n'as pas bien comrpis mon probleme.
    Toute collision N' engendre PAS le meme comportement
    Si l'ennemi entre en collision avec une maison, il doit changer de direction.
    Si l'ennemi entre en collision avec une roquette, il doit mourir.
    ...
    Comment prendre la decision exacte en fonction du type de l'objet que l'ennemi(dans cet exemple) entre en collision avec Si j'utilise un type generique?
    A mon avis le souci est à un niveau de conception. Il faut déjà séparer les réactions comportementales des réactions physiques.

    Par exemple, tous les objets pouvant rentrer en collision doivent hériter d'une classe "collisionnables" par exemple, qui inclurait éventuellement des sous classes : décor, animable, projectile, ...

    Ensuite quand une collision est détectée, si le type de l'objet qui heurte le joueur est de type "décor", alors on traite une collision avec un décor avec la méthode appropriée, si c'est un objet de type "projectile", on demande à l'objet de fournir son nombre de dégats et on l'inflige au joueur, par exemple :
    joueur.prendreDegats(objetEnCollision.degats());

    Pour ce qui est de récupérer un type, j'ai proposé une méthode dans un post au dessus.

    Il est aussi possible d'utiliser des notions d'évènements : lorsqu'une collision est détectée, celle-ci provoque l'émission par les deux objets d'un évènement "faireDommage(position, dommages, etc...);", et seul l'objet joueur est abonné à ces évènements. Donc il reçoit celui-ci et le traite.

    Il existe encore plusieurs solutions possibles je pense...
    [|]

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par bachir006 Voir le message
    Si l'ennemi entre en collision avec une maison, il doit changer de direction.
    Si l'ennemi entre en collision avec une roquette, il doit mourir.
    ...
    Comment prendre la decision exacte en fonction du type de l'objet que l'ennemi(dans cet exemple) entre en collision avec Si j'utilise un type generique?
    A ce moment-là une possibilité c'est de passer un "comportement" par exemple COLLISION_ROQUETTE à la classe du joueur et il agit en conséquence.
    C'est similaire à une machine à état ( Finite State Machine si je ne me trompe..)
    Cela tient de l'IA.
    Le livre de Matt Buckland notamment traite de ce sujet ( "Game Programming by Example")

  10. #10
    Membre actif
    Profil pro
    Directeur technique
    Inscrit en
    Juillet 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 107
    Points : 200
    Points
    200
    Par défaut
    Personnellement ( je ne dis pas que ce soit forcement la bonne technique, cela dépend beaucoup de ton contexte ) ce serait les objets qui passent le comportement au joueur.

    Comme le dis Mat.M tu collisionne un mur, le mur appelle la fonction "change direction" du joueur, ou celui-ci transmet un comportement ( une string "bouge-de-la" ) au moment propice

    Une balle transmettrai ainsi : "take damage 10"
    Une roquette : "take damage 100"

    etc ...

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    merci beaucoup pour vos reponses, j'ai de quoi faire avec tout ca.
    Sinon, j'ai entendu aussi parler de double dispatching, je vais voir ce que ca donne.
    dommage

  12. #12
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Si tu développes ton propre moteur physique tu peux définir une méthode abstraite que t'appelles par le moteur lors de ta collision. Ensuite soit par héritage, soit par interface t'implémentes ta méthode au niveau de ta classe définitive. (ou encore un système classique de callback via pointeur de fonction).

    (euh, mais en fait ça répond pas tout à fait à ta question de base, quoique...)
    Vive les roues en pierre

Discussions similaires

  1. [CR ?] gerer les propriétés des objets via les formules?
    Par Flamby38 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 25/06/2008, 17h01
  2. [Conception]gerer les divisions administratives
    Par Héni Haj dans le forum Modélisation
    Réponses: 4
    Dernier message: 17/04/2007, 19h56
  3. Réponses: 7
    Dernier message: 21/06/2006, 15h43
  4. comment gerer les types Objet(java)
    Par karray_ali dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 09/05/2006, 23h27
  5. [Conception] Gerer les dates et archives avec php
    Par Ronan.f dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 09/04/2006, 23h39

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