IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

comprendre la hierarchie as 3


Sujet :

ActionScript 3

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut comprendre la hierarchie as 3
    Bonjour,

    j'ai des difficultés à comprendre l'accès au clip en as3, j'ai deux jolies livre, as3 programmation séquentielle et orienté objet et le meilleur de as3.
    Quand je lis j'ai l'impression de bien tout comprendre mais passons à la pratique et la c'est autre chose...

    le but, fait un effet dock

    pour ca j'ai fais un clip modele dans ma biblio
    dans liaison -> class -->clip.Panneau

    sur ma scene principale j'ai mis dans classe du document
    main.Main

    mon fichier Panneau.as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package clip
    {
     
    	import flash.display.MovieClip;
    	import flash.text.TextField;
     
     
    	public class Panneau extends MovieClip
    	{
     
     
     
     
    		public function Panneau(nom:String,titre:String,posX:Number,posY:Number,reflet:Boolean)
    		{
    			this.name = nom;
    			this.x = posX;
    			this.y = 300;
    			pan_titre.text = titre;
    			if(reflet) addReflet();
     
    			hidePanneau();			
    		}
     
    		private function hidePanneau():void
    		{
    			this.alpha =0 ;
    		}
     
    		private function addReflet()
    		{
     
    		}//fin fonction
     
     
    	}//fin class
     
    }//fin package
    et mon fichier main.as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    package main
    {
     
    	import config.*;
    	import flash.display.*;
    	import flash.text.TextField;
     
     
    	public class Main extends Sprite
    	{
     
    		private var chargeur:	ConfigLoader;
    		private var site:		Site;
     
     
     
    		public function Main()
    		{
     
    			chargeur = new ConfigLoader("config.xml", completedConfigLoad);	
     
     
     
    		}//fin fonction
     
    		private function completedConfigLoad():void
    		{
    			site= new Site();
    			addChild(site);
    			site.ini();
    			return;
     
    		}
     
     
     
     
    	}//fin classe
     
     
    }// fin package
    ma classe site:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    package config
    {
     
    	import flash.display.*;
    	import clip.*;
    	import flash.text.TextField;
    	import fl.transitions.easing.*;
    	import fl.transitions.*;
    	import flash.utils.Timer;
    	import flash.events.TimerEvent;
    	import flash.events.*;
     
     
     
    	public class Site extends Sprite
    	{
     
    		public var panneau1:			Panneau;
    		public var panneau2:			Panneau;
    		public var panneau3:			Panneau;
    		public var panneau4:			Panneau;
    		public var panneau5:			Panneau;
    		public var panneau6:			PanneauPub;
    		public var panneau7:			PanneauPub;
    		public var sp_contenu:			Sprite;
    		public var sp_haut:				Sprite;
    		private var anime_accueil:		Tween;
    		private var decalage_ini_pann:	Number = 17;
    		private var decalage_pann:		Number = 6;
    		private var decalage_pann_pub:		Number = 6;
    		private var width_pann:			Number = 135;
    		private var width_pann_pub:		Number = 147;
    		private var timer:				Timer;
    		private var xmouse:				Number = mouseX ;
    		private var ymouse:				Number = mouseY;
    		private var hitTest:			Boolean;
    		private var scale			: Number = Number.NEGATIVE_INFINITY;
    		private var span:Number = 250;			
    		private var icon_min:Number = 135;
    		private var icon_size:Number = 135;
    		private var icon_max:Number = 160;
    		private var trend			: Number = 0;
    		private var posClipX:Number;
    		private var ratio:Number = Math.PI / 2 / span;
    		private var amplitude			: Number= 10;
    		private var posXclipInitial		:Array;
    		private static const  centreXStage:int = 1040/2;
     
    		public function Site()
    		{
    			madeSprite();
    		}//fin fonction
     
    		private function madeSprite():void
    		{
    			sp_haut = new Sprite();
    			sp_contenu = new Sprite();
    			sp_haut.x = 0;
    			sp_haut.y= 0;
    			sp_contenu.x = 0;
    			sp_contenu.y = 100;
    			addChild(sp_haut);
    			addChild(sp_contenu);			
    		}//fin fonction
     
    		public function ini():void
    		{
     
    			panneau1 = new Panneau("panneau1","antonin",decalage_ini_pann + width_pann / 2,-233, true);
    			sp_contenu.addChild(panneau1);
    			panneau2 = new Panneau("panneau2","antonin2",(decalage_ini_pann + width_pann/2 ) + decalage_pann + width_pann ,-233, true);
    			sp_contenu.addChild(panneau2);
    			panneau3 = new Panneau("panneau3","antonin3",(decalage_ini_pann + width_pann/2 ) + (decalage_pann + width_pann) *2,-233, true);
    			sp_contenu.addChild(panneau3);
    			panneau4 = new Panneau("panneau4","antonin4",(decalage_ini_pann + width_pann/2 ) + (decalage_pann + width_pann) *3 ,-233, true);
    			sp_contenu.addChild(panneau4);
    			panneau5 = new Panneau("panneau5","antonin5",(decalage_ini_pann + width_pann/2 ) + (decalage_pann + width_pann) *4 ,-233, true);
    			sp_contenu.addChild(panneau5);
    			panneau6 = new PanneauPub("panneau6","antonin5",(decalage_ini_pann + width_pann/2 ) + (decalage_pann + width_pann) *5 + decalage_pann_pub,-233), true;
    			sp_contenu.addChild(panneau6);
    			panneau7 = new PanneauPub("panneau7","antonin5",(decalage_ini_pann + width_pann/2 ) + (decalage_pann + width_pann) *5 + 2* decalage_pann_pub + width_pann_pub ,-104), false;
    			sp_contenu.addChild(panneau7);
    			posXclipInitial = new Array((panneau1.x - centreXStage), (panneau1.x - centreXStage), (panneau2.x - centreXStage), (panneau3.x - centreXStage), (panneau4.x - centreXStage), (panneau5.x - centreXStage), (panneau6.x - centreXStage), (panneau7.x - centreXStage), false);
    			showPanneauIntro();
     
     
     
    		}//fin fonction
     
    		public function showPanneauIntro():void
    		{
     
    			timer = new Timer(100,7);
    			timer.addEventListener(TimerEvent.TIMER, doAnimeAccueil);
    			timer.addEventListener(TimerEvent.TIMER_COMPLETE, endAnimeAccueil);
    			timer.start();
    		}//fin fonction
     
    		private function doAnimeAccueil(evt:TimerEvent):void
    		{
    			var numClip:Number=evt.target.currentCount;
    			anime_accueil = new Tween(this["panneau"+numClip],"y",Regular.easeIn,(this["panneau"+numClip].height /2 )+60,(this["panneau"+numClip].height /2 ),0.5,true);
    			anime_accueil = new Tween(this["panneau"+numClip],"alpha",Regular.easeIn,0,1,0.5,true);
    			anime_accueil = new Tween(this["panneau"+numClip].pan_titre,"alpha",Regular.easeIn,0,1,0.5,true);
    		}//fin fonction
     
    		private function endAnimeAccueil(evt:TimerEvent):void
    		{
    			timer.removeEventListener(TimerEvent.TIMER, doAnimeAccueil);
    			timer.removeEventListener(TimerEvent.TIMER_COMPLETE, endAnimeAccueil);
    			iniDockPan();
    		}//fin fonction
     
    		private function iniDockPan():void
    		{
     
    			sp_contenu.addEventListener(Event.ENTER_FRAME, moveDockPan);
     
    		}//fin fonction
     
    		private function moveDockPan(evt:Event):Boolean
    		{
    			var i:Number;			
    			var x:Number;
    			var dx:Number;
    			var dim:Number;
    			var largeur_dock:Number = this.parent.width;
     
     
    			// Mouse did not move and Dock is not between states. Skip rest of the block.
    			if((this.xmouse == this.mouseX) && (this.ymouse == this.mouseY) && ((this.scale <= 0.01) || (this.scale >= 0.99))) { return false; }
     
    			// Mouse moved or Dock is between states. Update Dock.
    			this.xmouse = this.mouseX;
    			this.ymouse = this.mouseY;
     
    			// Ensure that inflation does not change direction.
    			this.trend = (this.trend == 0 ) ? (checkBoundary() ? 0.25 : -0.25) : (this.trend);
    			this.scale += this.trend;
    			if( (this.scale < 0.02) || (this.scale > 0.98) ) { this.trend = 0; }
     
    			// Actual scale is in the range of 0..1
    			this.scale = Math.min(1, Math.max(0, this.scale));
     
     
     
    			// Hard stuff. Calculating position and scale of individual icons.
    			for(i = 1; i < 8; i++) {
    				dx = posXclipInitial[i] -  ( this.xmouse - largeur_dock/2)  ;
    				dx = Math.min(Math.max(dx, -this.span), this.span);
    				dim = this.icon_min + (this.icon_max - this.icon_min) * Math.cos(dx * this.ratio) * (Math.abs(dx) > this.span ? 0 : 1) * this.scale ;
    				this["panneau"+i].x = posXclipInitial[i] + this.scale * this.amplitude * Math.sin(dx * this.ratio) + centreXStage;
    				this["panneau"+i].scaleX = this["panneau"+i].scaleY =  (1 * dim / this.icon_size);	
    				if (i>1)swapChildrenAt(this["panneau"+(i-1)],this["panneau"+(i)]);
     
    			}
    			var target:DisplayObject = this["panneau"+i]; 
    			trace ( sp_contenu.getChildIndex(target));
    			trace("------------");
     
    			return true;
     
    		}//fin fonction
     
    		private function checkBoundary():Boolean
    		{			
    			if ((this.ymouse > 100 && this.ymouse < 500 && this.xmouse>6 && this.xmouse<1010) || (this.ymouse < -117 && this.ymouse > -335 && this.xmouse>216 && this.xmouse<517) )
    			{
     
    				return true;
    			}else{
    				return false;
    			}
    		}//fin fonction
     
     
    	}//fin class
     
    }//fin package
    j'espere que le code comme ca brut vous embêteras pas trop...
    tout fonctionne bien , mais par exemple dans la fonction moveDockPan, je veux connaitre le level de chaque occurence ( pour eviter quand on roll sur le dock qu'il y est le pb de recouvrement de clip devant -derriere)
    si je fais
    sp_contenu.getChildIndex(this["panneau"+i]) j'ai une erreur

    je comprend pas comment manipuler mes clips

    j'ai l'affreux sentiments mes clips sont pas là ou je crois , pour moi this["panneau"+i] est dans sp_contenu non?

    merci de votre aide
    antonin

    ps:si y'a du code pas clair dites le moi je tenterais d'expliquer ce que j'ai fais

    merci encore de votre patience

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 60
    Par défaut
    est-il possible d'avoir les fichiers du code, je ne comprends pas très bien comme ça !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    merci d'avoir répondu
    je joins un zip de tous mes fichiers.

    merci de prendre du temps pour me répondre

    fichier ici

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    bon j'ai reussi , je comprend pas tout mais ca marche...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    for(i = 1; i < 8; i++) {
     
    				dx = posXclipInitial[i] -  ( this.xmouse - largeur_dock/2)  ;
    				dx = Math.min(Math.max(dx, -this.span), this.span);
    				dim = this.icon_min + (this.icon_max - this.icon_min) * Math.cos(dx * this.ratio) * (Math.abs(dx) > this.span ? 0 : 1) * this.scale ;
    				this["panneau"+i].x = posXclipInitial[i] + this.scale * this.amplitude * Math.sin(dx * this.ratio) + centreXStage;
    				this["panneau"+i].scaleX = this["panneau"+i].scaleY =  (1 * dim / this.icon_size);	
     
    				sp_contenu.setChildIndex( (this["panneau"+i]), ( (dim_clip_avant>dim) ? 5:6) );
    				/*
    				if (dim_clip_avant>dim){
    					TweenMax.to(this["panneau"+i], 1, {dropShadowFilter:{color:0x000000, alpha:0, blurX:10, blurY:10}});
    				}else{
    					TweenMax.to(this["panneau"+i], 1, {dropShadowFilter:{color:0x000000, alpha:1, blurX:10, blurY:10}});
    				}
    				*/
     
    				dim_clip_avant=dim;
    			}
    par contre un truc que j'arrive pas à comprendre,
    j'ai :
    un package main : cette class s'occupe de charger le xml quand ok, ca lance la class site
    un package site: là, sont créé mes clips via un modele class Panneau, puis mis sur la scene

    je voudrais quand on clic sur un panneau que ça déclenche une function dans la class site pour arreter un ecouteur
    comment faire pour ciblé ca?

    merci de votre aide, je découvre as 3 et c'est vraiment interessant mais n'utilisant , avant, quasi jamais des class la route est longue

    antonin

  5. #5
    Membre expérimenté
    Homme Profil pro
    Creative Technologist
    Inscrit en
    Avril 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Creative Technologist

    Informations forums :
    Inscription : Avril 2007
    Messages : 126
    Par défaut
    Fait attention, je crois que tu confonds classe et objet. La classe est le "plan" de l'objet, le plan de la maison, et la classe n'existe pas vraiment en soit. Seul l'objet existe, c'est à dire la maison.
    Quand tu dis "je voudrais que ça déclenche une fonction dans la classe" c'est comme si tu disais que tu veux ouvrir la porte du plan de la maison... seul la maison a une porte, pas le plan... enfin... le plan à un plan de porte...

    Il y a le cas particulier des classes statiques, qui autorisent l'appel de leur fonctions directement. Souvent les débutants aiment bien utiliser des classes statiques, parce que cela leur permet de reproduire un schéma de programmation procédurale qu'ils connaissent... mais c'est ne pas respecter l'architecture objet, et aussi ne pas l'apprendre. Je te déconseille donc d'utiliser des classes ou méthodes statiques (au cas où ça te prendrais).

    Il faut que tu fasses attention au nommage de tes objets, au moins au début. Quand tu écris site = new Site() tu risques de faire une confusion entre "site", l'objet, et "Site", la classe. Pour pas se gourer, écrivons plutôt monSite = new Site(). Avec la classe Site, tu pourrais créer un autre objet, genre monAutreSite = new Site(). Là où je veux en venir, c'est que si tu essayes d'appeler directement une fonction de Site, est-tu en train de déclencher celle de monSite ou celle de monAutreSite? l'ordi ne peut pas savoir...

    donc, il faut que tu appelles la fonction de l'objet. Genre, monSite.maFonction(mesParamètres);

    Or ton problème est que monSite a été déclaré à l'intérieur de Main. Main connait donc monSite. Mais les objets de type Panneau n'ont pas de références à monSite, il ne le connaissent pas, et ne peuvent donc pas l'appeler.
    Il va falloir que tu passes une référence aux objets Panneau de ton objet monSite.

    A l'intérieur de Panneau, tu déclares donc une propriété qui te servira de référence à monSite. Cette propriété va être "égale" à monSite qui est de la classe Site. Tu écris donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private var refMonSite:Site;
    Maintenant il va falloir renseigner cette variable. Pour l'instant, elle est "null", elle n'est égale à rien.
    Au moment où tu crées un Panneau dans Site, (new Panneau() ) tu vas passer en plus des autres paramètres, un paramètre qui sera la référence à monSite.
    Or tu crées le panneau depuis monSite, c'est à dire qu'à l'intérieur de monSite, la référence à l'objet monSite se fait donc par le biais de l'opérateur "this". Dans monSite, this est égal à monSite. Dans panneau1, this est égal à panneau1, etc... Tu écris donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    panneau1 = new Panneau(this, "panneau1", etc...);
    Et dans le constructeur de Panneau, tu vas récupérer cette valeur, et l'associer à refMonSite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function Panneau(refSite:Site, nom:String, etc...) {
       refMonSite = refSite;
       etc...
    }
    A partir de là, l'objet panneau1 détient une référence à l'objet monSite (de la classe Site) via sa propriété refMonSite.

    Et n'importe où dans le code de Panneau, tu pourras faire un appel à monSite via cette référence, comme par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    refMonSite.maFonction(mesParamètres);
    A comprendre évidemment que maFonction() est une fonction de Site, ce tu cherchais à faire si j'ai bien compris.

    Voilà, j'espère que c'est assez clair...
    Notons au passage que générer panneau1, panneau2, etc.., ça ne se fait pas. Quand on doit générer plusieurs objets comme ça, on utilise une boucle et un tableau. A l'occasion, regarde la doc là-dessus. Ca devrait ressembler à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public var panneau:Array;
     
    public function Site() {
       panneau = new Array();
       for (var i:int=0; i<6; i++) {
          panneau[i] = new Panneau(this, "panneau"+i, etc...);
          ...
       }
       ...
    }
    Mais c'est peut-être encore un peu compliqué, regarde ça plus tard, à l'occasion.

    Bon courage

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    ouch ,
    comment te dire.... merci et encore merci, tu m'as bien éclairci les idées

    je vais repenser tout ça pour etre plus propre car effectivement j'avais commencer avec les public static var.....
    et comme je veux bien me prendre la tete sur l'as 3, c'est pas pour faire des choses crades

    pour l'utilisation des array c'est vrai que j'avais pas du tout cette habitude, mais faut changer

    je galere bien sur ce projet mais je pense que ca va etre tres profitable

    dès que j'ai qq chose de plus propres je mets ici

    encore merci
    a toute à l'heure

Discussions similaires

  1. [langage] comprendre une syntaxe particulière
    Par mat21 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2004, 18h12
  2. [Concept][JavaBeans] Comprendre ?
    Par nicoo dans le forum Langage
    Réponses: 15
    Dernier message: 08/12/2004, 08h01
  3. Hierarchie complexe et commande Shape
    Par blackspine dans le forum Général VBA
    Réponses: 2
    Dernier message: 07/08/2004, 12h49
  4. [Inclusion des fichiers] hierarchie
    Par Casp dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 09/07/2004, 12h43
  5. [Procédure][java] A n'y rien comprendre
    Par Stessy dans le forum SQL
    Réponses: 2
    Dernier message: 18/03/2004, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo