SuperColor devient XColor pour Flash 8
Par -Alexandre LEGOUT aka LAlex- le 20 septembre 2005, 14:31 - AS2 - Lien permanent
Pour le retour de mon blog, quelque peu perturbé par un changement de serveur (mais qui pulse bien, ca valait le coup
), je vous propose une version Flash 8 de ma classe SuperColor, qui devient pour l'occasion XColor (pour eXtended Color).
En effet, comme vous l'avez peut-être déjà vu, la classe Color est déclarée deprecated dans Flash 8. Et comme j'aime pas spécialement trop changer mes habitudes de codage (surtout quand elles sont efficaces), j'ai donc refactorisé la classe pour qu'elle puisse être utilisée strictement de la même manière dans Flash 8, sans utiliser une classe qui est à priori vouée à disparaitre... Il s'agissait donc de recréer le comportement de Color en utilisant sa remplacante : ColorTransform!
Etant donné que ma classe héritait de Color, il m'a alors suffit de réimplémenter les méthodes setTransform, getTransform, setRGB et getRGB pour que tout remarche exactement comme avant. C'est reparti pour du Tween facile sur les couleurs! ![]()
Par contre, cette classe ne marche que sur Flash 8, pour les "MX2004iens", il suffit de continuer à utiliser SuperColor... ![]()
Commentaires
Salut Lalex,
J'ai un doute sur la compabilité total entre Color et
ColorTransform.
Dans un objet "Transform" de Color (flash7), on a :
ra : %tage de rouge (entre -100 et 100) // defaut : 100
ga : %tage de vert (entre -100 et 100) // defaut : 100
ba : %tage de bleu (entre -100 et 100) // defaut : 100
aa : %tage d'alpha (entre -100 et 100) // defaut : 100
rb : décalage de rouge (entre -255 et 255) // defaut : 0
gb : décalage de vert (entre -255 et 255) // defaut : 0
bb : décalage de bleu (entre -255 et 255) // defaut : 0
ab : décalage d'alpha (entre -255 et 255) // defaut : 0
Et dans un objet ColorTransform (flash8), on a d'après la doc :
redMultiplier : Multiplication de rouge, (entre 0 et 1) // defaut : 1
greenMultiplier : Multiplication de vert, (entre 0 et 1) // defaut : 1
blueMultiplier : Multiplication de bleu, (entre 0 et 1) // defaut : 1
alphaMultiplier : Multiplication de transparence, (entre 0 et 1) // defaut : 1
redOffset : décalage de rouge (entre -255 et 255) // defaut : 0
greenOffset : décalage de vert (entre -255 et 255) // defaut : 0
blueOffset : décalage de bleu (entre -255 et 255) // defaut : 0
alphaOffset : décalage d'alpha (entre -255 et 255) // defaut : 0
Et dans ta classe, tu utilise la conversion suivante dans ta méthode setTransform(o) :
redMultiplier = ra / 100
greenMultiplier = ga / 100
blueMultiplier = ba / 100
alphaMultiplier = aa / 100
redOffset = rb
greenOffset = gb
blueOffset = bb
alphaOffset = ab
Or redMultiplier est compris entre 0 et 1 et pas -1 et 1.
(ie pour les autres Multiplier)
Et dans la méthode (par ex) :
/*** Set red percentage
* @param percent Between -100 and 100
*/
public function setRedPercent(percent:Number) {
var trans:Object = getTransform();
trans.ra = percent;
setTransform (trans);
}
On ne peut pas donner à percent une valeur négative
étant donné que tu utilise ColorTransform.
Bref j'espère me tromper car moi aussi j'avais une classe ColorPlus
inspirée de Penner que je voulais convertir pourFlash8..
Mais à cause de cette incompabilité entre Color et ColorTransform,
je suis resté bloqué.
++
@Tonio > Il semblerait que ColorTransform soit mal documenté car si j'utilise des valeurs négatives, l'effet est strictement le même que pour Color (et strictement le même que la configuration avancée de l'environnement auteur d'ailleurs...).
Par contre, ta remarque m'a fait mettre le doigt sur un petit bug de ma méthode setTransform, qui est maintenant rectifié... Merci!
C super, merci de ta confirmation..
Par contre g regarder ta version corrigé et du coups je ne voit pas pourquoi
tu fait ça :
public function setTransform(o) {au lieu de ça :var t = {ra:100, rb:0, ga:100, gb:0, ba:100, bb:0, aa:100, ab:0};
for (var p in o)
t[p] = o[p];
var ct:ColorTransform = new ColorTransform(t.ra/100, t.ga/100, t.ba/100, t.aa/100, t.rb, t.gb, t.bb, t.ab);
trace(ct);
_targetMC.transform.colorTransform = ct;
}
public function setTransform(o) {var ct:ColorTransform = new ColorTransform(o.ra/100, o.ga/100, o.ba/100, o.aa/100, o.rb, o.gb, o.bb, o.ab);
_targetMC.transform.colorTransform = ct;
}
Euhhhhhh, en fait j'viens ptéte de capter.....sorry.
Tu fait ça au cas ou on donne un objet o incomplet genre juste {ra:10}
c ça.
++
@Tonio> Exactement... Du genre setContrast par exemple, qui ne renseigne pas les alphas...
++ ^^
Le coup de recuperer les anciennes valeurs, oui, c'est un peu logique, mais je me demande si cela n'alourdit pas le process pour parametrer une couleur.
Je dis cela en pensant surtout aux tweens et en particulier aux multi-tweens.
En tous les cas, cela marche nickel avec ma classe Tweens.
Je ne pense pas que ça vaille le coup de remplacer la class Color dans nos codes existants. Le fait qu'elle soit deprecated devrait juste nous inciter à changer nos habitudes de codage.
Remarquez qu'on peut (presque) directement attaquer la propriété colorTransform. C'est peut-être plus efficace pour les tweens :
var ct = _targetMC.transform.colorTransform;ct.redMultiplier = 0.5;
_targetMC.transform.colorTransform = ct;
@Philippe> Le problème est que avec ton code, si on veut faire des Tweens, on est obligé de renseigner le onMotionChanged, etc... A moins de créer une classe ColorTween, qui prendrait en paramètre le clip sur lequel on doit appliquer les couleurs...
++ ^^
@Lalex> Oui mais une fonction comme setRedPercent sera plus efficace avec mon exemple. D'où l'intérêt de se convertir à l'utilisation directe des colorTransform...
@Philippe> Le but est surtout d'encapsuler des réglages tels que le contraste ou la luminosité. Du coup, autant aussi centraliser les propriétés "simples" également, afin de pouvoir faire des Tween sur n'importe quelle propriété indifféremment.
L'encapsulation déteriore la plupart du temps les performances, question de choix. Pour des applications simples, je pense qu'une classe telle que celle-là est largement suffisante, mais une application plus exigeante peut bien évidemment nécessiter de coder à plus bas niveau.
Dans le cas présent, je me suis contenté d'implémenter les méthodes setRGB, getRGB, setTransform, getTransform, afin de simplifier la refactorisation de la classe. Par contre, elle doit être optimisable en enlevant cette étape là, et en travaillant directement avec des ColorTransform dans les méthodes. Cela fera trés certainement l'objet d'une version à venir.
Mais quoi qu'il en soit, je continue de penser que l'API est bonne et bien pratique dans le cadre de Tweens, et que la nouvelle structure est particulièrement mal adaptée à cela. cela étant surtout du au fait que MovieClip.transform retourne une copie des transformations, et non pas une référence vers l'instance originale de la classe Transform... :\ S'habituer à ColorTransform? Je ne crois pas que ce soit nécessaire avec un telle classe, a moins de vouloir coder un PhotoShop!
Par contre, ColorMatrixFilter semble apporter des réglages d'une finesse inégalée, encore faut-il avoir une connaissance trés pointue de la gestion des couleurs dans un environnement RVB... que personnellement je n'ai pas :$... ou pas encore!
Ben après qq test de la class ColorTransform, pour moi, les valeurs négatives restent sans effet.. mais par contre, je peux dépasser la valeur 1 pour accentuer les multiplier de couleur..
un exemple :
//// Import
import flash.display.BitmapData;
import flash.filters.*;
import flash.geom.*;
//
// Instance
var MBitmapData:BitmapData = new BitmapData(400, 400, false, 0x00ffffff);
var MGlow:GlowFilter = new GlowFilter(0xffffff, .5, 30, 30, 2, 3, false, false);
var MDrop:DropShadowFilter = new DropShadowFilter(20, 45, 0xffffff, .8, 15, 15, 1, 3, false, false, false);
//
var brusch:MovieClip;
//
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(MBitmapData, this.getNextHighestDepth());
//
onEnterFrame = function () {
MBitmapData.draw(brush, new Matrix(0, 1, 1, 0, _xmouse, _ymouse), new ColorTransform(), 6);
MBitmapData.colorTransform(MBitmapData.rectangle, new ColorTransform(1, 1, 3, 1, 0, 0, 0, 0));
MBitmapData.applyFilter(MBitmapData, MBitmapData.rectangle, new Point(0, 0), MGlow);
MBitmapData.applyFilter(MBitmapData, MBitmapData.rectangle, new Point(0, 0), MDrop);
};
//
brush._visible = false;
//
Est-ce que ta classe Xcolor s'applique aux BitmapData?
hello,
n'ayant pas flash 8 je m'interesse a supercolor mais ton lien http://blog.lalex.com/post/2005/09/... est mort, ou puis je le trouver STP ?
Merci
Une simple recherche de "SuperColor" sur le blog t'aurais donné l'adresse http://blog.lalex.com/post/2004/08/19/SuperColor-03-%3A-le-contraste-en-plus
++ ^_^
Fil des commentaires de ce billet