Even though it is late Friday/early Saturday, I’ve got to write this one down:
Through an internal implementation of ActionScript 2.0’s compiler (which compiles code into ActionScript 1.0), Peter Hall discovered this little trick.
Here’s a shortened (and more obscured) example:
Actor.as:
class Actor extends MovieClip {
static var id = (id="__Packages.Actor")+
(Object.registerClass(id,Actor)?"":"");
public function Actor() {
trace("Action!");
}
}
To test:
import Actor;
attachMovie(Actor.id, "_mc", 1);
This keeps the number of static variables to a minimum (one). Of course, this trick works only if the compiler uses the “__Packages.” prefix to the class path internally, and may not work in future versions of Flash. Nevertheless, it’s a very cool trick.
9 replies on “Attaching movieclip class without library symbol”
Sorry, i’m french 😉
bon j’ai trouvé un petit truc sympa..
j’ai épuré le truc vraiment sympathiquement…
expliquation :
EN voulant faire une classe MovieMaker, j’ai pu remarquer qu’un Object.registerClass(“__Package.name”,name) est sans effet tout seul comme ça, en dehors de la classe car la classe doit etre “initialisé” par Flash, et pour se faire, il suffit d’appeller une fonction statique de cette meme classe.. ainsi, elle sera initialisé et prise en compte par flash 🙂 d’ou l’idée de mettre le registerClass dans une fonction statique et de l’appeller au début du script, juste apres les import
voila.. cool, vous verrez, plus besoin de propriété statique..
alors je vous montre :
////////////////////////////////////////////
mycustommc.as
dynamic class mycustommc extends MovieClip
{
//Cette seule fonction statique suffira
static function register()
{
Object.registerClass(“__Packages.mycustommc”,mycustommc);
}
function mycustommc()
{
this.beginFill(0xCCCCCC,50);
this.lineStyle(1,0xFF0000,100);
this.moveTo(0,0);
this.lineTo(10,0);
this.lineTo(10,10);
this.lineTo(0,10);
this.endFill();
}
function move(aX:Number,aY:Number)
{
this._x = aX;
this._y = aY;
}
}
////////////////////////////////////////////
et la, le code pour utiliser la classe :
////////////////////////////////////////////
import mycustommc;
//Appel la fonction statique.
mycustommc.register();
it1 = attachMovie(“__Packages.mycustommc”,”mycustommc1″,getNextHighestDepth());
it1.move(100,100);
it2 = attachMovie(“__Packages.mycustommc”,”mycustommc2″,getNextHighestDepth());
it2.move(300,100);
////////////////////////////////////////////
donc, ceci est juste un petit exemple.. après on pourra faire chacun nos chouettes classes moviemaker ànotre gout 😉
dites moi ce que vous en pensez!
yves
tu aimes bien les copié/collé ? 😀 lol
le reste de la discussion : http://www.tweenpix.net/archives/000251.html
Yes, I had a look at the French comments at TweenPix. One of them uses __proto__ to link on-stage movieclips to classes; this was first used in Flash 5. See my other site for more info: http://www.quantumwave.com/flash/vmc.html (I wouldn’t use this in AS2 coding though).
More like this, please…very nice.
John
Wow! both posts (Peter Joel and this) are great!
thanks to share this 🙂
Bravo… tu es un excellent programmeur yvele… utile avec ça…
…quelle gros pompeur !!! :-/
La prochaine fois, n’attends pas que quelqu’un indique la source de l’article… si vraiment tu veux être utile, cite l’auteur et mets le lien !
I put together a BBEdit regexp that will add the required code to all of your class files:
FIND:
^([^w]*)class ([.w]+)([^{]+){
REPLACE:
1class 23{r1tstatic var id = (id=”__Packages.2″)+(Object.registerClass(id,2)?””:””);
hein? mais j’ai rien copié du tout..
enfin j’ai fait copié collé de mon propre exemple c’est tout..
bah…
What a great trick, thanks! It solved a problem with my own work that was bugging me. I wrote a bit in my blog with a working fla example.
http://www.riordondesign.com/blog/peers/2005/01/attaching-movieclip-class-without.html