Gravity Screen Saver
Un écran de veille chaotique
https://github.com/PatriceDargenton/Gravity
Ancien dépôt : https://codes-sources.commentcamarche.net/source/4486
Documentation : Gravity : index.html
Code source : GravitySrc.html
http://patrice.dargenton.free.fr/CodesSources/index.html
Date : 19/08/2024
Nouveauté : la version 2.0 est en VB .NET
Compensation des erreurs d'arrondi
Orbites en 3D, c'est possible !
Petits défauts qui restent dans la version VB .NET
Petits défauts dans la version en VB6 (corrigés dans la version VB .NET)
Téléchargement du Microsoft .NET Framework
Version 2.00 du 03/09/2002 : Première version en VB.Net
Versions précédentes en VB .NET à partir de VBNetScreenSaver
Version 1.0 du 2/5/2002 : VBNetScreenSaver : Un écran de veille minimal en VB .NET (et C# aussi)
Version 2.0 du 15/5/2002 : VBNetScreenSaver2 : Un écran de veille configurable minimal en VB .NET
Version 3.0 du 08/07/2002 : VBNetScreenSaver3, suite : Gestion optimisée des sprites
Version 4.0 du 21/07/2002 : VBNetScreenSaver4, suite : *.jpeg en fond d'écran et pour n sprites
Tutorial de migration VB6 en VB .NET : un cas concret
Version 1.0.3 : correction du problème d'instance récalcitrante
Version 1.0.2 : compilation en code natif
Version 1.0.1 : correction du problème du mapping des couleurs.
Gravity Screen Saver est un économiseur d'écran (un écran de veille pour Windows) sur l'aspect chaotique de la loi de gravité qui régie le mouvement des planètes. Il s'agit d'une simulation du mouvement harmonique (mais pas très stable !) de grappes de planètes parcourant des orbites purement théoriques. Ces planètes sont placées dans des conditions d'équilibre calculées à partir des racines unitaires complexes (Zn = 1). Il peut y avoir 2 systèmes imbriqués ! (par exemple une lune gravitant autour d'une terre, le tout gravitant autour d'un soleil). Ces orbites seraient stables à terme si la simulation numérique n'était pas une approximation des phénomènes continus de l'espace-temps, surtout lorsque deux planètes sont proches l'une de l'autre. N'hésitez pas à tester plusieurs fois pour tomber sur une figure intéressante, car toutes les figures sont aléatoires, mais paramétrables.
- Utilisation du type de donnée Decimal au lieu de Double pour améliorer la précision et donc la stabilité (mais toute la librairie System.Math est en Double seulement, la stabilité n'est pas améliorée, dommage !), à ce sujet, voir l'amélioration prévue pour compenser les erreurs d'arrondi ;
- Angles de départ variables des systèmes d'orbites ;
- Rotation de bitmap : les planètes ont un spin, elles tournent sur elles-mêmes ;
- Les planètes symétriques ont maintenant la même image et le même spin ;
- Amélioration du mode 3D : diamètre apparent, correction du centrage, bRnd pour b3D ;
- Gestion des chocs : Merci à Alcys :
CHOCS ENTRE BILLES DE MASSES DIFFERENTES : www.flashkod.com/article.aspx?Val=118
Note : pour le moment, les chocs à n billes simultanées ne marchent pas très bien (une solution est envisagée dans le code).
- L'écran de veille et sa configuration partagent maintenant la même Form : le code source est simplifié ;
- Le code source est plus simple : avec la prise en compte du graphisme dans la librairie de la plate-forme .NET, le gain totale est de 15% pour le nombre de lignes de code (2730 au lieu de 3212) et près de 50 % pour la taille du code exécutable : 68 Ko au lieu de 120 Ko ;
- Par rapport aux précédentes versions de VBNetScreenSaver, il y a plus d'options de transition des images et la gestion des erreurs est améliorée.
- Sauvegarde des scénarios générés au hasard pour produire des démos scénarisées ;
- Version en vrai 3D (au lieu de la simple 3D isométrique) pour les sprites avec mapping des textures sur les planètes et spin en 3D, ainsi que la prise en compte de la modification du spin au cours d'un choc ; à priori, le tutorial OpenGL suivant : http://nehe.gamedev.net contient tout ce qu'il faut pour faire du 3D : détection de collision et mapping de texture pour les sphères 3D ;
- L'optimisation peut être poursuivie avec une gestion plus poussée du clipping et la prise en compte des futures fonctionnalités du GDI+ qui ne sont pas encore implémentées dans .NET par Microsoft.
- Option strict on : c'est plus sûr !
- IO.File.Exists(sCheminFichier) en une ligne de code : l'utilisation de la fonction statique de la classe File évite d'instancier un objet FileInfo !
- Dim sRepertoire$ = Application.StartupPath : c'est plus simple que d'utiliser la classe Assembly.Reflexion ;
- Utiliser l'attribut de sérialisation d'une classe d'options au lieu d'un document XML ? voir l'exemple "VB.NET - Advanced .NET Framework (GDI+) - Create a Screensaver with GDI+".
Compensation des erreurs d'arrondi
Lorsque le nombre de planètes (de masse identique) est pair, il est possible de compenser les erreurs d'arrondi en reportant, pour chaque planète 2 à 2, le calcul sur la planète symétrique. Pour cela, il faut changer de référentiel, voir la démo sur les orbites 3D. Pour un système simple, il sera facile d'adapter les sources, mais pour 2 systèmes imbriqués, cela risque d'être chaud !
Orbites en 3D, c'est possible !
Mon prochain objectif : le 3D. Pour tout système stable dans le plan XOY, on peut très bien laisser une planète osciller sur l'axe OZ ! mais il existe aussi des orbites stables en forme de pelote en 3D !!!, voir la démo sur les orbites 3D.
- Il y a un problème avec les images de sprites en .jpg : il est très difficile d'avoir un fond parfaitement uni, ce qui est requis pour la transparence, car l'algorithme du jpeg lisse les couleurs près des contours (j'ai réussi Saturne.jpg une fois, mais sans succès ensuite !). Note : avec DirectX, ce problème est pris en compte en indiquant une plage de couleur pour la transparence, ce qui est plus pratique !
- Les chocs à n billes simultanées ne marchent pas très bien, les chocs en 3D ne sont pas gérés (le système de projection est trop simpliste et n'est pas cohérent avec la détection précise des chocs). Il y a un décalage même dans les chocs à 2 billes.
- L'économiseur ne quitte pas immédiatement (quelques dixièmes voire quelques secondes), les calculs de bitmap transparent ont tendance à bloquer les messages du système, notamment les évènements MouseMove permettant de quitter l'application. Parfois, la lecture simultanée de fichier audio est perturbée. La boucle d'animation devrait être externe au code de simulation, c'est faisable et cela corrigerait probablement ce défaut. Note : sous Windows 2000, ce défaut est de moindre importance.
- Les bitmaps chargés à partir d'un fichier ont des petits défauts autour de la couleur de transparence : il reste des pixels verts (la taille des images est diminuée, sinon la couleur de transparence ne marche carrément plus du tout). Il y a parfois un trait en trop sur les images de fond. Le code est trop complexe pour corriger ces défauts.
- Package d'installation en VB .NET :
http://patrice.dargenton.free.fr/gravity/gravitynetsetup.msi (1.6 Mo)
- Pour utiliser des images supplémentaires avec la version VB6 (space_*.jpg et star_*.bmp), placez-les dans le répertoire contenant Gravity.scr. Avec la version en VB .NET, vous pouvez choisir le filtre de sélection des images et même indiquer un sous-répertoire.
http://patrice.dargenton.free.fr/gravity/morepictures.zip (10 Mo)
La couleur de transparence doit être verte avec la version en VB6 : 65280 = RGB(0, 255, 0) = &HFF00
Avec la version en VB .NET, la couleur de transparence est définie par un pixel sur un coin de l'image.
L'image de fond est affichée de façon cyclique si elle fait moins de 8 cm de haut avec la version en VB6.
Il y a plein d'images de galaxies ici : http://gallery.future-i.com/space/
- Fichier gravity.scr seul (copiez VB6FR.DLL dans C:\Windows\System ou \System32 pour NT si ce n'est pas déjà fait) :
http://patrice.dargenton.free.fr/gravity/gravity.zip (91 Ko)
- Les sources en VB6 sont basées sur le prototype créé par Don Bradner et Jim Deutch (JDSaver.Bas) :
https://codes-sources.commentcamarche.net/source/1743 (80 Ko)
- MyScreenSaver est un prototype d'économiseur d'écran minimal en VB6 : il est conçu pour servir de base à votre propre écran de veille :
http://patrice.dargenton.free.fr/gravity/myscreensaversrc.zip (20 Ko)
- Package d'installation avec le RunTime VB6 dont VB6FR.DLL :
http://patrice.dargenton.free.fr/gravity/gravityinst.zip (1.6 Mo)
- 1ère version en C sous DOS développée entre décembre 1992 et décembre 1994 (plein de démos scénarisées !) :
http://patrice.dargenton.free.fr/gravity/gravitedos.zip (39 Ko)
Versions suivantes
https://github.com/PatriceDargenton/Gravity/blob/master/Changelog.md
Version 2.02 du 15/09/2013
- Passage en VB 2010
- Ajout d'un paramètre pour placer des planètes dans l'axe vertical en 3D ;
- Passage en VB 2008 (remplacement des AppSettings("*") par My.Settings.*).
Version 2.00 du 03/09/2002 : Première version en VB.Net
Versions précédentes en VB .NET à partir de VBNetScreenSaver
https://codes-sources.commentcamarche.net/source/3162
à partir du code en C# de Tran Khanh Hien : "TKHScreen Saver.zip"
https://codes-sources.commentcamarche.net/source/2425
La sauvegarde de la configuration a été faite à partir de l'article : "Creating Your Own Dynamic Properties and Preserve Property Settings in Visual Basic .NET" de Steve Hoag de Microsoft Visual Studio Team.
https://codes-sources.commentcamarche.net/source/3944
Origine de la classe Win32Support en C# que j'ai traduis en VB .NET :
www.codeguru.com/cs_graphics/flicker_free.html
https://codes-sources.commentcamarche.net/source/4094
Un écran de veille qui choisi des images de fond et de sprite au hasard.
Note : le ratio H/V des images de fond n'est pas respecté dans cette version, voir la correction apportée dans Gravity.NET
Pour avoir plus de détails sur ces différentes versions, voir :
http://patrice.dargenton.free.fr/gravity/VB6ToVBNet.html
https://codes-sources.commentcamarche.net/source/4488
https://codes-sources.commentcamarche.net/source/1743
* Nouveau : le code source est entièrement disponible (et plus seulement le prototype).
* Gestion des images jpg au hasard également pour le fond (et le nombre d'images n'est plus limité).
* Test plus pratique des images Star_*.bmp grâce à l'option : use only extra planet (mais de toute façon, il n'y a plus d'images pré-chargées, car cela ne marchait pas en couleur 16 bits).
(l'économiseur quitte proprement maintenant, mais pas toujours immédiatement !).
C'est + rapide, possibilité de changer les images (space.bmp : fond d'écran et star01.bmp à 09.bmp : ces fichiers facultatifs sont tirés au hasard avec les images par défaut), il y a toujours un problème d'instance qui reste parfois en mémoire.
Cette démo a été créée par Georges Hoynant (HoynantG@aol.com, "Des orbites en forme de rosette aux orbites en forme de pelotte", Sciences99-2, 1999). Il me l'a envoyé à la suite d'une question posée dans un forum d'astronomie au sujet de l'existence d'orbites en 3D. Les sources en Quick Basic 4.5 sont fournies !
Démo en Français : http://patrice.dargenton.free.fr/gravity/DemoOrb3DFr.zip (820 Ko)
Lancez orb.exe, attendez 5 secondes, appuyez sur espace pour remettre en français puis entrée, suivez alors les instructions.
Démo en anglais : http://patrice.dargenton.free.fr/gravity/DemoOrb3DEng.zip (820 Ko)
Run orb.exe, wait 5 seconds and press Enter.
Pour consulter ou modifier les sources, Quick Basic 4.5 peut être téléchargé ici : http://ftp.cc.uoc.gr/qbasic/qb45.zip
Les sources en Quick Basic 4.5 : http://patrice.dargenton.free.fr/gravity/DemoOrb3DSrc.zip