Particle engine 2d opengl dev-c++ - effets de feu etc [ moteur de particules ]

Soyez le premier à donner votre avis sur cette source.

Vue 23 033 fois - Téléchargée 1 623 fois

Description

Le code se présente sous la forme d'un ensemble de classes C++ qui forment, au global, un système de particules en 2D pour OpenGL.

Le concept: on dessine un très grand nombre (des milliers) de "particules" (carrés colorés et texturés plus ou moins transparents selon un facteur hasard et leur "âge": les particules meurent quand leur Vie atteint 0, c'est-à-dire lorsqu'elle sont complètement transparentes) à l'écran. Ces particules qui sont projetées (vive la théorie vectorielle ^^) dans une certaine direction à une certaine vitesse donnent un joli effet de feu dans le cas présenté ici, mais selon les paramètres on peut obtenir une trainée de poussière derrière un obus, une nuée d'étoiles etc... C'est une technique très amusante car si vous bidouillez avec les paramètres, vous obtiendrez souvent des choses étonnantes :)

Les specs:

- Génération dynamique de la texture des particules -> on ne doit pas fournir d'image
- Possibilité de coincer l'orientation des particules entre deux angles en degrés ([0,360])
A noter: 40->140 est l'inverse de 140->40, il ne faut pas écrire -220->40
- Vitesse paramétrable ainsi que le facteur de réduction/croissance de celle-ci
- séparation en classes claires (j'espère ^^)
- Couleur paramétrable (au singulier, contacter Wett pour le pluriel ^^)

Le point original:

La classe CLieu représente un lieu géométrique de points (cercle, disque, rectangle "plaquette", point, mais aussi droite, parabole etc si l'on veut les coder). Ainsi, en associant un CLieu à un CParticleEngine, on peut aisément déterminer l'aspect de l'animation. Le feu en bas d'écran est une plaquette "ligne" (je n'ai pas codé les lignes, mais ça revient à ça). Le cercle est un cercle aplati à un facteur de 0.5 pour donner l'effet de perspective, et le flambeau vert est un point avec des angles de projections [40,140]°.

Je ne pense pas que cela existait déjà, en tout cas je ne l'ai jamais vu. Changer le Lieu en pleine animation devrait donner lieu à une transition intéressante, je n'ai pas encore testé, mais cela devient très simple grâce à ce système.

Source / Exemple :


//Exemple de config:

    Engine2.SetFourchetteAngles(80, 100);
    Engine2.SetFourchetteVitesse(1, 15);
    Engine2.Rayon = 8;
    Engine2.Lieu.Type = liCercle;
    Engine2.Lieu.SetCentreEtRayon(400, 325, 250, 0.5);
    Engine2.FacteurVitesse = 0.95;
    Engine2.Couleur = CParticleEngine::clrEnergieBleue;
    Engine2.CreerParticules(NbPart2);

//Note: le 4ème paramètre de SetCentreEtRayon() est le facteur de compression du lieu selon l'axe Y (cercle -> ellipse)

//cf ZIP évidemment

Conclusion :


L'exemple du zip:

Dans l'exemple vous verrez un feu "classique" étendu en bas de l'écran et poussé par un vent vers la droite (jouez avec les flèches gauche/droite pour changer ça), un cercle énergétique bleu au centre de l'écran dont vous pouvez changer le rayon avec les touches haut/bas et une flamme/lampe/chalumeau verte au centre du cercle (j'avais plus de place ^^).
Si vous appuyez sur Enter, les particules cessent d'être régénérées, et les systèmes s'éteignent. Si vous rappuyez sur Enter, la régénération reprend son cours normal.

Ne regardez pas trop le main.cpp, c'est le bordel. Remarquez juste qu'il a fallu générer la texture en appelant Engine1.GenerateTexture(25) (25 = ID de la texture, arbitraire, oui c'est dégueulasse de faire ça comme ça) APRÈS avoir activé OpenGL et que les méthodes CreerParticules(x) sont appelées APRÈS les configurations des Engine_. Cela pour que les particules initiales respectent les contraintes du système.

Vous ne devrez créer que des objets CParticleEngine si vous utilisez ce code. Voyez le main.cpp pour la configuration de ces objets et leur utilisation (Objet.Deplacer(); Objet.Dessiner();).

TODO:

- implémenter une fonction Initialiser(type) pour paramétrer l'objet directement avec une configuration par défaut pour un feu, une lampe, des étoiles etc...
- utiliser une display list pour les particules d'un ParticleEngine [FAIT]
- rétablir un système d'axes non modifié (pour l'axe Y, s'entend)
- Passer en 3D?
- éliminer l'effet de discrétisation des positions des particules qui donne lieu à un effet de quadrillage indésiré dans certains cas.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

Mise à jour pour conformance avec le standard. Voir commentaire de la mise à jour.
cs_djl
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
finalement je reviens sur static_cast qui convient pour les types de base, mais pas de pointeur
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

okey

merci bcp pr la petite discu ;)
je vais me coucher
cs_djl
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
ouai j'ai bien fais de me renseigné sur le coup

pour repprendre :

oubli le static_cast, ca permet uniquement de de verifier la plausibilité pour deux types de la meme hierarchie de classe

dynamic_cast fais de meme mais dynamiquement lorsque la veridication statique n'est pas possible (pointeur) ==> controle retour necessaire

reinterpret_cast, equivalent au cast c

l'interet par exemple du reinterpret_cast, c'est (en plus de faire partie du langage) de pouvoir etre retrouvé facilement dans le source (contrairement aux cast c (Type) )


donc dans ton cas il est conseillé d'utiliser un reinterpret_cast
cs_djl
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
d'ailleur en reflechissant je me suis trompé car ce n'est pas non plus possible pour le static_cast :)
En fait il ne fais que la verification statique (on appel ca le downcast)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.