Flash AS3 effet grossissant - problème retour dégrossissant

natalide78 Messages postés 7 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 21 novembre 2011 - 29 sept. 2011 à 16:24
natalide78 Messages postés 7 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 21 novembre 2011 - 21 nov. 2011 à 11:25
Bonjour,

Je souhaite faire un effet grossissant sur un clip en AS3.
Le problème est qu'au retour, l'effet se met ensuite à "scintiller" comme s'il n'arrêtait pas.

Voici le code AS3
function moveA(event:MouseEvent):void{
if(txta.scaleY<1.5)this.addEventListener(Event.ENTER_FRAME, grossir )
}
function nomoveA(event:MouseEvent):void{
if(txta.scaleY>1)this.addEventListener(Event.ENTER_FRAME, maigrir )
}
function grossir (e:Event):void{
if(txta.scaleY<1.5){txta.scaleY+=0.05;txta.scaleX+=0.05;}
}
function maigrir (e:Event):void{
if(txta.scaleY>1){txta.scaleY-=0.1;txta.scaleX-=0.1;}
}

en fait le retour se fait sur la 1ere Frame avec un stop();


Merci de votre aide,
Natalide78

6 réponses

aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
29 sept. 2011 à 22:39
Bonjour, a prime abord tu as une très mauvaise utilisation de l'enterframe.

Je t'invite a utiliser les tweeners pour réaliserton effet de loupe.
D'autre part fait attention a la gestion des ecouteurs et des erreurs.
Enfin nomme uniformement tes variables (une fois c'est "event" , l'autre "e")

PS c'est un peu plus rapide de faire
txta.scaleY=txta.scaleX-=0.1;


Cordialement
0
natalide78 Messages postés 7 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 21 novembre 2011
30 sept. 2011 à 16:44
Bonjour,

et merci pour la réponse.

J'ai pu modifier convenablement le cade grâce à tweenMax.

Cependant, il y a un effet que je n'arrive pas à contrôler, quand la souris survol le bouton et qu'il se déplace, selon la position de la souris, le bouton se met à saccader : grossit/maigrit.

Voici le code (je ne sais pas comment mettre le swf en copie)

stop();
btna.carrea.alpha=0;
btnb.carreb.alpha=0;
titrea.visible=false;
titreb.visible=false;

import flash.events.MouseEvent;
import com.greensock.*;
import com.greensock.easing.*;


function grossira(event:MouseEvent):void{
addChild(btna);addChild(titrea);
TweenMax.to(btna,0.2, {scaleX:1,scaleY:1, x:225, y:225, ease:Back.easeOut});
TweenMax.to(btna.carrea,0.2, {alpha:0.5, onComplete:finInterpolation});
function finInterpolation() {titrea.visible=true;}
}
function maigrira(event:MouseEvent):void{
TweenMax.to(btna.carrea,0.2, {alpha:0});
TweenMax.to(btna,0.5, {scaleX:0.5, scaleY:0.5, x:350, y:290, ease:Back.easeOut});
titrea.visible=false;
}
function grossirb(event:MouseEvent):void{
addChild(btnb);addChild(titreb);
TweenMax.to(btnb,0.2, {scaleX:1,scaleY:1, x:225, y:225, ease:Back.easeOut});
TweenMax.to(btnb.carreb,0.2, {alpha:0.5, onComplete:finInterpolation});
function finInterpolation() {titreb.visible=true;}
}
function maigrirb(event:MouseEvent):void{
TweenMax.to(btnb.carreb,0.2, {alpha:0});
TweenMax.to(btnb,0.5, {scaleX:0.5, scaleY:0.5, x:105, y:185, ease:Back.easeOut});
titreb.visible=false;
}
//ombre portée sur les boutons
import flash.filters.BitmapFilterQuality;
import flash.filters.DropShadowFilter;
var monFiltre:DropShadowFilter = new DropShadowFilter(); //Création du filtre
monFiltre.quality = BitmapFilterQuality.LOW; //Définition de la qualité du filtre
monFiltre.distance = 5; //Définition de la distance de l'ombre
monFiltre.angle = -30; //Définition de la direction de l'ombre
monFiltre.alpha = 0.8;//Définition de la transparence de l'ombre

