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

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

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.