Gravity Screen Saver en VB .NET

 

Documentation : Gravity.html

http://patrice.dargenton.free.fr/gravity/index.html

http://patrice.dargenton.free.fr/gravity/GravitySrc.html

www.vbfrance.com/code.aspx?ID=4486

Par Patrice Dargenton : patrice.dargenton@free.fr

http://patrice.dargenton.free.fr/index.html

http://patrice.dargenton.free.fr/CodesSources/index.html

Date : 11/11/2012

 

Description. 1

Nouveauté : la version 2.0 est en VB .NET. 1

Projets. 2

Amélioration du code source. 2

Compensation des erreurs d'arrondi 2

Orbites en 3D, c'est possible ! 2

Petits défauts qui restent dans la version VB .NET. 3

Petits défauts dans la version en VB6 (corrigés dans la version VB .NET) 3

Téléchargements. 3

Téléchargement du Microsoft .NET Framework. 3

Version en VB6 et DOS. 4

Historique des versions. 4

Version 2.10 du 11/11/2012. 4

Version 2.00 du 03/09/2002 : Première version en VB.Net 4

Versions précédentes en VB .NET à partir de VBNetScreenSaver 4

Version 1.0 du 2/5/2002 : VBNetScreenSaver : Un écran de veille minimal en VB .NET (et C# aussi) 4

Version 2.0 du 15/5/2002 : VBNetScreenSaver2 : Un écran de veille configurable minimal en VB .NET.. 4

Version 3.0 du 08/07/2002 : VBNetScreenSaver3, suite : Gestion optimisée des sprites. 4

Version 4.0 du 21/07/2002 : VBNetScreenSaver4, suite : *.jpeg en fond d'écran et pour n sprites. 5

Tutorial de migration VB6 en VB .NET : un cas concret 5

Versions en VB6. 5

Version 1.0.4 : (03/09/2001) 5

Version 1.0.3 : correction du problème d'instance récalcitrante. 5

Version 1.0.2 : compilation en code natif 5

Version 1.0.1 : correction du problème du mapping des couleurs. 5

Démo sur les orbites en 3D.. 5

 

 

Description

Gravity Screen Saver est économiseur d'écran (é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.

 

Ce logiciel est libre et fourni avec le code source. La configuration (et l'installation) de l'écran de veille se fait simplement avec le bouton droit de la souris en utilisant l'explorateur sur le fichier Gravity.scr (version VB6) ou Gravity2.scr (version VB .NET). Si vous utilisez la version packagée en .NET, la configuration se fait sur le fichier "C:\Program Files\ORS Production\Gravity.NET Screen Saver\Gravity2.scr", et non pas sur le raccourci placé sur le bureau (c'est un petit problème avec la version .NET du packageur d'application, qui est un peu plus rigide pour créer un raccourci).

 

Nouveauté : la version 2.0 est en VB .NET

- 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.

 

Pré-requis pour les logiciels .NET :

Comme tout logiciel .NET, Gravity.NET requiert l'installation de la plate-forme .NET (le .NET Framework : 20 Mo, c'est en quelque sorte le runtime .NET, ou plus précisément la machine virtuelle .NET, l'équivalent multi-langage de Microsoft de la machine virtuelle Java). Elle est disponible gratuitement pour tous les systèmes d'exploitation Microsoft (de bureau) plus récent que Windows 95 :

 

Téléchargement du Microsoft .NET Framework

 

Projets

- 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.

 

Amélioration du code source

- 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.

 

Petits défauts qui restent dans la version VB .NET

- 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.

 

Petits défauts dans la version en VB6 (corrigés dans la version VB .NET)

- 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.

 

Téléchargements

- Gravity.NET : l'écran de veille chaotique en VB .NET (Gravity2.scr) :

www.vbfrance.com/code.aspx?ID=4486 (pour compiler les sources, il faut Windows NT ou XP)

 

- 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/

 

Version en VB6 et DOS

 

- 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) :

www.vbfrance.com/code.aspx?ID=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)

 

 

Historique des versions

 

Version 2.10 du 11/11/2012

- 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

 

Version 1.0 du 2/5/2002 : VBNetScreenSaver : Un écran de veille minimal en VB .NET (et C# aussi)

www.vbfrance.com/code.aspx?ID=3162

à partir du code en C# de Tran Khanh Hien : "TKHScreen Saver.zip"

 

Version 2.0 du 15/5/2002 : VBNetScreenSaver2 : Un écran de veille configurable minimal en VB .NET

www.vbfrance.com/code.aspx?ID=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.

 

Version 3.0 du 08/07/2002 : VBNetScreenSaver3, suite : Gestion optimisée des sprites

www.vbfrance.com/code.aspx?ID=3944

Origine de la classe Win32Support en C# que j'ai traduis en VB .NET :

www.codeguru.com/cs_graphics/flicker_free.html

 

Version 4.0 du 21/07/2002 : VBNetScreenSaver4, suite : *.jpeg en fond d'écran et pour n sprites

www.vbfrance.com/code.aspx?ID=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 :

Tutorial de migration VB6 en VB .NET : un cas concret

http://patrice.dargenton.free.fr/gravity/VB6ToVBNet.html

www.vbfrance.com/code.aspx?ID=4488

 

Versions en VB6

www.vbfrance.com/code.aspx?ID=1743

 

Version 1.0.4 : (03/09/2001)

* 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).

 

Version 1.0.3 : correction du problème d'instance récalcitrante

(l'économiseur quitte proprement maintenant, mais pas toujours immédiatement !).

 

Version 1.0.2 : compilation en code natif

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.

 

Version 1.0.1 : correction du problème du mapping des couleurs.

 

 

Démo sur les orbites en 3D

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