PDA

Volledige versie bekijken : Klein classje


Fatty Owl
%Europe/Berlin %730 %2005, 17:31
Ik heb een klein classje gemaakt om via AS frames toe te voegen en verwijderen. Graag commentaar :)

Gebuik
Eerst maak je een nieuwe tijdlijn:
var myTimeline:Timeline = new Timeline()



*update: Voor je begint moet je nu ook eerst de functie setRoot aanroepen:
myTimeline.setRoot(this)
/*this veranderen door je root timeline*/

deze kan je dan ook opvragen door getRoot:
myTimeline.getRoot()


de insertKeyFrame functie maakt dus eigenlijk een nieuwe keyFrame. Dit doe je zo:
myTimeline.insertKeyFrame(deFrameWaarinJeEenKeyFra meWil, AchtergrondkleurVanJeMovie, BreedteVanStage, HoogteVanStage)
Deze keyframe wordt automatisch naar overgesprongen. Je spreekt een keyFrame aan door:

Frame1.lineStyle(10,0x00000, 100)

(de lineStyle functie moet je vervangen door jouw gewenste functie)
*update: De huidige frame kan je opvragen door:
myTimeline.getCurrentframe()


De functie gotoStop. Hiermee ga je naar een met AS aangmaakte frame.

myTimeline.gotoStop(1)
/*het nummer van je gemaakte frame*/


Met de functie hideTimeline, kan je naar een frame in de hoofdtijdlijn gaan.
myTimeline.hideTimeline(1)
/*het nummer van de frame in de hoofdtijdlijn*/


*update: De functie Play();, hiermee laat je je tijdlijn afspelen.
myTimeline.Play(100, 1)
/*100 kan je vervangen door de snelheid tussen frames. 100 komt overeen met 10fps, omdat 100 1/10de van 1000 is.(Het wordt uitgedrukt in miliseconden). De 1 kan je vervangen door
de frame waar je wil beginnen spelen.*/

*update: De functie Stop();. Hiermee onderbreek je de functie Play();.
myTimeline.Stop();


De class

class Timeline {
private var a:Number = 1;
public var myFrame:MovieClip;
public var allFrames:Array = [];
private var root:MovieClip;
private var myInterval:Number;
private var Ftostart:Number;
private var vStop:Boolean = false;
var g:Number;
public function setRoot(youreRoot) {
root = youreRoot;
}
public function getRoot() {
return root;
}
public function insertKeyFrame(a, BGcolor:Number, StageWidth:Number, StageHeight:Number) {
hideTimeline();
myFrame = root.createEmptyMovieClip("Frame"+a, root.getNextHighestDepth());
myFrame.lineStyle(1, BGcolor, 100);
myFrame.beginFill(BGcolor, 100);
myFrame.lineTo(0, StageHeight);
myFrame.lineTo(StageWidth, StageHeight);
myFrame.lineTo(StageWidth, 0);
myFrame.lineTo(0, 0);
myFrame.endFill();
myFrame._width = StageWidth;
myFrame._height = StageHeight;
allFrames[a-1] = myFrame;
}
public function getCurrentframe(currentframe) {
return myFrame;
}
public function gotoStop(whatFrame:Number) {
hideTimeline();
allFrames[whatFrame-1]._visible = true;
}
public function hideTimeline() {
for (var c:Number = 0; c<allFrames.length; c++) {
allFrames[c]._visible = false;
}
}
public function Play(tBF:Number, Frtostart:Number) {
vStop = false;
g = Frtostart;
myInterval = setInterval(this, "Interval", tBF);
}
private function Interval() {
hideTimeline();
gotoStop(g);
if (g>0 && g<allFrames.length) {
g++;
} else if (g>allFrames.length-1) {
g = 1;
}
if (vStop) {
clearInterval(myInterval);
vStop = false;
}
}
public function Stop() {
vStop = true;
}
}

Dauntless
%Europe/Berlin %769 %2005, 18:28
Leuk dat je zo actief bezig bent met AS 2.0 :).

Nu is het zo, je zou alles 'binnen' je class moeten houden. Je class zou moeten zeggen wat de link naar de huidige frame is (bv dmv myTimeline.getCurrentFrame().lineStyle(1) ).

Ook maak je alle movieclips dus aan op de _root. Onthoud: In classes noooooit _root gebruiken!. Laat de gebruiker ZIJN root meegeven aan de constructor.

Je kan overigens normaal gezien gewoon 'gotoAndStop()' gebruiken hoor, 't is een method van een andere class...