btna.filters = [monFiltre]; //Applique le filtre à 'monObjet
btna.addEventListener(MouseEvent.MOUSE_OVER, grossira);
btna.addEventListener(MouseEvent.MOUSE_OUT, maigrira);

btnb.filters = [monFiltre]; //Applique le filtre à 'monObjet
btnb.addEventListener(MouseEvent.MOUSE_OVER, grossirb);
btnb.addEventListener(MouseEvent.MOUSE_OUT, maigrirb);



Merci d'avance pour votre aide,
natalide78
0
aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
30 sept. 2011 à 17:38
stop();
// il est de pratique de placer les imports en premier
import com.greensock.*; 
import com.greensock.easing.*;
import flash.events.MouseEvent; 
import flash.filters.BitmapFilterQuality; 
import flash.filters.DropShadowFilter;

// regarde la doc officiel pour connaitre les propriétés
var monFiltre:DropShadowFilter=new DropShadowFilter(5,-30,0,0.8,4,4,1,1);

btna.filters=btnb.filters=[monFiltre];
btna.carrea.alpha=btnb.carreb.alpha=0; 
titrea.visible=titreb.visible=false;

// tes ajouts a la scene ne doivent pas etre dans ta fonction evenementiel, sinon a chaque fois que tu passe la souris dessus il te les ajoutes
// si tu veux qu'il ne sois pas visible depuis le debut tu les met en visible=false
addChild(btna);
addChild(titrea);
addChild(btnb);
addChild(titreb);

btna.addEventListener(MouseEvent.MOUSE_OVER, grossira); 
btna.addEventListener(MouseEvent.MOUSE_OUT, maigrira);
btnb.addEventListener(MouseEvent.MOUSE_OVER, grossirb); 
btnb.addEventListener(MouseEvent.MOUSE_OUT, maigrirb);

function grossira(event:MouseEvent):void{
/*
il faut mettre des conditions car tu ne peux pas lancer des tween des que que tu survol l'objet
autrement dit il faut que tu vérifie:
1] si il est en train de faire un tween
2] et sinon  quel est l'etat du btn ( fin grossissement ou fin reduction)
*/
TweenMax.to(btna,0.2,{scaleX:1,scaleY:1,x:225 y:225,ease:Back.easeOut}); 
TweenMax.to(btna.carrea,0.2,{alpha:0.5, onComplete:finInterpolation});
}
// eviter d'imbriquer les fonctions
function finInterpolation():void{//manque void
titrea.visible=true;
}

/* d'une facon générale tu utilise trop de tween,
normalement tu devrais t'en sortir avec 4 tween dan tout ton code,
le reste c'est qu'un histoire de variavble différente

En gros faut reprendre tout le code et la logique
*/

function maigrira(event:MouseEvent):void{
TweenMax.to(btna.carrea,0.2,{alpha:0}); 
TweenMax.to(btna,0.5,{scaleX:0.5,scaleY:0.5,x:350,y:290,ease:Back.easeOut}); 
titrea.visible=false; 
} 

function grossirb(event:MouseEvent):void{ 
TweenMax.to(btnb,0.2,{scaleX:1,scaleY:1,x:225,y:225,ease:Back.easeOut}); 
TweenMax.to(btnb.carreb,0.2,{alpha:0.5,onComplete:finInterpolation});
}
// eviter d'imbriquer les fonctions
function finInterpolation():void{
titreb.visible=true;//manque void
} 

