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 :

[2D] Gestion des sprites sur un moteur 2d


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut [2D] Gestion des sprites sur un moteur 2d
    Salut tout le monde.
    J'ai un ptit probleme. Je suis en train de faire un moteur 2D sous opengl (aucune utilité c juste mon projet de fin d'annee) et je suis confronté à un problème de gestion des sprites.J'explique:
    En gros voila, comment savoir quel sprite mettre le plus au fond? Un decor est une superposition de sprites. On peut donc dire "voila je decide que mes sprite s'affichent dans l'ordre ou je les declare. Mon premier sprite sera le fond d'ecran et les sprites suivant se superposent. Ca veut dire qu'on declarerai le sprite du perso en dernier." .Bon ca c'est cool mais ca me gene parce que le programmeur ne peut pas faire des sortes d'animations(ex: le perso arrive à un certain moment, on veut faire passer un ennemie qui etait cacher derriere un buisson en avant plan) donc je voulais savoir comment créer une fonction qui afficherai tout bien mes sprites. Vous avez une idée?
    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Attention tu confonds declarer et afficher.

    tu peux déclarer et stocker dans une <map> par exemple, tes sprites dans n'importe quelle ordre.

    ensuite tu les affiches dans l'ordre que tu souhaites, sachant que le dernier afficher sera au premier plan (et ainsi de suite).

    pour modifier l'ordre des plans, inverse l'ordre d'affichage au cycle qui suit.

  3. #3
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Non je confod pas declarer et afficher mais enfait opengl atribut un identifiant unique à chaque image et quand tu declare ton premier sprite cet id=1 le second vaut 2 etc.. donc c'est pour ca que je pensais à l'ordre des declarations.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par drcd
    Non je confod pas declarer et afficher mais enfait opengl atribut un identifiant unique à chaque image et quand tu declare ton premier sprite cet id=1 le second vaut 2 etc.. donc c'est pour ca que je pensais à l'ordre des declarations.
    Je ne comprends pas non plus ton problème. Comme ash l'a dit, juste parce qu'OpenGL donne un certain ordre à tes sprites, rien ne t'oblige de les dessiner dans cet ordre...

    Il suffit de choisir dans quel ordre tu dessines les choses pour faire passer un objet du dernier plan au premier plan.

    Jc

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Voila comment procéder :

    - générer l’ID de ta texture 1
    - générer l’ID de ta texture …
    - générer l’ID de ta texture n
    - Afficher la texture qui est le plus a l’arrière plan en appelant son ID
    - Afficher la texture qui après est le plus a l’arrière plan en appelant son ID
    - …
    - Afficher la texture qui après est le plus en premier plan en appelant son ID

    si tu rencontres un souci autre dit la car la je vois pas.
    l'ID permet juste de nommer ta texture, ca ne fait rien d'autre.

  6. #6
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Bon oki,
    je genere mes texture tout bien. Je creer mes carrés et je balance mes texture sur mes ptit carrés blancs. Seulement mon moteur est en 2D et le type qui va programmer avec il doit pas avoir à se soucier d'une coordonnée de profondeur z. Or moi je veux justement utiliser cette coordonnée pour faire la superposition des elements du decor. Donc on peut imaginer que je place mon sprite de fond. Bon celui la il bouge pas. Ensuite je place un ennemi et je place un buisson qui cache mon ennemi. Le fon a un z=0, l'ennemi=0.01 et le buisson =0.02 on va dire ca. Maintenant il y a un type qui joue il arrive à un endroit qui fait que l'ennemi sort de son buisson. C'est un moteur 2D et le programmeur s'en fou du z il pense meme pas qu'il existe. C'est donc à mon moteur de gerer ca avec une fonction qui recalcule la scene et je vois pas comment je peux faire cette fonction. Mon probleme est plus clair la?

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Ce que tu appel Z est en fait un attribut plan ou Z peu importe associé a une texture.
    Tu peux procéder de la sorte, créer une classe Texture avec l’ID + un int Z contenant le plan d’affichage (0 le plus loin et n le plus proche).

    Emettons que tu veux 3 niveaux alors dans ta classe de stockage de la map, tu créés 3 vector, un pour chaque niveau de profondeur, et tu place les Textures dans ces vector suivant Z.

    Ensuite tu affiches le vector 0, puis le 1 et enfin le 2.

    Imaginons maintenant qu’a un moment donné tu as une action qui fait passer une texture au premier plan, alors tu appel une fonction plan(2) pour passer au plan 2 par exemple, qui modifie Z de Texture et la bascule dans le vector 2.

    Et tu réaffiches.

  8. #8
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Là ça touche au choix de design. C'est comme tu les sens.

    - Tu peux la jouer api 2d et afficher les sprites dans l'ordre, donc le dernier au dessus. C'est vieux et fiable (on fait comme ça avec SDL).
    - Tu peux, comme le suggère ash.ice.loky, faire des plans (comme les anciennes consoles ), genre le 0 pour le fond, le 1 comme premier plan etc. Avec la possibilité en implémentation de gérer les Z en interne ou de grouper les sprites dans des listes pour les afficher dans l'ordre, ou même faire des rendus intermédiaires pour chaque plan... Avec les Z il devient possible de permettre au programmeur de définir le nombre de niveaux à utiliser.
    - Tout simplement exposer le Z au programmeur qui l'utilise pour préciser un ordre de priorité. C'est simple, et même si le programmeur se fiche du Z et de la 3d, avoir une simple valeur pour spécifier ce qui s'affiche au premier plan sans se pourrir la vie à afficher ses sprites dans l'ordre ça va lui plaire.
    - Ou encore le programmeur donne à ton moteur un ordre de priorité (un entier par ex) pour chacun de ses sprites, et toi en interne tu fais ce que tu veux (liste triée pour afficher dans l'odre, utilisation du Z...)

    Je pense que la dernière méthode est la plus propre car elle masque totalement l'implémentation pour le programmeur. Donc si on passe à de la 2d pure (disons SDL) par ex, le programmeur ne verra pas la différence.

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Sivrît
    Là ça touche au choix de design. C'est comme tu les sens.
    - Ou encore le programmeur donne à ton moteur un ordre de priorité (un entier par ex) pour chacun de ses sprites, et toi en interne tu fais ce que tu veux (liste triée pour afficher dans l'odre, utilisation du Z...)

    Je pense que la dernière méthode est la plus propre car elle masque totalement l'implémentation pour le programmeur. Donc si on passe à de la 2d pure (disons SDL) par ex, le programmeur ne verra pas la différence.
    Je suis d'accord, j'opterais pour cette solution aussi.

    Jc

  10. #10
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Ok
    Ben merci à vous tous. On vient justement d'en parler avec mon trinome avec qui je fait le projet et c'est ce qu'on comptait faire donc ca me conforte bien dans mon choix. Et je suis desolé pour les premier post j'avais mal expliqué le probleme.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des Sprites
    Par FCDB dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 02/01/2009, 11h00
  2. Gestion des erreurs sur une commande multiple
    Par domiq44 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 05/10/2006, 15h03
  3. [PHP-JS] gestion des erreurs sur liste déroulente
    Par HwRZxLc4 dans le forum Langage
    Réponses: 9
    Dernier message: 28/05/2006, 03h21
  4. Réponses: 4
    Dernier message: 25/11/2005, 18h15
  5. Application de gestion des sms sur PC
    Par andyvo dans le forum Langage
    Réponses: 9
    Dernier message: 20/10/2005, 23h49

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