Hoe kom je bij 'showRoot' ? Hij heeft ook niet echt veel nut, me dunkt. Je zou er denk ik beter een 'hideTimeLine' (of gewoon weg 'hide()') van moeten maken, en dan alle movieclips verbergen. Je kan immers zelf toch zeggen dat je naar een bepaalde frame wil staan op de 'echte' tijdlijn.

Wat uitbreidingen die leuk zouden zijn:
*Maak de achtergrond in een apparte mc, en zorg ervoor dat als je een actie uitvoert dat die automatisch in een mc vóór die achtergrond mc gebeuren (uitdaging!)
*Een 'play()' functie inbouwen! Een setInterval die met een zelf gekozen fps alle frames achter elkaar laat zien.

Ow, en gebruik return types! :) (Als je niet weet wat dat is: open je boek ;) :p)

Ea.Z
%Europe/Berlin %769 %2005, 18:28
wow... grof!
heb nie alles doorgekeken.. maar lijkt me vet op het eerste gezicht..
respect Fatty, je doet echt heel wat vorderingen... soms kan ik niet geloven dat je maar 12 bent;):)
kan je eens voorbeelden geven waarvoor je zoiets kan gebruiken? ik kan me niet direct iets voorstellen..

Dauntless
%Europe/Berlin %773 %2005, 18:33
kan je eens voorbeelden geven waarvoor je zoiets kan gebruiken? ik kan me niet direct iets voorstellen..
Ja, dat vroeg ik me eigenlijk ook af :D Op het eerste zicht heeft het niet echt nut :p. (Wel een goede oefening natuurlijk :)) .

Fatty Owl
%Europe/Berlin %829 %2005, 19:54
Wat uitbreidingen die leuk zouden zijn:
*Maak de achtergrond in een apparte mc, en zorg ervoor dat als je een actie uitvoert dat die automatisch in een mc vóór die achtergrond mc gebeuren (uitdaging!)
*Een 'play()' functie inbouwen! Een setInterval die met een zelf gekozen fps alle frames achter elkaar laat zien.

Deze ga ik nog doen, de rest heb ik gedaan (denk ik :))

Ow, en gebruik return types! :) (Als je niet weet wat dat is: open je boek ;) :p)
Heb ik al geleerd :)(van mijn boek :p)

@Eaz: Het nut: Als ik een spel maak, en ik wil het volledig in code, kan ik geen meerdere frames gebruiken. Deze kan ik dan wel aanmaken d.m.v deze class :)

Fatty Owl
%Europe/Berlin %883 %2005, 21:12
Update: Play functie eringezet :)
@Dauntless: *Maak de achtergrond in een apparte mc, en zorg ervoor dat als je een actie uitvoert dat die automatisch in een mc vóór die achtergrond mc gebeuren (uitdaging!)
Die begrijp ik niet :)

Dauntless
%Europe/Berlin %887 %2005, 21:18
Wel, dat je voor elke frame dus een movieclip maakt met daarin weer 2 movieclips. 1 op een depth van 1 en 1 op een depth van 2. In die op de depth van 1 zet je dan de achtergrond (solid kleur) en je laat al het tekenen gebeuren in de voorgrond movieclip.

Fatty Owl
%Europe/Berlin %889 %2005, 21:21
Aah. Die is idd moeilijk, maar ik zal proberen ;) Waarom is dit eigenlijk nuttig?

en ik heb de functie stop er dan ook maar bijgezet :p

Roenes
%Europe/Berlin %951 %2005, 22:50
Goed om te zien dat je zo druk met AS2 bezig bent fatty owl! Ik zal woensdag of donderdag als ik tijd heb je class eens goed bekijken en er het een en ander over zeggen :)

Roenes
%Europe/Berlin %673 %2005, 16:09
zo fatty, daar ben ik weer :P ik heb je code doorgekeken en moet zeggen dat het begrijpelijk geschreven is. Ik had niet veel moeite om te begrijpen wat je intensie is/was :)

Toch wel een paar inhoudelijke opmerkingen over je code:
for (var i:Number = 0; i<allFrames.length; i++) {
allFrames[i]._visible = false;
}
Dit stukje komt een kleine 5 keer voor waarvan 1x in de functie hideTimeLine(). Waarom roep je op die 4 andere plaatsen niet gewoon hideTimeLine() aan? Dan hoef je niet 5x dezelfde lus in je code te zetten. :)

