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

DirectX Discussion :

Manipulation de sprites


Sujet :

DirectX

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut Manipulation de sprites
    Bonjour

    Voilà juste une petite question aux pros de Direct X (que je ne suis pas encore )

    Je voudrais rajouter pas mal d'effets spéciaux dans mon moteur 2D notamment dans une scène où un passage s'ouvre et les arbres qui le cachent disparaissent.

    Est-ce que c'est possible de faire par exemple en sorte que les arbres disparaissent un à un en fondu ou avec un autre effet ? Que l'effet ne soit appliqué sur un seul sprite.

    En gros, peut-on faire ce qu'on veut avec nos chers jolis sprites ?

    Mirci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Bien sûr, on peut toujours faire ce qu'on veut

    Tu utilises ID3DXSprite pour gérer tes sprites ? Est-ce que tu as déjà essayé quelque chose, et tu bloques sur un point précis ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Non pour l'instant je me suis contenté d'un simple affichage de sprites et les seuls "effets spéciaux" que j'ai intégré concernent l'ensemble de l'écran (genre affichage d'un nuage en transparence et en scroll pour simuler la brume).

    Je voudrais rajouter donc maintenant d'autres effets graphiques. Par exemple un élément du décor qui disparaît en fondu, le titre sur le page de présentation qui apparaît ou disparaît en distorsion, etc...

    Je ne suis pas très à l'aise encore avec les "termes" mais à moins que je ne m'abuse, je ne crois pas utiliser ID3DXSprite. J'ai des textures (au format PNG) et pour afficher un sprite, je sélectionne une zone d'une texture et affiche le sprite avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    directx9->get_D3D_Device()->SetFVF(D3DFVF_RECTANGLE_VERTEX);
    directx9->get_D3D_Device()->SetTexture(0, *(textures[ID_Texture].get_lpTexture()));
    directx9->get_D3D_Device()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, directx9->pVertices, sizeof(RECTANGLE_VERTEX));
    (J'ai pas mis toute la fonction bien sûr...)

    On peut faire tout ce qu'on veut ? C'est vrai ? lol

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour faire un fondu transparent, tu peux activer l'alpha blending en utilisant par exemple un facteur de transparence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Device->SetRenderState(D3DRS_BLENDFACTOR, TransparenceDuSpriteCourant);
    Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_BLENDFACTOR);
    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVBLENDFACTOR);
    Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
     
    // Puis pareil pour la suite
    Pas testé mais ça devrait être ça.

    Par contre si ton sprite comporte deja de la transparence il faudra en plus bidouiller les SamplerState.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Mais ce genre de code peut s'appliquer sur un seul bout de l'écran ? Un seul sprite par exemple ? Si je veux faire disparaitre un arbre de ma map en fondu, quand bien même il y en a d'autres par dessus, par dessous etc... ?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Bien sûr, c'est comme tout le reste : ça s'appliquera sur les primitives que tu vas tracer ensuite, jusqu'à ce que tu changes les states pour d'autres sprites.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Oki merci Loulou24 Tu es un chef

    Question bonus : Tu t'y connais pas mal toi en programmation de jeux ?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ca va oui, je commence à me débrouiller pas mal à force

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Je te pose cette question parce-qu'il y a certaines questions que je me pose...

    Notamment, bon, j'ai mon personnage principal qui bouge et s'anime au clavier, c'est cool. J'ai aussi des monstres qui bougent, s'animent et attaquent, c'est re-cool.

    Mais comment faire quand par exemple on frappe un ennemi et qu'on veut qu'il fasse une autre animation où on le voit par exemple tourner les yeux à 360° plusieurs fois et ensuite seulement il se remet à s'animer comme avant... ? Je me suis pas trop encore penché sur les scripts... Est-ce la solution ? J'aime pas trop cette idée de script. Surtout s'il faut laisser les fichiers tels quels dans le jeu. Si un script est une suite de commandes, il doit y avoir deux classes à prévoir pour. Autant sauvegarder en binaire un beau tableau d'instances de scripts. Ca sera pas modifiable comme un fichier texte.

    Comment ça je me pose trop de questions ?

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Arg j'avais écrit un roman et ma connec m'a laché
    Bon je recommence !

    Je disais donc que c'était justement ce que j'étais en train de coder en ce moment

    J'ai implanté ça sous forme de file d'actions (utilisée habituellement dans les RTS, mais pour mes séquences de combats ma foi ça marche aussi très bien). En gros, j'ai défini plusieurs actions de base : mouvement, attente, coup, animation, ... et lorsque je veux executer une action complexe, "j'enfile" la séquence d'actions de base correspondante dans ma file, et je lance tout ça. Lorsqu'une action est terminée, on passe à la suivante, et c'est pas plus compliqué. En plus ce système se marie très bien avec l'utilisation de scripts

    Ceci-dit je ne sais pas si c'est une bonne solution pour toi, si tu ne veux que gérer les changements d'animation tu peux faire plus simple.
    Par exemple dans un précédent jeu, j'avais codé ça avec le même principe que la file, mais limitée à 2 éléments : lorsqu'on lance une animation on indique quelle sera sa suivante. Lorsque l'anim courante est finie, on passe à la suivante, et s'il n'y en a pas on met l'anim par défaut (idle), ou bien celle qui était avant. Après tu peux faire des variations pour indiquer par exemple qu'une anim doit boucler un certain nombre de fois, etc...

    Pour ce qui est des scripts, je ne pense pas qu'il faille que tu t'y mette pour ça, ce sera je pense inutile, surtout que comme tu le dis il faudra de toute manière prévoir tout le bazarre C++ qui va derrière. Et puis pour le peu que j'avais testé avec Lua, c'était pas si simple de faire la lisaison entre les scripts et le programme principal.

    Conclusion : je ne peux pas te donner de solution miracle, ça dépend bien sûr beaucoup de ton application, mais j'espère que tout ça va te donner des idées

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Non en fait la méthode que tu es en train d'implanter correspond tout à fait à ce que je souhaite faire car, même si je ne t'ai parlé que d'animations, il me faudra un moyen efficace d'avoir une vraie AI côté monstres et PNJ. Pour l'instant, ce n'est qu'un déplacement aléatoire agrémenté de A* pour les monstres mais j'aimerais effectivement que les monstres soient plus vivants que ça. Qu'ils se mettent par exemple dans un état "je fais rien, j'observe" pendant laquelle il y a telles animations, puis en apercevant le joueur, il rentre dans un état "je me dirige vers lui" où le monstre se "locke" sur la position du joueur en se rendant à telle position en jouant telle animation, etc...

    En particulier, je posais cette question parce qu'il me faut (comme tout bon RPG qui se respecte) mettre un boss en fin de donjon et je me disais que les boss sont plus particuliers parce qu'ils ont des attaques spéciales, et ces attaques-là généralement sont mises en scène d'une certaine façon avec beaucoup d'animations.

    Pour en revenir aux scripts, il faudra de toute façon que je les mette en place car un RPG sans scripts... Il faudra bien lancer des mouvements de caméra quand on arrive dans un lieu inconnu, jouer toute une scène de dialogues enfin etc quoi

    Au fait je viens de percuter sur un truc. Ca fait déjà longtemps que je réfléchis aux scripts et j'étais finalement arrivé à l'idée qu'il faudrait dans ces scripts des commandes bloquantes (pour une scène cinématique) et des commandes non-bloquantes (pour gérer l'IA par exemple). Je viens donc de percuter que ces commandes non-bloquantes c'est en fait ce que tu as appelé actions dans une file

    Sinon tu réalises quoi comme jeu en ce moment ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 58
    Points : 48
    Points
    48
    Par défaut
    Salut,

    apparement vous avez tous les 2 l'air relativement à l'aise pour ce qui est de l'organisation d'un programme jeu, et je me demandais si l'un d'entre vous accepterez de lacher le squelette de son code. je dis bien squelette, en remplaçant des parties de votre code par des phrases "ici, on mets ça" etc... ça pourrait servir à ceux qui débute (comme moi) comme caneva, et il ne reste plus qu'à se préoccuper de ce que l'on veut dessiner, des événements etc...

    même si j'imagine qu'un RPG ce conçoit de manière bien différente que d'autre style de jeu, il reste tout même je pense une bonne partie réutilisable, ou pouvant servir d'exemple pour d'autre type de jeu.

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Concernant les jeux sur lesquels je bosse ne ce moment, il y a le moteur 3D du projet DK Project : Last City of Heaven, et j'ai demarré depuis 3 jours la prog du jeu dont je te parlais : c'est un RPG ambiance jap qui melera 2D (pour les sequences de combat) et 3D (pour le reste). Là je m'occupe + du jeu en lui-même, on a opté pour l'utilisation du moteur 3D Irrlicht.

    Pour shifty.net : malheureusement ce n'est pas si simple, et même s'il y a des concepts réutilisables, le "squelette" d'un jeu ne sera jamais le même. Et puis en ce qui me concerne je doute que le code sur lequel je travaille soit open source . Mais si tu veux picher de bonnes idées il existe tout un tas de jeux open source sur le net, je pense que si tu fais une petite recherche tu trouveras ton bonheur. Si tu te sens d'attaque, tu peux aussi regarder du coté de jeux commerciaux : Id Software a rendu disponible le code source de pas mal de ses jeux par exemple. Mais bien sûr il y a aussi des "petits" jeux à foison

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Et bien moi je travaille sur un RPG 2D à la Zelda si ce nom te dit quelque chose lol

    Au fait, pour la transparence d'un seul sprite, aucun souci. Ca fonctionne super. Par contre, il n'y a plus qu'à gérer dans la boucle...

    J'avoue qu'il y a encore pas mal de situations ou de cas où je n'arrive pas à imaginer comment gérer avec la boucle d'affichage... Enfin, j'ai appliqué ça à un petit jeu de casses-briques où chaque brique disparaît donc en fondu. Mais bon j'ai implémenté çà à la barbare je suis sûr...

    Pour l'exemple de l'arbre, s'il s'agit d'une scène "scriptée", il suffirait d'avoir un truc genre
    affichersprite arbre, 150, 150, 0xFFFFFFFF
    attendre 100
    affichersprite arbre, 150, 150, 0xAAFFFFFF
    attendre 100
    (etc...)
    (En supposant que ceci est un script lol)

    Mais si c'était directement dans le jeu, genre on marche sur telle case et ca lance la disparition de l'arbre tout pendant que le joueur peut continuer à jouer ? Remarque modifier la map tout en laissant le contrôle au joueur, c'est peut-être pas recommandé...

    Pour Shifty : Même réponse que Loulou24 désolé. Mais en cherchant sur le net, on trouve rapidement de quoi travailler ^^

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour ce qui est de lancer une action scriptée dans le programme en lui-même, je pense que tu peux simplement appeler directement les structures utilisées par les scripts. Ou bien pourquoi pas, lancer le script correspondant. Et s'il n'y a pas de script, eh ben c'est un peu ce dont on parlait : on ferait un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MonArbre->PushAction(new Fade(0xFFFFFFFF, 0x00000000));
    MonArbre->PushAction(new Wait(100));
    MonArbre->PushAction(new Fade(0x00000000, 0xFFFFFFFF));
    // etc...
    Ca c'est pour l'instant le genre de code que j'ai (mais bon ça ne fait que 3 jours que je suis dessus alors ça risque de changer ).
    Enfin je ne suis pas un expert pour ça, ce sont juste des idées !

    PS : tu n'aurais pas une chtite démo de ton jeu à nous montrer ?

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Ce que tu appelles monArbre est un sprite ou une liste d'actions ?

    Si c'est un sprite :
    Oui j'ai pensé à ton idée genre monArbre->pushAction(...) mais jusqu'ici je n'imaginais introduire la notion de scripts que pour ce qui est monstres et PNJ, pas pour des décors ?

    Si c'est une liste d'actions :
    Ca induit que tu as une classe Fade ? Une classe Wait ? Ce n'est pas un peu exagéré ? Ou c'était simplement pour l'exemple ?

    J'ai un autre problème mais cette fois c'est au niveau du design. J'ai beaucoup de mal avec les animations des personnages. Est-ce qu'il n'y aurait pas un site où qqn explique comment créer les animations d'un personnage en 2D ? Enfin je sais bien que quand il marche, le bras gauche avance, la jambe droite recule et inversement mais l'appliquer sur mon joli personnage vu de face, ce n'est pas évident...

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dans mon exemple MonArbre etait l'entité representant l'arbre, qui dériverait certainement d'une classe assez général CEntity, ou quelque chose de ce goût là.
    Le principe dans un jeu de ce genre, c'est de partir d'une classe très générale d'entités, et de spécialiser au fur et à mesure des besoins en créant une hiérarchie de classes, ce qui fait qu'au final toutes les classes qui adopteront un certain comportement dériveront toutes de la même base (qui gèrera donc ce comportement).
    Tout comme les personnages ou les monstres, l'arbre sera une entité affichable, qui possedera des actions. Mais à un niveau de la hierarchie la classe CArbre prendra une autre direction par rapport a CMonstre (entité statique par exemple, par opposition aux entités animées). Enfin c'est comme ça que je vois les choses

    Sinon effectivement, j'ai une classe Fade, une classe Wait, etc... Ca peut paraître exagéré oui, mais ça ne l'est pas du tout : il faut bien savoir que toutes ces classes sont très "génériques" et au final je n'aurai pas besoin d'en coder 50 pour pouvoir effectuer n'importe quel type d'action. Et puis le code de chaque classe ne consiste qu'en la redéfinition d'une ou deux fonctions, qui tiennent chacune en 1 ligne la plupart du temps .

    Je pense que ce système est vraiment optimum, car au final tu te retrouves à coder seulement quelques classes minimales, et ça te permet d'implanter tout le panel d'actions que tu souhaites pour ton jeu en enchainant celles-ci. Et puis c'est super flexible : si tu veux rajouter une action, hop tu dérives CAction, tu redefinis les 2 fonctions virtuelles, et c'est gagné.

    Pour ce qui est des sprites désolé, je ne suis vraiment pas expert en pixel-art (mes sprites de test sont d'ailleurs d'une rare beauté )

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Oui voilà c'est un système exactement comme ça que j'avais envisagé. Notamment pour les monstres. Il y aurait CMonstre et puis ensuite chaque type de monstres et de boss auraient sa classe en redéfinissant deux ou trois méthodes.

    Donc toi tu fais de l'héritage à outrance

    J'avais pourtant lu sur un bouquin que ce n'était pas conseillé...

    P.S : Je t'ai ajouté dans mes contacts

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    A mon avis, dans ce genre de projet l'héritage est la base de tout le design, il faut en abuser.
    Je ne vois a priori aucune raison de le déconseiller, surtout dans ce cas !

    Un std::vector<CEntity*>, un foncteur qui compare 2 entités selon leur coordonnée Y, et hop voilà ta scène 2D entière, fond persos arbres monstres boss interface ..., affichée back-to-front en exactement 2 lignes de code. C'est pas génial l'héritage ? (et agrémenté d'une cuillérée de STL bien sûr c'est encore mieux) 8)

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Oui c'est clair perso j'adore l'héritage et le polymorphisme

Discussions similaires

  1. Manipulation de sprites : quelle méthode ?
    Par matieu dans le forum SDL
    Réponses: 6
    Dernier message: 18/10/2007, 09h42
  2. Manipulation des handle contexte
    Par rockbiker dans le forum DirectX
    Réponses: 1
    Dernier message: 09/05/2003, 18h51
  3. Réponses: 2
    Dernier message: 18/01/2003, 17h06
  4. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43
  5. Réponses: 5
    Dernier message: 06/08/2002, 20h08

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