![]() |
septembre 24, 2005Premiers tests avec les FiltersCe week-end j'ai décidé de recoder certaines parties d'un site qu'on vient de terminer, afin de me faire la main un peu à flash 8. Pas encore certain qu'on va le publier ainsi tout de suite, mais peut-être. Dans ce site j'avais certains éléments qui devenaient flous, le truc était fait avec une version bitmap flou et une claire et un cross-fade entre les deux. Ça marchait assez bien quand même, mais je voulais m'amuser avec flash.filter.BlurFilter! Première grosse déception. J'étais convaincu que les classes de filtres utiliseraient un movieclip en composition indépendante, mais non, il faut les placer dans un array ".filters" directement sur le movieclip. Mais encore pire déception, modifier une instance de BlurFilter ne modifie pas le movie, il faut réappliquer après. Même impossible de le modifier directement dans l'array ".filters", il faut faire une copie de cet array et réappliquer tout l'array sur le movieclip. Et même encore pire, il faut savoir où dans l'array filters est situé notre blur! Tout ceci n'est que le résultat de premiers tests et quelques lectures sur le web, il y a peut-être des solutions que je n'ai pas encore découvertes! Imaginez le cas suivant. J'ai une navigation, ou lorsqu'on sélectionne un item, il se maximise et devient contenant pour le contenu de la section, tous les autres items deviennent flous. Et si on le ferme, tout redevient clair. J'applique donc ce filtre et mémorise sa position, puisque c'est le premier filtre il sera en position zéro: var blur:BlurFilter = new BlurFilter(5, 5, 3); mc.filters = new Array(blur); Et pour ensuite le modifier: var arr:Array = mc.filters arr[0].blurX = 0; mc.filters = arr; Mais imaginez que plus tard dans le projet, je revienne (et ai oublié mon filtre blur placé en position zéro) et décide d'appliquer un filtre dropshadow à tous mes éléments. Lorsque le filtre blur s'appliquera, il écrasera mon filtre dropshadow! Si je veux appliquer mon filtre dropshadow avant le blur, je devrai trouver tous les endroits ou j'applique mon blur pour changer le zéro par 1 pour le mettre en seconde position. Yeurk, pas très clean! Imaginez tout cela utilisé avec une classe de tweening, ou on se met à modifier intensivement des filtres pour une animation complexe. Un solution pour les classes de tween c'est d'ajouter un listener qui s'occupe de réappliquer le filtre sur le movie. On a un bon exemple ici chez shoe-box. À date, ce que j'ai trouvé de mieux c'est d'ajouter une méthode à ma classe de visuel (j'utilise toujours le movieclip en composition et j'ai une classe de base que j'étend pour mes éléments d'UI). La voici, ça pourra donner des idées à certains. Ça pourrait être plus performant: public function setFilter(pN:String,pF:Object):Void { var a:Array = _mc.filters; if(!_sfiltList[pN]){ _sfiltList[pN] = _mc.filters.length; } a[_sfiltList[pN]] = pF; _mc.filters = a; } Comme vous voyez, je sauvegarde dans un objet la position de mon filtre et peut les retrouver par la suite via le nom du filtre. Ainsi, il m'est possible de modifier un filtre par un nom en String directement. Exemple: var blur:BlurFilter = new BlurFilter(5, 5, 3); _monVisuel.setFilter("blur", blur); Je peux ensuite le modifier, en me fichant si c'est la première ou millième fois que je le fais, et en me fichant s'il y a d'autres filtres appliqués sur ce visuel. blur.blurX = 0;
_monVisuel.setFilter("blur", blur);
Ceci implique que j'ai une classe de visuel en composition. Mais cela pourrait être fait aussi pour ceux qui utilisent l'héritage ou pourrait tout simplement être fait dans une classe séparée qui ne fait rien d'autre que gèrer les filtres d'un movieclip. Ensuite, je n'ai eu qu'à faire quelques modifications à ma classe de tween pour être capable de tweener un filtre sans me faire chier. En réalité, j'ai fait une autre classe qui se met listener de mon tween et qui s'occupe d'updater mon setFilter, mais ça c'est une autre histoire et je ne suis pas encore certain de l'approche. Voilà. Je le rappelle, c'est une première expérimentation, si un truc important m'a échappé dites le moi! Posté par stef |septembre 24, 2005 03:42 PM | TrackBack Commentaires
Oui :) Franchement désagréable de devoir remettre à jour à chaque fois les filtes... pas moyen de faire un push() sur la propriété filters et d'avoir en temps réel une mise à jour de l'affichage :( Il y a moyen forcément d'arranger tout cela mais une gestion correct en natif de tout cela aurait était bien sympa :) Poster un commentaire
Vous souhaitez suivre les commentaires sur ce site ? Un fil RSS est disponible ici. |
![]() |