PDA

Volledige versie bekijken : Eigen MovieClip attachen zonder een instantie in de library


BernardV
%Europe/Berlin %926 %2006, 23:14
Ik werk zonder de flash IDE en zo zullen er (vele) anderen zijn die dat ook doen.
Het probleem wat je dan kunt krijgen is dat je "standaard" geen movieclips kunt hebben waar je een class aan toewijst, zodat je je eigen functies kan gebruiken in de movieclip.

Er zijn manieren zoals de prototype om functies toe te voegen, maar er is ook een manier om een "lege" movieclip aan te maken met al de functies die je wilt.

De basis is dit:

Bij het compilen zorgt flash ervoor dat alle classes die een movieclip extenden en aan een movieclip in de library gelinked zijn (class myMovie extends MovieClip) in de "__Packages" geregistreerd worden. Dit wetende en gebruik te maken van de Object.registerClass functie kunnen we leuke dingen doen :)

De basis is dat je zorgt dat er een string is die de positie in de "__Packages" aangeeft.
Stel je class heet MyMovie dan maak je een string aan "__Packages.MyMovie"


static var symbolName:String = "__Packages.MyMovie";
static var symbolOwner:Function = MyMovie;
static var symbolLinked:Boolean = Object.registerClass(symbolName, symbolOwner);


Zoals hierboven te zien is is er een string met de positie in de packages, daarbij is de symbolOwner gelijk aan de constructor van je class.
Als je deze beide hebt opgegeven gebruik je Object.registerClass om deze globaal te registreren in Flash.

Voorbeeld van een class die een MovieClip extend:


class MyMovie extends MovieClip
{
static var symbolName:String = "__Packages.MyMovie";
static var symbolOwner:Function = MyMovie;
static var symbolLinked:Boolean = Object.registerClass(symbolName, symbolOwner);

public function MyMovie()
{

}

public function drawCircle(x:Number, y:Number, r:Number, color:Number):Void {
beginFill(color);
moveTo(x+r, y);
curveTo(r+x, Math.tan(Math.PI/8)*r+y, Math.sin(Math.PI/4)*r+x, Math.sin(Math.PI/4)*r+y);
curveTo(Math.tan(Math.PI/8)*r+x, r+y, x, r+y);
curveTo(-Math.tan(Math.PI/8)*r+x, r+y, -Math.sin(Math.PI/4)*r+x, Math.sin(Math.PI/4)*r+y);
curveTo(-r+x, Math.tan(Math.PI/8)*r+y, -r+x, y);
curveTo(-r+x, -Math.tan(Math.PI/8)*r+y, -Math.sin(Math.PI/4)*r+x, -Math.sin(Math.PI/4)*r+y);
curveTo(-Math.tan(Math.PI/8)*r+x, -r+y, x, -r+y);
curveTo(Math.tan(Math.PI/8)*r+x, -r+y, Math.sin(Math.PI/4)*r+x, -Math.sin(Math.PI/4)*r+y);
curveTo(r+x, -Math.tan(Math.PI/8)*r+y, r+x, y);
endFill();
}
}



Deze class heeft een functie die een cirkel tekent.
Om een movieclip toe te voegen in flash met deze functie doe je het volgende:


import MyMovie;

var myMovie:MovieClip = this.attachMovie(MyMovie.symbolName,"myMovieInstance",this.getNextHighestDepth());


Nu de dit hebt gedaan zul je nog niets zien, aangezien je eigenlijk een lege movieclip hebt aangemaakt met alleen extra functies.
Maar als je nu zou aanroepen:

myMovie.drawCircle(100,100,100,0xFF0000);

Dan krijg je een cirkel met als middelpunt 100,100 en een diameter van 100pixels met een rode kleur.

Zo zijn er vele toepassingen te bedenken om een class te maken die je kan laden als een movieClip. Denk aan classes die al tweens hebben ingebouwd, als een fade, of verplaatsingen. Zelfs classes waarbij je het registratiepunt kan wijzigen en draaien om het opgegeven punt.

