Defilemedia : composant as3 de gestion de galerie de media + class debugtrace de debugging évolué

Soyez le premier à donner votre avis sur cette source.

Vue 12 259 fois - Téléchargée 977 fois

Description

la dernière version du composant est la
http://www.flashkod.com/codes/WHEELMEDIA_46082.aspx
amélioration de la classe debugTrace
utilisation des classes de TOP30 wheel et side http://www.flashkod.com/codes/CLASS-WHEEL-SIDE_46028.aspx

petit composant AS3 gérant une galerie de médias images et vidéos sur la base d'un fichier XML. Ce composant gère des évènements de chargement et d'un média sélectionné.
C'est en fait un bandeau de type TileList amélioré. les média défilent sur une roue, soit en fluide ou soit en pas à pas selon des paramètres du composant.
La structure du composant s'est inspiré du tutorial en anglais sur la création de composant en AS3 qu'on peut trouver à cette adresse :
http://www.adobe.com/devnet/flash/articles/creating_as3_components.html

demo du composant defileMedia ici :
http://yvars.lamarmite.fr/testClip.html

version complète du code la :
http://yvars.lamarmite.fr/defileMedia.zip

restriction de 1 mega pour le zip !!

Source / Exemple :


// je ne donnerais que les méthodes et propriété du composant, 
// sachant que les sources sont disponibles dans les archives.

// ----------------------------------------------------
// - Tomboul (tomboul@lamarmite.fr) http://ww.lamarmite.fr
// - 02/2008
// - composant defileMedia
// ----------------------------------------------------
//
// visible : http://yvars.lamarmite.fr/testClip.html
//
// ----------------------------------------------------
//
// Package : marmite
// class : public class defileMedia
// Héritage defileMedia -> UIComponent -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object 
//
// Version du langage :  ActionScript 3.0 
// Version du lecteur :  Flash Player 9.0.28.0 
//
// Public Propriétés
// -----------------
// 	infos Média soit en texte ou dans un fichier XML (voir defileMedia.xml)
//	>>> defileMediaXml:XML;
//	>>> xmlFile:String;
//
// 	incrément de défilement
// 	cet incrément pourra être modifié pour
// 	régler la vitesse de défilement avec la souris
// 	si il est égal à 0, le mode de défilement se fait 
// 	en pas à pas à chaque click de souris
// 	et lance un évènement à l'arrivée du média au centre
//	>>> incr:Number=-1;
//
// 	coefficient de sensibilité pour maitriser la vitesse
// 	du défilement avec la souris
//	>>> sensible:Number=16;
//
// 	défilement plat ou en demi cercle
//	>>> defilementPlat:Boolean=false;
//
// 	sens défilement vertical ou horizontal
//	>>> sensDefilement:String;
//		
// 	cote max du média (horizontal ou vertical)
//	>>> coteMax:Number;
//
// trace groupée pour class debugTrace via l'appli 
// utilisant le composant
//	>>> debug:Boolean
//
//	chaine de mémorisation des traces (en lecture seulement)
//	>>> debugStr:String
//
// Public Méthodes 
// -----------------
//
// 	CONSTRUCTEUR DU COMPOSANT
// 	>>> defileMedia():void {
//
// 	avance sur un media numéroté
// 	>>> goToMedia(numMedia:uint=0) {		
//
// 	avance sur le prochain
// 	>>> goToNextMedia() {
//
// 	avance sur le précédent
// 	>>> goToPrevMedia() {
//
// 	avance sur le dernier
// 	>>> goToLastMedia() {
//
// 	avance sur le premier
// 	>>> goToFirstMedia() {
//
// Evénements
// -----------------
//
// 	selection media
// 	>>> MEDIA_SELECTED:String = "mediaSelected";
// 		XML contenant les infos du media selectionné
//		>>>	mediaData:XML;
//
// 	chargement fichier XML media
// 	>>> MEDIA_LOADED:String = "mediaLoaded";
// 		object composé 
// 			d'un boolean (result)
// 			d'un message string (error)
//		>>> mediaOK:Object;
//
// --------------------------------------------------------------------------

Conclusion :


