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

SFML Discussion :

Organisation du code / déplacement d'unités


Sujet :

SFML

  1. #1
    Invité
    Invité(e)
    Par défaut Organisation du code / déplacement d'unités
    Hello,

    je débute avec SFML et on peut même dire que je débute totalement dans la programmation d'applications multimédia. Je ne sais pas trop comment gérer les différents événements du «jeu».

    Ce n'est d'ailleurs pas vraiment un jeu car je souhaite tester pas mal de chose avant de me lancer véritablement dans un projet plus complexe. Pour le moment j'essaye d'implémenter les notions de déplacement et pathfinding, collisions, etc.

    Première étape, très simple, j'ai un objet, on va dire que c'est une «unité», représenté par un rectangle dans l'espace de jeu. Je souhaite tout simplement dire à cette unité de se déplacer vers un autre point. Je ne sais pas comment organiser le code. Comment mettre en adéquation la boucle d'événement et le déplacement de mon unité ? D'instinct j'ai pensé à créer une classe de déplacement, qui va contenir un tableau avec l'unité qui se déplace, son vecteur de déplacement, sa vitesse.

    Je ne suis pas contre un dégrossissement qui pourrait me permettre de démarrer dans la bonne direction (c'est le cas de le dire).

    Merci d'avance.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    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 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Il reste toujours compliqué de déterminer la bonne façon pour gérer ces entités. Je vais tout de même vous présenter une méthode qui à l'avantage d'être simple :

    Vous avez une boucle de jeu du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (jouerJeu) // Tant que l'utilisateur ne veut pas quitter
    {
       affiche();
       update();
    }
    (D'ailleurs, n'hésitez pas à lire cette discussion : http://www.developpez.net/forums/d13...-jeu-correcte/ )

    Dans la méthode update(), vous allez parcourir la liste de vos éléments et les mettre à jour un par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach (elements)
    {
      element.update();
    }
    et chaque élément va se déplacer suivant les propriétés associées.

    Maintenant, cela pose un problème. En effet, qu'en est t-il des collisions ? Doit-on les appliquer lorsque l'on effectue le déplacement (alors, si un élément va être mis à jour après, il va causer une collision ?), où doit-on les appliquer tout à la fin (mais alors, comment revenir en arrière, pour dire que l'élément n'a pas eu le droit d'aller ici).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour le lien, il me semble tout à fait utile !

    Effectivement, je vois que cette méthode n'est pas sans défaut, elle m'a l'air même bien trop simpliste. J'ai beau cherché, mais comme dit l'auteur du thread en lien, ce n'est pas si simple de trouver des exemples réfléchis et expliqués.

    N'y a t-il pas un topic qui recense des projets intéressant, avec un code ouvert, qui permettrai d'apprendre via quelque chose de concret ?

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 215
    Points : 10 140
    Points
    10 140
    Par défaut
    bah je vois pas vraiment le souci ^^'
    Voila je que je ferais

    Alors voila la boucle de jeu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while(run)
    {
        evenement(); //récupère les évènement dans un tableau de booleen
        gameplay(); //gere les différents élément du jeu , vecteur , jouer animation ect
        deplacement();//déplacement de ton unité
        collision();//modifie les vecteur vitesse
        camera();
        rendu();
        fps();
    }
    D'instinct j'ai pensé à créer une classe de déplacement, qui va contenir un tableau avec l'unité qui se déplace, son vecteur de déplacement, sa vitesse.
    Oui c'est une bonne idée.


    Donc j'imagine que c'est un genre de RTS ou hack n slash que tu veux faire.
    On clique sur la souris ça sera le point B , le point A c'est ou se trouve ton unité.

    Bon imaginant que le point A et 0,0 et le point B 5,5.
    Ton unité aura un vecteur vitesse de 1,1 , si elle rencontre un mur , ben tu modifie son vecteur vitesse sinon ben il y va jusqu'au point 5,5.
    Si le vecteur vitesse tu le veux plus rapide genre 2,2 et pour pas aller a 6,6 , tu peux verivier la distance a chaque tour de boucle (donc a chaque vitesse) et ajustez la vitesse(quand il est prés du point) pour qu'il tombe pile a 5,5.
    Donc il fera 2,2 2,2 et 1,1.
    Je précise c'est ta méthode déplacement qui donnera la valeur de la vitesse , les collision ne modifie que cette valeur.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse. Pour le moment, je suis plutot dans une phase de test, et je pense plutot partir sur des déplacements intégralement gérés via l'IA, le «joueur» ne gérera pas directement les unités. Le contexte fera bouger ou non les unités. Mais peu importe de toute façon le principe est le même.

  6. #6
    Invité
    Invité(e)
    Par défaut
    j'ai une autre question cependant. Comment gére-t-on les communications entre les classe de jeu. Je m'explique :

    -je veux déplacer mon unité (ou elle veut se déplacer toute seule dans mon cas), faut-il stocker les informations de déplacement, dans la classe de l'unité ou dans une classe de gestion de déplacement dédiée ? Dans ce cas qui me parait plus logique, comment se passe la communication entre la boucle de jeu, les unités et cette classe ?

  7. #7
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 444
    Points : 4 560
    Points
    4 560
    Par défaut
    C'est un peu toujours une question de circonstances, et de gouts, y a pas vraiment de recette miracle universelle.

    Dans mon jeu, un mmorts, donc avec beaucoup d'unités, la position et la destination sont dans l'objet de l'entité, ainsi que sa logique de déplacement.
    Si elle doit se déplacer, elle est enregistrée dans un manager qui va la faire bouger tant que sa position != de sa destination.
    Ce manager est appelé à chaque frame dans la boucle de jeu.
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ça fait longtemps. Déjà merci pour vos réponses, je n'ai pas eu beaucoup de temps pour avancer sur ce projet, mais j'y vois maintenant plus clair.

    Cependant, j'ai toujours la même interrogation concernant tout ce qui doit être affiché à l'écran. J'imagine qu'un manager doit se charger de l'affichage, mais comment ce manager a connaissance de toutes les entités présentes ? Dans le cas où c'est une unité qui crée une entité (un batiment par exemple), le manager doit être connu dans chaque classe ?
    Dernière modification par LittleWhite ; 09/07/2013 à 15h07. Motif: Pas de SMS

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai avancé avec manager.

    Je peux maintenant sélectionner une unité à l'écran. Cependant, tous les éléments de jeu héritent d'une classe Element. Cela inclus les unités, les obstacles, les batiments, etc…

    Tous les éléments de la classe Unité ou toutes les classes héritées peuvent se déplacer, les autres non. Tous les éléments peuvent par contre se sélectionner. Je stocke un pointeur d'Element dans un attribut de ma classe Manager. Quand je fais un clique gauche sur un Élement, je stocke le pointeur dans cet attribut. Si je fais un clique droit ailleurs sur le terrain de jeu, je veux que l'Élement se déplace, mais évidemment uniquement si c'est une unité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Manager::movementEvent(sf::Vector2i mPosition)
    {
    	sf::Vector2f mousePosition = sf::Vector2f((float)mPosition.x, (float)mPosition.y);
    	if(this->selection) {
    		this->selection->setDestination(mousePosition); pas possible
    	}
    }

Discussions similaires

  1. Persistance et organisation du code
    Par K-Kaï dans le forum Hibernate
    Réponses: 16
    Dernier message: 06/06/2007, 18h01
  2. Organisation du code source
    Par _kal_ dans le forum C
    Réponses: 18
    Dernier message: 04/08/2006, 15h15
  3. organisation du code.
    Par poporiding dans le forum C++
    Réponses: 36
    Dernier message: 13/07/2006, 11h15
  4. organisation du code.
    Par poporiding dans le forum C++
    Réponses: 3
    Dernier message: 28/06/2006, 18h10
  5. Réponses: 4
    Dernier message: 19/09/2005, 18h56

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