Ik hoop dat alles hier een beetje duidelijk is, mocht het niet zo zijn... vraag maar raak!

toadstool
%Europe/Berlin %989 %2006, 00:44
Niet echt met betrekking op wat je hier uitlegt, maar ik vraag me eigenlijk af wat het voordeel is om geen IDE te gebruiken? En beperk je jezelf dan niet enorm.. hoe maak je dan bv graphics?

BernardV
%Europe/Berlin %998 %2006, 00:57
Niet echt met betrekking op wat je hier uitlegt, maar ik vraag me eigenlijk af wat het voordeel is om geen IDE te gebruiken? En beperk je jezelf dan niet enorm.. hoe maak je dan bv graphics?

Nou het voordeel om geen IDE te gebruiken is dat ik geen vormgeving doe, ik ben alleen "code-klopper". Als ik alles in de flash IDE moet doen wordt het een waardeloze brij van classes. Een gemiddelde site bij me bestaat uit minimaal 20 classes.
Ook een groot voordeel is het compilen met MTASC, deze compiler is een stuk sneller dan de compiler van MM. Ik heb sites die compilen in enkele seconden in MTASC, maar doen er minimaal een paar Minuten over in de MM compiler.

En terug te komen op de graphics.. het ligt eraan wat je verstaat onder graphics, maar als het gaat om lijnen, cirkels, rechthoeken etc.. dan kun je die ook gewoon proggen.

Mocht je meer nodig hebben, dan kun je het altijd nog in de IDE maken en dan exporteren of een swf maken die de items al in de library heeft. Dit is dus niet volledig in code (http://www.oneilleurope.com/back2school/ , hier is zijn nog steeds alle tweens etc gewoon actionscript...) in zo'n site heb je nog steeds te maken met externe factoren. Maar ik probeer zoveel mogelijk in AS te doen.

Als je in de IDE een swf heb gemaakt met alle items in je library die je wilt, kun je met bv MTASC later de code erbij compilen. Dus wil ik later MovieClips (zoals hier beschreven) kan ik die gewoon in code schrijven en hoef ik ze niet van te voren te koppelen aan een library item.

Folkert
%Europe/Berlin %736 %2006, 18:40
en ik altijd maar denken dat de static var symbolOwner een Object was.

static var symbolOwner:Object = MyMovie;

BernardV
%Europe/Berlin %842 %2006, 21:13
en ik altijd maar denken dat de static var symbolOwner een Object was.

static var symbolOwner:Object = MyMovie;


Dat werkt ook prima, immers een Function is ook een Object :)

Dauntless
%Europe/Berlin %894 %2006, 22:28
Dat werkt ook prima, immers een Function is ook een Object :)
Maar niet elk object is een function ...

Anyway, deze ga ik bookmarken :).

Erwinzzz
%Europe/Berlin %898 %2006, 22:33
Allereerst moet ik zeggen dat ik enorm veel heb gehad aan deze post. Ik heb een class gemaakt waarin een preloader staat. Waneer hij klaar is fade hij uit. Nou doe ik simulate download, dan komt hij pas in het scherm waneer het klaar is(iig wel bij 100%) en fade dus ook meteen uit. Het laden duurt wel ff ik heb wel een grote foto erachter gezet. Maar hoe kan je bij dit soort dynamisch gecreerde mc's zorgen dat hij wel in het eerste frame meteen geladen word, zodat hij als preloader kan functioneren?

Emveedee
%Europe/Berlin %907 %2006, 22:47
Dus als ik t goed begrijp: symbolOwner is de classenaam?

En dus als ik die class myMovie heb,
is de 'url' ervan _Packages/myMovie/myMovie.as

Leuk om te weten :)