C'est ma première source en flash que je dépose.
Je suis auto-didacte en flash, j'ai été programmeur il y a une quinzaine d'année du temps du minitel, aujourd'hui je suis musicien et doit faire des sites pour me faire connaitre, d'ou ce come-back vers mon ancien gagne-pain.
Après avoir bien pompé ici et là, ce qui m'a permis de sérieusement progresser, je me suis senti redevable.
J'espère que ces sources pourront éclairer sur la création de composant en AS3. A ce jour (février 2008) il n'y a pas beaucoup de doc la dessus hormis ce tutorial très complet et très bien fait :
http://www.adobe.com/devnet/flash/articles/creating_as3_components.html
Il est aussi inclus une class de trace relativement basique

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_tomboul
Messages postés
27
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
26 mai 2009
-
Tiens marrant, mon temps d'exécution est à 1968 !! décidement ça me colle à la peau ;-)

Top30, je suis puper impressionné par ta rapidité à pisser du code !!!
Je m'incline,
OK j'ai fait une grosse erreur je devrais m'occuper de la position qu'après avoir tester la longueur et je devrais mettre un pointeur "child" sur __mediaList [i];

Mais je continue à tenir tête face aux puissant Top30 !!
Dans une de tes deux fonctions (__1condition_puisSiTrue_1seuleAutreCondition) pour rester rigoureux, si (length>0) il faut ajouter :
child.visible = true ;
Et pour être plus proche de mon composant il faut reduire l'alétoire de la longueur à 100
(longueur qui sera souvent utilisé pour un media reduit)

package
{
import flash.events.Event ;
import flash.events.TimerEvent ;
import flash.display.Sprite ;
import flash.utils.Timer ;
import flash.utils.getTimer ;
//
//
public class SpeedTest
extends Sprite
{
private var __mediaList : Array = [];
private var __testsQty : uint = 500000 ;
private var __startTime : uint = 0 ;
private var __direction : String = '' ;
private var __testName : String = '' ;
//
//
public function SpeedTest () : void
{
__mediaList = [];
while (__mediaList.length < 50 ) __mediaList.push (new Sprite ());
//
var timer : Timer = new Timer (1000, 5);
timer.addEventListener ('timer', runTests );
timer.start ();
}
//
//
public function runTests ($e : TimerEvent ) : *
{
var timer : Timer = Timer ($e.target);
switch (timer.currentCount )
{
case 1 : return __toujours2conditions ('TomBoul');
case 2 : return __1condition_puisSiTrue_3conditions ('Top30');
case 3 : return __1condition_puisSiTrue_1seuleAutreCondition ('Top30');
case 4 : return __1conditionPuis2conditions ('TomBoul');
case 5 : return __1conditionPuis2conditionsAccesPointeur ('TomBoul');
}
return null ;
}
//
//
public function __toujours2conditions ( $author:String ) : *
{
__testStart ($author, "__toujours2conditions");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
if (direction == "horizontal")
{
__mediaList [i].x = 10 ;
__mediaList [i].width = length;
} else
{
__mediaList [i].y = 10;
__mediaList [i].height = length;
}
//
if(length>0)
{
__mediaList [i].visible = true;
} else
{
__mediaList [i].visible = false;
}
}
__testEnd ();
return null ;
}
//
//
public function __1conditionPuis2conditions ( $author:String ) : *
{
__testStart ($author, "__1conditionPuis2conditions");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
__mediaList [i].visible = false;
if(length>0) {
if (direction == "horizontal")
{
__mediaList [i].x = 10 ;
__mediaList [i].width = length;
} else
{
__mediaList [i].y = 10;
__mediaList [i].height = length;
}
__mediaList [i].visible = true;
}
}
__testEnd ();
return null ;
}
//
//
public function __1conditionPuis2conditionsAccesPointeur ( $author:String ) : *
{
__testStart ($author, "__1conditionPuis2conditionsAccesPointeur");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
if(length>0) {
if (direction == "horizontal")
{
child.x = 10 ;
child.width = length;
} else
{
child.y = 10;
child.height = length;
}
child.visible = true;
}
}
__testEnd ();
return null ;
}
//
//
public function __1condition_puisSiTrue_3conditions ($author:String ) : *
{
__testStart ($author , "__1condition_puisSiTrue_3conditions");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
//
if (length > 0)
{ var isH : Boolean (direction 'horizontal' );
var axe : String = (isH? 'x' : 'y' );
var siz : String = (isH? 'width' : 'height' );
//
child [axe] = 10 ;
child [siz] = length ;
child.visible = true ;
}
}
__testEnd ();
return null ;
}
//
//
public function __1condition_puisSiTrue_1seuleAutreCondition ($author:String ) : *
{
__testStart ($author, "__1condition_puisSiTrue_1seuleAutreCondition");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
//
if (length > 0)
{
if (direction == 'horizontal' ) __setMediaH (child, 10, length);
else __setMediaV (child, 10, length);
child.visible = true ; // tomboul
}
}
__testEnd ();
return null ;
}
//
//
private function __setMediaH ($child : Sprite, $pos : Number, $size : Number ) : void
{
$child.x = $pos ;
$child.height = $size ;
}
//
//
private function __setMediaV ($child : Sprite, $pos : Number, $size : Number ) : void
{
$child.y = $pos ;
$child.width = $size ;
}
//
//
private function __testStart ($id : String, $fonc : String ) : void
{
__testName = $id ;
__startTime = getTimer ();
//
trace ('Test ' + $id + "(" + $fonc + ') : START');
}
//
//
private function __testEnd () : void
{
var id : String = __testName ;
var time : uint = getTimer () - __startTime ;
//
trace ('Test ' + id + ' : END');
trace ('fonction exécutée ' + __testsQty + ' fois en ' + time + ' ms.' );
trace ('' );
}
}
}

