
Voila, je m'étais fixé une scène à réaliser, avec la gestion de quelques interactions avec l'utilisateur pour faire l'apprentissage de sandy, pour cela j'ai réalisé une scène banale, le système solaire(enfin le soleil, la terre et la lune) avec une caméra fixe pointée sur le soleil.
Pour la construction de la scène pas de soucis, par contre pour gérer les interactions, voir ci dessous ...
Coté interaction, je voulais que lorsque l'utilisateur passe sa souris sur une des 3 sphères, celle-ci change de couleur et devient légérement transparente (changement de skin tout simplement) et lorsque le curseur n'est plus en contact avec la sphère qu'elle reprenne son skin original.
Pour cela, j'ai utilisé ObjectEvent.onRollOverEVENT et ObjectEvent.onRollOutEVENT. Ca marche ... étrangement, disons que si je bouge ma souris volontairement sur l'objet, ça fonctionne, la sphère change de skin, de même lorsque je sors volontairement le curseur de la zone.
Mais vu que mes planètes sont constamment en mouvement, il se peut qu'une sphere passe en dessous de mon curseur, et à ce moment là le "RollOver" ne fonctionne pas, ce cas n'est pas super génant, car l'utilisateur n'est pas le principal responsable, par contre le contraire l'est davantage, c'est lorsque l'utilisateur a deja fait un roll over sur une sphère, et que celle-ci via son interpolation se deplace hors de la portée du curseur sans que ca ne déclenche de "RollOut", du coup ma sphère garde le skin temporaire de sélection, et le seul moyen pour qu'elle récupère son skin c'est de repasser le curseur sur la sphere et de le faire sortir volontairement.
Ce problème ne se pose pas dans Flash à la base, si un clip passe en dessous du curseur sans que l'utilisateur bouge son curseur, l'évènement RollOver se produit bien et quand le clip sors de sous le curseur le RollOut se déclenche aussi.
Donc suite à ce problème, je me suis dit, qu'il falait que je code une fonction, qui permettrait de savoir quel objet est sous la souris à un instant t. La j'ai tenté en vain de calculer d'aprés la position de la souris sur le ClipScreen et la position de la caméra, un vecteur et de voir si y'avait une éventuelle collision entre la droite générée par le vecteur et une des BoundBox des objets de la scène, mais j'ai abandonné icon_redface.gif
Alors j'ai procédé autrement , j'ai fait un hitTest avec chaque clip de chaque surface en prenant soin de garder celui le plus proche de la caméra. Donc en gros je fait pour chaque face de chaque objet un hitTest (de MovieClip) sur les clips des surfaces de chaque objet du monde par rapport à la position de la souris sur le clip screen. Je me suis inspiré de la fonction 'gluPickMatrix' dispo sur l'api OpenGL, qui renvoie une liste des objets à la position du curseur, sauf que ma fonction 'pickAt' ne renvoie que l'objet le plus prés de la caméra, car le but c'est de sélectionner quelque chose de visible et non de caché.
Aprés avoir codé cette fonction et tenté de l'optimisé au mieux, j'ai décidé de comparé cette fonction au "onPressEVENT", et je gagne en moyenne 20fps. La on peut se dire que bon le calcule du pick n'est calculé que lors du clic, qu'en serait il si il fallait faire appel à cette fonction toute les 50 ms, bah de même je gagne en moyenne 20fps, comparé à la gestion avec les évènements rollover et rollout, tester vous même si dessous :
oufff


