PDA

Volledige versie bekijken : AS programmeer standaard


MarcoH
%Europe/Berlin %064 %2006, 01:32
Ik ben druk bezig AS te leren.
De syntax van AS begin ik al aardig onder de knie te krijgen(wijkt niet zoveel af van de talen die ik al ken), maar ik zit wel met het probleem van de aanbevolen plaats waar de code geschreven wordt. Dit ook omdat je deze in het libary object kan plaatsen, op de instances van deze, of op de _root timeline, en dan ook nog in verschillende frames, .

Volgens deze link:
http://www.macromedia.com/devnet/flash/articles/as_bestpractices_04.html
maakte ik dus inderdaad alle fouten die hier vermeld worden, omdat deze plaatsen in eerste instantie logischer leken.

Ook ben ik er nog niet helemaal achter wat nu de scope is van variabelen/functies. Het leek of bepaalde events niet werkten vanuit de _root timeline.
Ik gebruikte b.v. bal_mc.onEnterFrame in het eerste frame van de _root, maar werkte voor geen meter. Volgens de debug werd de hieraan geplakte functie, maar 1 keer doorlopen. (was om de bal te verplaatsen, waarbij de x en y werden aangepast).
Met dezelfde code in een clipEvent(onEnterFrame) binnen de instantie van een object werkte dit vlekkeloos.

Ook het toevoegen van extra properties deed ik in het bron-object in de libary (de instances namen deze dan alemaal netjes over), maar ik weet nu ook niet of dit de juiste manier is, en dit volgens de laatste conventies goed is.

Ik ben het eens met het artikel dat je beter direct volgens deze standaard moet gaan werken, om problemen te voorkomen. Maar kan iemand me uitleggen of je dan echt alles in 1 frame van de _root timeline moet zetten, of begrijp ik dat verkeerd. [?]

Een reden dat ik het vreemd vindt om alles op 1 plaats te schrijven is dat ik gewend ben om rekening te houden met geheugen gebruik. Is het niet zonde om (vooral bij grotere applicaties), alle functies, variabelen e.d. aan het begin te laden? Lijkt me toch beter om deze binnen een beperkte scope te gebruiken, daar waar je deze nodig hebt?

SaphuA
%Europe/Berlin %130 %2006, 03:08
Hallo,
Ten eerste, als je je echt zorgen maakt om het geheugen gebruik door het beperken van een paar functies, moet je geen Flash gebruiken ;) Flash is hier gewoon niet voor bedoeld. (Hoewel het er wel steeds meer op begint te lijken, maar dit laten we even buiten beschouwing).

Verder is het inderdaad erg fijn waneer je zoveel mogenlijk van je code in dezelfde plaats (frame 1?) zet. Dit maakt het erg overzichtelijk, en zo kun je makkelijk dingen aanpassen etc. Dit is echter een persoonlijke keuze, je kunt zelf redenen hebben waardoor je je code ergens anders zou willen plaatsen.

Wat bedoel je precies met 'extra properties in het bro-object in de library'?

Over je vraag met het balletje kan ik niets zeggen zonder voorbeeld. Dit zal inderdaad een scoping probleem zijn. Het leren te begrijpen van de scope is erg eenvoudig. Het is eigenlijk gewoon van het bovenste level (_root) elke keer een stapje naar beneden (mc, object of variable) Je krijgt dan: _root.movieclip1.movieclip2.variable = waarde;

~Sph

MarcoH
%Europe/Berlin %184 %2006, 04:25
Ten eerste, als je je echt zorgen maakt om het geheugen gebruik door het beperken van een paar functies, moet je geen Flash gebruiken ;)
Het is denk ik ook niet zo'n groot probleem het geheugen bij een client-side app, maar zit een beetje ingebakken aangezien ik hiernaast alleen nog in server side talen programmeer. (heeft wat meer invloed als 1000 instances tegelijk worden gebruikt)
Verder is het inderdaad erg fijn waneer je zoveel mogenlijk van je code in dezelfde plaats (frame 1?) zet. Dit maakt het erg overzichtelijk, en zo kun je makkelijk dingen aanpassen etc. Dit is echter een persoonlijke keuze, je kunt zelf redenen hebben waardoor je je code ergens anders zou willen plaatsen.
Ik denk dat het op 1 plaats zetten wel het overzichtelijks is, het is alleen nog uitvinden of alles wat ik wil, zo mogelijk is. time will tell :)
Wat bedoel je precies met 'extra properties in het bro-object in de library'?
Als je bijvoorbeeld bij een game als blockout, een blokje een bepaalde waarde wilt geven, en hiervoor in het libary object een varabele plaatst. Deze variabele bevind zich dan in alle instances. (ik weet niet of dit ook vanuit de _root timeline toegevoegd kan worden.)

Over je vraag met het balletje kan ik niets zeggen zonder voorbeeld. Dit zal inderdaad een scoping probleem zijn.
Ik zal dat vandaag even nakijken (zit nu op me werk). Ik las net dat AS en objects op dezelfde layer een probleem geven. Ik ben bang dat ik in me enthousiasme inderdaad alles op 1 layer heb geplaatst :S ....waarschijnlijk is dat het probleem. (Ook 1 van de fouten die ik maakte, geen aparte Action layer 8D )