Ook heb je een aantal keer zo'n soort regel in je code staan:
allFrames[Ftostart-1].getNextHighestDepth();Geen variabele ervoor en de depth die teruggegeven wordt, doe je niets mee. Waarom staan die regels er? Waren ze nog van het testen of hebben ze echt een functie? Want volgens mij zijn het nu overbodige regels :)

En nog 1 laatste opmerking:
if (Ftostart-1 !== allFrames.length) {in methode Interval is een gevaarlijk zinnetje. Wat nou als ik 100 invul terwijl me timeline maar 3 frames heeft? Dan krijg je als het goed is hele rare verschijnselen :D ik zou van !== < maken :)

Voor de rest nogmaals goed gedaan! Ik denk niet dat ik het zelf zou gebruiken, maar het is zeker een goede oefening! :)

Fatty Owl
%Europe/Berlin %716 %2005, 17:11
ik heb het allemaal aangepast thx :)

Die getNextHighestDepth was nog voor te testen ja :)
en nu heb ik functie interval ook maar private gemaakt :p want als je myTimeline.interval() zou kunnen doen...:)

Roenes
%Europe/Berlin %717 %2005, 17:12
ook nog even de else aanpassen van de methode interval ;)

Fatty Owl
%Europe/Berlin %718 %2005, 17:14
done that :) thx

Ea.Z
%Europe/Berlin %818 %2005, 19:38
kan je eens voorbeelden geven waarvoor je zoiets kan gebruiken? ik kan me niet direct iets voorstellen..
kan je hier eens op ingaan? aub????:)
vind het wel fat, fatty (ok, da was droog... ik moet gaan slapen;.. )

Fatty Owl
%Europe/Berlin %839 %2005, 20:08
staat in post 5 onderaan :) :
Het nut: Als ik een spel maak, en ik wil het volledig in code, kan ik geen meerdere frames gebruiken. Deze kan ik dan wel aanmaken d.m.v deze class

Ea.Z
%Europe/Berlin %883 %2005, 21:11
lol
voor als er nog eens een 400(000)bytes AS-battle komt :p
dan ist idd de max!:)
mooi werkje, hoor!

Fatty Owl
%Europe/Berlin %994 %2005, 23:52
Ik heb er een voorbeeld bijgezet (Duw op pijltje naar rechts om een nieuwe frame in te voegen. Links om een frame terug te gaan en op play om de animatie die je getekend hebt af te spelen :)

Ea.Z
%Europe/Berlin %024 %2005, 00:35
ok... je wint: DIT IS VET!
ik zie een App voor me waar gebruikers hun eigen animaties kunnen tekenen en opslaan. en iedereen kan ze bekijken. ja hoor.. dit is vet..
zou je het kunnen regelen dat je die aangemaakte frames kunt exporteren?
als swf of als gegevens waarmee flash later de 'virtuele' frames weer kan opbouwen?
anders zie ik nog een projectje met jou ontstaan(als je wilt natuurlijk;))

Dauntless
%Europe/Berlin %031 %2005, 00:44
Je zou alleen een nieuwe frame mogen toevoegen als je aan het einde van je animatie zit.

Als je nu iets tekent, naar rechts gaat, nog iets tekent, terug naar links gaat (je ziet je eerste tekening) en dan terug naar rechts, is je tekening weg.

Fatty Owl
%Europe/Berlin %514 %2005, 12:21
@Eaz, ik ga eens proberen(exporteren enzo) en dan verder uitwerken :)

@Dauntless idd kleine bug:) thx

anders zie ik nog een projectje met jou ontstaan(als je wilt natuurlijk)
Tuurlijk :)

Flasher
%Europe/Berlin %618 %2005, 14:51
Ik vind het wel cool:D

Ik zou alleen een soort currentFrame indicatie maken, nu raakte ik min of meer verdwaald;)

Verder harstikke tof, ik sta versteld :O :O

Fatty Owl
%Europe/Berlin %661 %2005, 15:53
Ik heb hem geüpdate zodat het meer lijkt of de movie geëxporteerd wordt, en een paar kleine bugs eruitgehaald.

@Flasher goed idee ik zal laten zien in welke frame je zit :)

en dan ga ik nu ook eens met kleuren maken, en een gom. (en terwijl onerzoeken over hoe exporteren enzo :))

*update: nog een bug eruitgehaald en laten zien in welke frame je zit heb ik gedaan :)

*update: Ik heb er ook een MX versie bijgezet, was ik vergeten, en ook een .swf voor de mensen die flash niet willen openen :)