function maigrirb(event:MouseEvent):void{ 
TweenMax.to(btnb.carreb,0.2,{alpha:0}); 
TweenMax.to(btnb,0.5,{scaleX:0.5,scaleY:0.5,x:105,y:185,ease:Back.easeOut}); 
titreb.visible=false; 
}
0
natalide78 Messages postés 7 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 21 novembre 2011
3 oct. 2011 à 14:53
Bonjour,

Voici, j'ai 'nettoyé' comme je pouvais le code.
stop();
// il est de pratique de placer les imports en premier
import com.greensock.*;
import com.greensock.easing.*;
import flash.events.MouseEvent;
import flash.filters.BitmapFilterQuality;
import flash.filters.DropShadowFilter;
import flash.display.DisplayObject;
import flash.events.*;


// regarde la doc officiel pour connaitre les propriétés
var monFiltre:DropShadowFilter=new DropShadowFilter(5,-30,0,0.8,4,4,1,1);

btna.filters=btnb.filters=[monFiltre];
btna.carrea.alpha=btnb.carreb.alpha=0;
titrea.visible=titreb.visible=false;



btna.addEventListener(MouseEvent.MOUSE_OVER,grossir);
btnb.addEventListener(MouseEvent.MOUSE_OVER,grossir);


function grossir(event:MouseEvent):void
{
TweenMax.to(event.currentTarget,0.2,{scaleX:1,scaleY:1,x:225, y:225,ease:Back.easeOut,onComplete:finGrossir(event.currentTarget)});
//
}
function finGrossir(obj){
obj.addEventListener(MouseEvent.MOUSE_OUT,maigrir);
obj.removeEventListener(MouseEvent.MOUSE_OVER,grossir);
var carre;
var titre;
if (obj.name == 'btna'){carre=btna.carrea;titre=titrea;}
else{carre=btnb.carreb;titre=titreb;};
TweenMax.to(carre,0.2,{alpha:0.5});
titre.visible=true;
}
function maigrir(event:MouseEvent):void
{
var XX;
var YY;
if (event.currentTarget.name == 'btna'){XX=350,YY=290;}
else{XX=105,YY=185;};
TweenMax.to(event.currentTarget,0.5,{scaleX:0.5,scaleY:0.5,x:XX,y:YY,ease:Back.easeOut,onComplete:finMaigrir(event.currentTarget)});
}
function finMaigrir(obj){
obj.addEventListener(MouseEvent.MOUSE_OVER,grossir);
obj.removeEventListener(MouseEvent.MOUSE_OUT,maigrir);
var carre;
var titre;
if (obj.name == 'btna'){carre=btna.carrea;titre=titrea;}
else{carre=btnb.carreb;titre=titreb;};
TweenMax.to(carre,0.2,{alpha:0});
titre.visible=false;
}


J'ai par contre toujours 2 pb :
1- j'ai un calque qui reste en dessous de l'autre au moment où il grossit. Comment faire ? Je n'ai pas trouvé d'équivalent à z-index sur Flash
2- j'ai toujours ce problème de saccade quand la souris est au bord d'un des boutons. Je n'arrive pas à trouver la solution, même avec des if/else et add/remove des listener.

Merci,
Natalide78
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
6 oct. 2011 à 00:14
ca avance?
0
natalide78 Messages postés 7 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 21 novembre 2011
21 nov. 2011 à 11:25
Bonjour,

Je reprends le projet en cours actuellement depuis quelques jours.
Je n'ai pas plus avancé.

this.swapDepths(_root.getNextHighestDepth()); étant du AS2 apparemment ne fonctionne pas pour mon cas.
Je reste avec addchild() qui fonctionne bien, même si ce n'est pas forcément la solution.
J'ai toujours mon problème de bouton, lorsque l'on clique sur la bordure d'un bouton (ici une image), il grossit en rapetissit sans s'arrêter.

Je pensais qu'en mettant onComplete:finMaigrir(event.currentTarget)}, cela résoudrait le problème, mais non :)

Si vous aviez des petites idées...

Merci,
natalide78
0