PDA

Volledige versie bekijken : AS tips


Jordy
%Europe/Berlin %920 %2005, 23:05
Originele post bij theFlashWizard


AStips:
(voor beginners)

Hier een opsomming van een paar tips en weetjes over ActionScript.
Dingen waar je anders n vlink zooitje experimenten voor zou moeten maken.
Of dingen die je alleen door ervaring leert.

theFlashWizard:

1. Elke mc bevat zijn eigen Depths.
2. Grapichs kan je niet aanspreken want die hebben geen instancename
3. Eventuele textvakken kun je in buttons niet bewerken, in mc's wel
4. gebruik de trace method daarbij kan je 98% van de bugs vinden
5. Voor wanneer je buttons in een for() lus wilt zetten; de i is dan niet meer opvraagbaar in een onRelease omdat wanneer je op de knop drukt de for lus al gemaakt is en de i de waarde al heeft van de laatste i die de lus gemaakt heeft.
for(i=1;i<=4;i++){
this["button"+i].onRelease = function(){
trace(i) //dat geeft: 4
}
}


TheZwier:

De beste oplossing is een variabele aan te maken in de mc/button zelf met de i.
Dus zoiets:
for(i=1;i<=4;i++){
this["button"+i].i = i
this["button"+i].onRelease = function(){
trace(i) //dat geeft: 4
trace(this.i) //dat geeft: de echte i
}
}
6. Een onRelease kan je geen argumenten mee geven
7. Andere kortere if else constructies:
if(...)...
else ....
of
(...)? ... : ...
8. Probeer niet alles in een onEnterFrame te zetten, leer functies gebruiken
9. Leer ook array's gebruiken, komen veel vaker te pas dan je zou denken
10. Kom je ergens niet uit, pak pen en papier en schrijf en teken het uit.Kom je ergens niet uit, pak pen en papier en schrijf en teken het uit.
11. Je kan maar 1 onEnterFrame maken per mc. anders overschrijven ze elkaar.
12. Je kan geen behaviors/events aan iets toekennen dat al in iets zit dat al behaviors/events heeft.
13. je kan aan meerdere events 1 functie hangen:
mc1.onRelease = mc1.onReleaseOutside = function(){
//actie
}

Saphua:

1. Ikzeld vind het prettiger om alle (98% van de) code op frame1 te zetten, zo blijft alles overzichtelijker. Verder vermijd ik het gebruik van scenes *altijd*
2. Wat ik persoonlijk fijn coden vind is het volgende; als voorbeeld genomen, een spel waarin een poppetje een upgrade kan krijgen waarin hij van normal- naar supermode veranderd en sneller kan lopen:
function normalMode(){
hero._x += 5;
}
this.onEnterFrame = normalMode;
Zoals je ziet maak ik van een functie een onEnterFrame, en kan ik deze razendsnel switchen. Dit is zeer fijn om te gebruiken voor dit soort type applicaties/games.
theFlashWizard:
Op deze manier kun je dus functies verbinden aan events, zo kan je dus ook makkelijk de functie achter een onRelease wisselen.
Het is ook voor flash makkelijker als je binnen een for() lus verschillende rollovers naar dezelfde functie stuurd..
Dan heeft hij die text maar 1x namelijk en anders x het aantal bijv rollOvers

Dauntless:]