affiche :

Test TomBoul(__toujours2conditions) : START
Test TomBoul : END
fonction exécutée 500000 fois en 1781 ms.

Test Top30(__1condition_puisSiTrue_3conditions) : START
Test Top30 : END
fonction exécutée 500000 fois en 2076 ms.

Test Top30(__1condition_puisSiTrue_1seuleAutreCondition) : START
Test Top30 : END
fonction exécutée 500000 fois en 1500 ms.

Test TomBoul(__1conditionPuis2conditions) : START
Test TomBoul : END
fonction exécutée 500000 fois en 2081 ms.

Test TomBoul(__1conditionPuis2conditionsAccesPointeur) : START
Test TomBoul : END
fonction exécutée 500000 fois en 1484 ms.

En les cas tout merci à toi et BananaTree, j'apprends beaucoup avec vous ...
top30
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010
-
package
{
import flash.events.Event ;
import flash.events.TimerEvent ;
import flash.display.Sprite ;
import flash.utils.Timer ;
import flash.utils.getTimer ;
//
//
public class SpeedTest
extends Sprite
{
private var __mediaList : Array = [];
private var __testsQty : uint = 500000 ;
private var __startTime : uint = 0 ;
private var __direction : String = '' ;
private var __testName : String = '' ;
//
//
public function SpeedTest () : void
{
__mediaList = [];
while (__mediaList.length < 50 ) __mediaList.push (new Sprite ());
//
var timer : Timer = new Timer (1000, 3);
timer.addEventListener ('timer', runTests );
timer.start ();
}
//
//
public function runTests ($e : TimerEvent ) : *
{
var timer : Timer = Timer ($e.target);
switch (timer.currentCount )
{
case 1 : return __toujours2conditions ('TomBoul');
case 2 : return __1condition_puisSiTrue_3conditions ('Top30');
case 3 : return __1condition_puisSiTrue_1seuleAutreCondition ('Top30');
}
return null ;
}
//
//
public function __toujours2conditions ( $author:String ) : *
{
__testStart ($author);
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ());
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
if (direction == "horizontal")
{
__mediaList [i].x = 10 ;
__mediaList [i].width = length;
} else
{
__mediaList [i].y = 10;
__mediaList [i].height = length;
}
//
if (length > 0)
{
__mediaList [i].visible = true;
} else
{
__mediaList [i].visible = false;
}
}
__testEnd ();
return null ;
}
//
//
public function __1condition_puisSiTrue_3conditions ($author:String ) : *
{
__testStart ($author);
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ());
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
//
if (length > 0)
{
var isH : Boolean (direction 'horizontal' );
var axe : String = (isH? 'x' : 'y' );
var siz : String = (isH? 'width' : 'height' );
//
child [axe] = 10 ;
child [siz] = length ;
child.visible = true ;
}
}
__testEnd ();
return null ;
}
//
//
public function __1condition_puisSiTrue_1seuleAutreCondition ($author:String ) : *
{
__testStart ($author);
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ());
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
//
if (length > 0)
{
if (direction == 'horizontal' ) __setMediaH (child, 10, length);
else __setMediaV (child, 10, length);
}
}
__testEnd ();
return null ;
}
//
//
private function __setMediaH ($child : Sprite, $pos : Number, $size : Number ) : void
{
$child.x = $pos ;
$child.height = $size ;
}
//
//
private function __setMediaV ($child : Sprite, $pos : Number, $size : Number ) : void
{
$child.y = $pos ;
$child.width = $size ;
}
//
//
private function __testStart ($id : String ) : void
{
__testName = $id ;
__startTime = getTimer ();
//
trace ('Test ' + $id + ' : START');
}
//
//
private function __testEnd () : void
{
var id : String = __testName ;
var time : uint = getTimer () - __startTime ;
//
trace ('Test ' + id + ' : END');
trace ('fonction exécutée ' + __testsQty + ' fois en ' + time + ' ms.' );
trace ('' );
}
}
}


