Si vous avez testé votre animation, vous avez remarqué que les clips ont l'air bien placés mais il apparaissent un peu n'importe comment.
Cela est dû au fait que vos clips ont été créés à des niveaux fixes, et on verra donc toujours le clip 6 au-dessus du clip 5, 4 ou 3...
Nous allons donc (dans notre fonction
placer()) cacher les clips qui ne devraient pas être visibles (via la propriété
_alpha).
Pour faire ça, il existe plein de méthodes : j'ai choisi de vous en exposer une mais il y en a peut-être d'autres, meilleures ou plus simples à mettre en oeuvre.
Toute cette partie ne s'applique qu'à un cube qui tourne autour de son centre. Pour des formes ou pour un centre différent, il faudra donc éditer ce code ou bien même trouver une autre solution.
Pour réaliser ce code, je suis parti du constat que, quelle que soit la rotation de notre cube :
- on ne voit au maximum que 3 faces ;
- et quand on voit 3 faces, il n'y a qu'un seul sommet commun.
Le but est d'arriver à déterminer quel est ce sommet...
Je suis parti du principe qu'en général, la moitié des points avaient une variable
z négative (car
centreZ = 0), et donc que l'autre moitié avait une variable
z positive.
Le point que nous cherchions était donc dans ce deuxieme groupe.
Puis j'ai remarqué que dans le plan défini par les vecteurs

, notre point était toujours plus proche du centre (dans notre cas (100,100)) que les autres.
J'ai donc créé une boucle qui fait des vérifications sur nos 8 points.
Si la variable
z du point est positive :
je compare la distance entre le point et le centre avec une variable
dismin, si elle est plus petite, je l'enregistre dans la variable
dismin, et j'enregistre le numero du point dans une autre variable.
En code, ça nous donne ça :
Code : Actionscript 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | var dismin:Number = 1000 // Un grand nombre pour commencer.
var num:Number; // Variable pour enregistrer le numéro du point.
var dis:Number;
var disX:Number;
var disY:Number;
for(var i:Number=1;i<=8;i++){ // boucle du point 1 au point 8.
var pts:MovieClip = this['point'+i] // Raccourci pour accéder à la variable this['point'+i];
if(pts.z > 0){ // si la variable 'z' est positive.
disX = pts.x-centreX // Raccourci pour avoir la distance en abscisse.
disY = pts.y-centreY // Raccourci pour avoir la distance en ordonnée.
dis = Math.sqrt(disX*disX+disY*disY) // Formule de Pythagore pour déterminer la longueur de l'hypoténuse d'un triangle rectangle.
if(dis < dismin){ // Si la distance est inférieure à 'dismin'.
dismin = dis // On actualise 'dismin'.
num = i // On sauvegarde le numéro du point.
}
}
}
|
Voilà : nous savons maintenant quel est ce point, nous n'avons plus qu'à actualiser la propriété
_visible de nos 6 clips pour terminer :
Code : Actionscript1
2
3
4
5
6
7
8 | clip1._visible = (num == 1 || num == 2 || num == 5 || num == 6)
// Notre clip1 est situé entre les points 1, 2, 3 et 4. Donc si l'un d'eux est notre point principal, le clip devra être visible.
// Les '||' signifient 'ou', donc la formule (num == 1 || num == 2) nous renverra True si num=1 <souligne>ou</souligne> si num=2, sinon elle nous renverra False.
clip2._visible = (num == 2 || num == 3 || num == 6 || num == 7)
clip3._visible = (num == 3 || num == 4 || num == 7 || num == 8)
clip4._visible = (num == 4 || num == 1 || num == 8 || num == 5)
clip5._visible = (num == 1 || num == 2 || num == 3 || num == 4)
clip6._visible = (num == 5 || num == 6 || num == 7 || num == 8)
|
Voilà, c'est fini : vous pouvez tester.
Si tout marche bien, magnifique, vous avez réussi

sinon, euh... vous avez dû faire une erreur quelque part.

Et puis je n'ai pas trop envie de vous donner un récapitulatif, le but c'est d'avoir compris et non que l'animation marche (enfin, un peu quand même aussi

).