BernardV
%Europe/Berlin %909 %2006, 22:49
Wat je zou kunnen doen is dit (is niet 100% correct)

In je publish settings bij actionscript zorgen dat alle classes op frame 1 geladen worden.
Nadeel is dus dat alle AS code op frame 1 komt te staan.
Nu zorg je dat bij alle items in je library "export to first frame" uit staat en die sleep je bv allemaal op frame 2 (behalve voor de foto die je nodig hebt)
Nu worden alle assets geladen in frame 2, en zal frame 1 dus sneller geladen worden.

Wat ook nog een mogelijkheid is is in flash zelf alles exporteren naar een frame hoger dan frame 1, behalve je foto.
Dan met MTASC op frame 1 de class + code die je nodig hebt erbij compilen.

BernardV
%Europe/Berlin %910 %2006, 22:51
Dus als ik t goed begrijp: symbolOwner is de classenaam?

En dus als ik die class myMovie heb,
is de 'url' ervan _Packages/myMovie/myMovie.as

Leuk om te weten :)

symbolOwner is een referentie naar de constructor van de class.
en de symbolName is je packagenaam + de classnaam.

Stel je hebt een class:

class nl.emveedee.clips.MySuperMovie{

}

dan zou je symbolName zijn _Packages.nl.emveedee.clips.MySuperMovie

Emveedee
%Europe/Berlin %913 %2006, 22:56
Ah, weer een stuk wijzer :)

Thnx!

Erwinzzz
%Europe/Berlin %713 %2006, 18:07
Wat je zou kunnen doen is dit (is niet 100% correct)

In je publish settings bij actionscript zorgen dat alle classes op frame 1 geladen worden.
Nadeel is dus dat alle AS code op frame 1 komt te staan.
Nu zorg je dat bij alle items in je library "export to first frame" uit staat en die sleep je bv allemaal op frame 2 (behalve voor de foto die je nodig hebt)
Nu worden alle assets geladen in frame 2, en zal frame 1 dus sneller geladen worden.

Wat ook nog een mogelijkheid is is in flash zelf alles exporteren naar een frame hoger dan frame 1, behalve je foto.
Dan met MTASC op frame 1 de class + code die je nodig hebt erbij compilen.
tja.. Misschien een beetje verkeerd geformuleerd: maar kan dit ook in AS? als ik dus iemand deze class stuur zou hij natuurlijk meteen moeten werken, zonder dat hij in zen settings loopt te klooien.. Maar dit dus in te bouwen in de class.

BernardV
%Europe/Berlin %714 %2006, 18:09
Ik zou gewoon een preloader swf maken die een andere laadt.. Dan ben je van dit probleem af.
Geef de te laden swf mee als flashvar en geef in de geladen swf:

loadedClip._lockroot=true;


Dan heb je ook geen problemen als ze _root gebruiken in de clip.

TheDutch
%Europe/Berlin %471 %2007, 11:18
FYI: symbolName moet naast __Packages het hele class pad bevatten :).

Dauntless
%Europe/Berlin %531 %2007, 12:45
Ohja, 'k heb nog een leuke classe:

class be.dauntless.utils.Library
{
public static function attachWithClass(p_className:Function, p_target:MovieClip, p_linkageName:String, p_instanceName:String, p_depth:Number, p_initObject:Object):Object
{
var mc:MovieClip = p_target.attachMovie(p_linkageName, p_instanceName, p_depth, p_initObject);
mc.__proto__ = p_className.prototype;
p_className.apply(mc);
return mc;
}

public static function createWithClass(p_className:Function, p_target:MovieClip, p_instanceName:String, p_depth:Number, p_initObject):Object
{
var mc:MovieClip = p_target.createEmptyMovieClip(p_instanceName, p_depth);
mc.__proto__ = p_className.prototype;
p_className.apply(mc);
for(var i in p_initObject)
{
mc[i] = p_initObject[i];
}
return mc;
}
}