// Affiche :

Test TomBoul : START
Test TomBoul : END
fonction exécutée 500000 fois en 1968 ms.

Test Top30 : START
Test Top30 : END
fonction exécutée 500000 fois en 1197 ms.

Test Top30 : START
Test Top30 : END
fonction exécutée 500000 fois en 916 ms.

//
Sachant que moi dans mes classes, je pratiquais la version 2 !
Dorénavant je pratiquerais la version 3....
cs_tomboul
Messages postés
27
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
26 mai 2009
-
Pour la poo, je m'incline et reste à l'affut de toutes infos pouvant améliorer mes compétences d'amateur !!!
pour Cédric Tabin que je me suis empressé d'aller voir c'est la :
http://www.mediabox.fr/b_MAX+:+Optimiser+son+code+AS3+avec+C%C3%A9dric+Tabin.html
BananaTree
Messages postés
337
Date d'inscription
vendredi 15 octobre 2004
Statut
Membre
Dernière intervention
2 novembre 2010
-
conceptuellement, les 2 codes ne sont pas optimums.
j'au toujours pas téléchargé le bidule, mais :

var hor : Boolean (sensDefilement "horizontal");
var axe : String = (hor? 'x' : 'y');
var size : String = (hor? 'width' : 'height');

normalement on devrait avoir :

private var _horizontal : Boolean;
private var _axe : String ;
private var _size : Number ;

ces valeurs devraient être mise à jour dans une action spécifique appellée par des mutateurs du type,
monBidule.horientation = monBidule.VERTICAL;

et logiquement par le constructeur pour l'initialisation des valeurs si pas déclarées par défaut...

là on est plus dans le byte code, on revient au bercail de la poo ;)
pour l'optimisation, cf. l'article de cédric tabin (perdu qq part sur la toile)
cs_tomboul
Messages postés
27
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
26 mai 2009
-
Pour relativiser ma réponse précédente à Top30 ...
J'ai regardé ce que tu fais et toute ta participation impressionnante à ce site et je m'incline totalement. Je t'applaudis des deux mains et des deux pieds et je vais étudier ta classe whell de plus près.
Cependant méfie toi quand même de l'écriture hyper-compressé et réfléchis aux conséquences que cela peut avoir à la compilation

Petit conseil de vieux qui a travaillé en assembleur IBM 8080 pendant 6 ans et en assembleur 68000 pendant deux ans mais relativement novice pour les nouvelles technologies telle que le langage orienté objet et l'environnement multimédia, et peu compétent pour la géométrie et les maths ...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_tomboul)