Dauntless
%Europe/Berlin %428 %2006, 10:17
Alle code op 1 tijdlijn is min of meer aangeraden, maar je mag wel opsplitsen hoor.
Hier bijgevoegd is een .fla van een "goede" onderverdeling. Uiteraard is 'goed' subjectief, dus dat kan voor iedereen anders zijn.

Ook is het best dat je _root verwijdert. Een heel handig trukje is om aan het begin van de frame te zetten: var root:MovieClip = this; . Daarna kan je altijd 'root' gebruiken ipv '_root', en je paden blijven relatief! (dus je gaat geen problemen hebben wanneer je de swf ergens anders inlaadt).

http://www.kirupa.com/developer/actionscript/tricks/scope.htm
Misschien dat die link je helpt met het begrijpen van de scope ?

MarcoH
%Europe/Berlin %709 %2006, 17:01
Ik heb het voorbeeld bekeken en komt inderdaad gestructureerder over. Dus de combinatie van het gebruik van layers, code conventie, en classes.
De link van de scope maakt ook wat dingen duidelijk.

Ik ben er ook inmiddels achter waardoor het in eerste instantie ook niet werkte.
Ik had de functie voor het bewegen eerst zo aangeroepen:
bal_mc.onEnterFrame = balMove();
Hierdoor werd deze maar 1x doorlopen. Na dit gewijzigd te hebben in:
bal_mc.onEnterFrame = balMove;
werkte dit wel goed...
Hieronder even de complete code van frame1, met nergens iets anders geschreven. (is simpel..maar wel leuk om te oefenen :) )

/*******pong oefen game********/
//-- variabelen
var root:MovieClip = this;
var xSnelheid:Number = 5;
var ySnelheid:Number = 5;
var grensRechts:Number = 690;
var grensBodem:Number = 490;
var hit:Boolean=false;

var startPunt:Number=bal_mc._y;
var so:Sound = new Sound(this);

//-- Functies
function balMove(){
//-- nieuwe x en y
var oldxpos:Number = bal_mc._x;
var oldypos:Number = bal_mc._y;
var newxpos:Number = oldxpos+xSnelheid;
var newypos:Number = oldypos+ySnelheid;

//-- check of de zijkant wordt geraakt
if ((newypos<10) || (newypos>grensBodem)) {
ySnelheid = ySnelheid/-1;
newypos = newypos + ySnelheid;
}
if ((newxpos<10) || (newxpos>grensRechts)) {
xSnelheid = xSnelheid/-1;
newxpos = newxpos + xSnelheid;
}
setProperty (bal_mc, _x, newxpos);
setProperty (bal_mc, _y, newypos);

//-- hit controle
if (this.hitTest(root.play1_mc) || this.hitTest(root.play2_mc)){
//ySnelheid = -ySnelheid;
xSnelheid = -xSnelheid;
}
}

//-- Events
bal_mc.onEnterFrame = balMove;
play1_mc.onPress = function() {
this.startDrag(false, this._x, 10, this._x, 490);
}
play1_mc.onRelease = play1_mc.onReleaseOutside = function() {
this.stopDrag();
}


//-- init

Dauntless
%Europe/Berlin %710 %2006, 17:03
Waarom gebruik je setProperty in plaats van de 'dot-syntax' ?

MarcoH
%Europe/Berlin %713 %2006, 17:07
Dus bal_mc._x = newpos; ipv setproperty?
Ik dacht dat dat in eerste instantie niet werkte zo..maar na oplossen van het aanroepen van de functie werkt dat inderdaad ook.

MarcoH
%Europe/Berlin %938 %2006, 22:30
Ik heb nu alles een beetje gecombineerd, is dit een beetje de bedoeling?
Ik zit nog wel met het feit dat ik geen sound kan declareren in een class, maar zoek ik nog even uit. 8D

Dauntless
%Europe/Berlin %943 %2006, 22:38
Hmm, er is blijkbaar iets mis met de bijlage. Kan je hem nog eens proberen up te loaden?

MarcoH
%Europe/Berlin %957 %2006, 22:59
Done.. ging inderdaad verkeerd tijdens uploaden...de server was opeens niet te bereiken..
Nog 1 (kleine) vraag...ben ik al uurtje naar aan het zoeken.
Ik wil dus via code een propertie aan de instance van de bal toevoegen. Dus b.v. een eigen x en snelheid (voor als ik meerdere ballen wil lanceren..)
Ben ik nog niet echt achter en neig om dit hard in het object te zetten. (wat ik dus niet wil) :S

Dauntless
%Europe/Berlin %968 %2006, 23:14
Maak een paar public methods aan die deze variabelen aanpassen.
(Kijk eventueel naar de artikels in mijn sig :)).

Ps: In AS 1.0 wordt het al afgeraden op '_root' te gebruiken en in AS 2.0 is het eigenlijk zelfs verboden ;).

MarcoH
%Europe/Berlin %116 %2006, 02:47
Ik heb de voorlopige final van het proggie nog even hier bij gezet..kon het niet laten om verder te experimenteren...is nu een soort pong breakout geworden.... :)
Ga me nou verdiepen in database, sockets etc. wordt altijd leuker een taal als je hem door begint te krijgen :D

in ieder geval bedankt voor alle info.