1. Als je dus een poppetje wilt laten lopen, maak dan een tijdelijke x en y aan voor het poppetje. Bereken dan (dmv wiskunde) of het poppetje iets raakt en pas de x en y aan. Op het einde van de frame dan de _x en _y gelijkstellen aan x en y.
2. Nog een tip, zet ALLES op frames! Anders vind je het moeilijk terug! Frames zijn overzichtelijk!
3. Gebruik altijd framelabels. Het verwijzen naar framenumbers is namelijk nog altijd bugy. Lees dit maar.
4. Probeer alles zo dynamisch mogelijk te houden, dat schilt je achteraf een heleboel werk.
Voorbeeld1:
Goed:
speedX = 5
_root.onEnterFrame = function(){
hero._x += speedX
} Fout:
_root.onEnterFrame = function(){
hero._x += 5
}
Voorbeeld2:
Goed:
speedX = 5
radiusX = hero._width/2
minX = 0+radiusX
_root.onEnterFrame = function(){
if(hero._x <= minX){
hero._x = minX
}else{
hero._x -= speedX
}
} Fout:
_root.onEnterFrame = function(){
if(hero._x <= 50){
hero._x = 50
}else{
hero._x -= 5
}
}
5. F1 is uitgebreid!
6. geef duidelijke instance namen, da's ook handig om te debuggen
7. zoek uit hoe die debugger werkt (en als je het weet, zeg het me dan eens :D het lukt me echt niet ... :-p)
8. Gebruik bij txtvakken altijd de instancenaam. Alleen voor debuggen is de var naam handig, aangezien je dan geen rekening moet houden met scoping (of toch in sommige gevallen niet) en de var wordt altijd geupdate.
9. Houdt zoveel mogelijk extern!
10. Werk relatief! dus met this en parent ipv _root. dat voorkomt ondereandere problemen die je anders geheid krijgt.
11. Snelste manier om met Drawing API een bol te tekenen:
this.lineStyle(20, 0xFF0000, 100);
this.lineTo(0, 1),
En je hebt een mooie grote rode bol.

Roenes:

1. Gebruik de nieuwe syntax, dus ipv:
setProperty(hero,_x,5)
dit:
hero._x = 5
ziet er ook een stuk logischer uit.
2. Hanteer je eigen opmaak regels tijdens zet scripten. bijv een { wel of niet op een volgende regel,
variabelen wel of niet in hoofdletters
en zo zijn er nog heeeeeel veeeeel van dat soort "regeltjes" die je kan hanteren.
3. Schrijf scripts ook altijd in 1 taal.
4. Tips over hoe je je script sneller of minder CPU intensief laat werken: klik (http://www.flashfocus.nl/forum/topic.asp?TOPIC_ID=36253&FORUM_ID=801&CAT_ID=21&Topic_Title=%5BDISCUSSIE%5D+Snelheids+verbetering% 2Ftrucjes+in+AS&Forum_Title=4%2E+Actionscript+Showcase)

laiverd :

1. verdeel je applicatiecode in zo klein mogelijke stukjes en bouw zo steeds kleine steentjes die je test
2. gebruik de voorbeelden in de handleiding actionscript als je even niet snapt hoe iets werkt
3. zet voordat je begint je computer uit en maak eerst een plan:
Verdeling van je movie in verschillende swf bestanden,
welke data hou je extern en hoe wil je ze binnen halen.
Zet dan eerst de structuur neer in directories en dummy swf bestanden, maak alle nodige assets (foto's, xml etc) en ga dan pas echt aan de slag.
Zo voorkom je dat achteraf blijkt dat je dingen niet zo handig hebt aangepakt en je dus meer tijd kwijt bent
4. maak dingen niet moeilijker dan ze hoeven te zijn. In mijn ervaring zijn zaken vaak veel simpeler op te lossen dan je in eerste instantie denkt

Jordy:

1. als je een bepaalde AS functie niet snapt, test het dan eerst in een lege flash movie, alvorens je m gaat oefenen in je huidige flashmovie. Zo voorkom je fouten.

Invisible:

1. Let goed op de wiskundige operatoren.

getal = 0
if(getal = 1) {
trace("getal is 1")
}

Zal niet goed gaan werken, de "=" betekent in AS (en javascript e.d.) als een toekennings teken. Hier kent hij dus het cijfer 1 aan de variabele "getal" toe.

getal = 0
if(getal == 1) {
trace("getal is 1")
}

de "==" staat voor "is gelijk aan". Dit betekent dus, als de variabele "getal" gelijk staat aan de waarde "1".

Ea.Z
%Europe/Berlin %152 %2005, 04:39
in die tip van Roenes staat er een 'klik' maar de url staat er niet meer bij...
in deze regel welbepaald

4. Tips over hoe je je script sneller of minder CPU intensief laat werken: klik

is die nog ergens terug te vinden?

Jordy
%Europe/Berlin %478 %2005, 12:28
fixed, die link is alleen nog op t oude forum :(

TheSilentWitness
%Europe/Berlin %740 %2005, 18:46
KLIK (http://www.flashfiles.nl/forum/topic.asp?TOPIC_ID=36253&FORUM_ID=801&CAT_ID=21&Topic_Title=%5BDISCUSSIE%5D+Snelheids+verbetering% 2Ftrucjes+in+AS&Forum_Title=4%2E+Actionscript+Showcase)



geraken jullie dan niet op die link?

Invisible
%Europe/Berlin %194 %2005, 05:40
Thankx voor de tips! Het valt me op dat ik als beginnende ASnoob al veel tips hanteerde, maar dat komt waarschijnlijk omdat ik al een beetje bekend ben met JavaScript en Director.

Jordy
%Europe/Berlin %339 %2005, 09:08
Klopt ja, javascript lijkt kwa code veel op AS.
Deze tips zijn denk ik echt voor mensen die net begonnen zijn, en nog amper ervaring hebben met AS enzo.

theFlashWizard
%Europe/Berlin %733 %2005, 18:35
volgens mij missen we zo wel n boel uit me oude post hoor.. :S
zo ook de link naar de site en zelfs de hele tuturial op de site :| of ik heb nie goed gekeke.. maar das ook wat moeilijker zonder zoek functie..
maar voorderest vink het forum wel veel mooier geworden hoor :)
jammer dat er alleen dat er zoveel weg is..

ik heb nu de nieuws afdeling beter doorgeleze.. maar nu ik dus die tuturial van mij opnieuw online wil zetten.. kan ik nie vinden hoe :S:S

net zoals dat ik niet snap hoe ik n nieuwe avater neerzet.. ergens n uitleg? :$:$
sorry Kloop achter de gegevens aan vandaag.. Kheb de post daarover ook al gelezen.. Khoop dat die bug snel wordt opgelost :S

Jordy
%Europe/Berlin %841 %2005, 21:12
je kan geen avatar doen, enkel alleen ZMers.

We proberen natuurlijk wel om deze lijst met AS tips uit te breiden he! :).

Invisible
%Europe/Berlin %878 %2005, 22:04
Weet je waar ik echt mee zat te k*tten...Met die variabelen en operators. Ik was namelijk op school Director gewend, en dan ga je aan AS beginnen. Ik snapte werkelijk heel de logica niet, want:

var score = 0;
var level1 = 10;

if (score = level1) {
trace("U heeft level 1 bereikt");
}

Hier werkt de vergelijking niet correct, want ActionScript denkt nu dat je bij de if-vergelijking de variabele "score" opnieuw wilt declareren, inplaats van deze te vergelijken met de variabele "level1". Oftewel: de variabele "score" wordt meteen 10 en de acties in de if-constructie worden meteen uitgevoerd.

var score = 0;
var level1 = 10;

if (score == level1) {
trace("U heeft level 1 bereikt");
}

Werkt wel, want nu wordt er ook werkelijk een vergelijking getroffen, inplaats van dat de variabele score opnieuw wordt gedeclareerd. Oftewel: "=" gebruik je bij een declaratie van een variabele en "==" (is gelijk aan) gebruik je bij een vergelijking.

Voor jullie natuurlijk voor de hand liggend, maar ik weet echt zeker dat super veel mensen door dit stomme foutje zich geen raad weten en heel hun if/else constructies overhoop gaan halen (ik spreek uit eigen ervaring) :D

-------------------

Ook is het erg handig (zoals in eerdere tips al werd vermeld) om na te denken waar je variabelen gaat neerzetten. bv:

on(release) {

var score = 0;
var level1 = 10;
var level2 = 20;

_root.score += 1

if (this.score == this.level1) {
trace("U heeft level 1 bereikt");
}
}

Zal niet werken. Hij zal namelijk nooit tot de if-vergelijking komen, want elke keer wanneer je op de button klikt - on(release) -, maakt hij de variabele "score" weer "0" om er vervolgens 1 bij op te tellen, dus je kunt blijven klikken, maar de score zal altijd van 0 naar 1 gaan, en niet verder. De oplossing is dus om dit soort variabelen in een keyframe te stoppen. Zie het als de globale variabelen de vanuit een bepaald punt door objecten kan worden opgeroepen. Natuurlijk moet je dan wel even "if (this.score == this.level1)" veranderen in "if (_root.score == _root.level1)"

Zo dit was wel ff voor de uberflashnoobs, maar goed als de basis duidelijk is, komt de rest vanzelf.

Invisible
%Europe/Berlin %906 %2005, 22:44
Om even te verduidelijken "==" kun je het beste gebruiken bij strings. Bij een test met getallen kun je beter "<" of ">" gebruiken. Ik moest er opeens aan denken toen ik zo'n tip las bij tutorials. Dit heb ik zelf ook ondervonden bij Director.

Jordy
%Europe/Berlin %986 %2005, 00:41
Ok is toegevoegd, heb de uitleg ietwat veranderd :)

theFlashWizard
%Europe/Berlin %990 %2005, 00:46
kan ik deze post mshn weer in eige handen krijgen?
want als jij hier wat uitlegt bij schrijft owke.. maar dat komt niet zo letterlijk in de tuturial.. en om nou 2pers. n uitleg te laten vertalen..

Jordy
%Europe/Berlin %993 %2005, 00:50
ja is goed, ik weet niet hoe ik jou dit topic kan laten "beheren"

theFlashWizard
%Europe/Berlin %000 %2005, 01:00
ik ook niet.. maar et zou mooi zijn..
dus anders gevraagt.. is het mogelijk?

Shivan
%Europe/Berlin %000 %2005, 01:00
on(release) {

var score = 0;
var level1 = 10;
var level2 = 20;

_root.score += 1

if (this.score == this.level1) {
trace("U heeft level 1 bereikt");
}
}

Zal niet werken. Hij zal namelijk nooit tot de if-vergelijking komen, want elke keer wanneer je op de button klikt - on(release) -, maakt hij de variabele "score" weer "0" om er vervolgens 1 bij op te tellen, dus je kunt blijven klikken, maar de score zal altijd van 0 naar 1 gaan, en niet verder. De oplossing is dus om dit soort variabelen in een keyframe te stoppen. Zie het als de globale variabelen de vanuit een bepaald punt door objecten kan worden opgeroepen. Natuurlijk moet je dan wel even "if (this.score == this.level1)" veranderen in "if (_root.score == _root.level1)"

Zo dit was wel ff voor de uberflashnoobs, maar goed als de basis duidelijk is, komt de rest vanzelf.

Er zitten nog een paar kleine foutjes in, _root.score += 1 mist een ; op het eind. Tevens zal hij de juiste score variabele alleen updaten als je het script in de root zou hebben.

Er is trouwens nog een manier om waardes te vergelijken, namelijk met ===.

var score = 0;
var score2= "0";

if (score == score2) {
trace("beide waarden zijn gelijk");
}

if (score === score2) {
trace("beide waarden en soort is gelijk");
}

De eerste if zal true zijn want beide waarden zijn 0. De tweede if zal false zijn, de waarden zijn wel gelijk, maar de eerste is een number en de tweede is een string en zal in deze vergelijking dus fout gaan.

Invisible
%Europe/Berlin %004 %2005, 01:06
Hey Shivan,

goed opgemerkt wat betreft de ";". Het tweede wat je vermeld leg ik nou juist uit onder dat script. (of je bedoeld wat anders) Oftewel, het script is fout, maar dat was ook de bedoeling (behalve die ";")

Bedankt voor de 2e uitleg btw, interesting! :)

Greetz, Tim

Jordy
%Europe/Berlin %004 %2005, 01:07
FLASHWIZARD, hoe kan jij dit topic beheren? even vragen of deze verwijderd kan worden oid ?

theFlashWizard
%Europe/Berlin %040 %2005, 01:58
je kan hem verwijdere.. Kheb hem (aangepast) naar AStips (2) gekopiert:)

Richard
%Europe/Berlin %346 %2005, 09:18
Hier gaan we verder (http://www.flashfocus.nl/forum/showthread.php?t=189)