PDA

Volledige versie bekijken : var updaten


jelmerdewilde
%Europe/Berlin %610 %2005, 15:39
Hoe kun je variabelen updaten? ik heb al gezocht maar kon nix vinden.
het is de bedoeling dat een variabele als:
var positie = vlak._y - 80
constant geupdate word, dus als vlak._y veranderd, var positie óók veranderd...

see?

Fatty Owl
%Europe/Berlin %612 %2005, 15:42
dan zet je die toch gewoon in een onEnterFrame?

jelmerdewilde
%Europe/Berlin %628 %2005, 16:05
onEnterFrame = function(){
var positie = vlak._y-80;
}
???

werkt niet .. al geprobeerd

baroque
%Europe/Berlin %672 %2005, 17:08
onClipEvent (enterFrame) {
var positie = vlak._y-80;
updateAfterEvent (enterFrame);
}


Als je het bovenstaande aan een lege movieClip hangt, wordt de variabele steeds geupdate. Let er dan wel op dat je de variabele dan anders moet benaderen (legeMovieClip.positie).

theFlashWizard
%Europe/Berlin %692 %2005, 17:37
baroque, sorry, dat slaat helemaal nergens op.
ze doen bijna hetzelfde alleen zit de 1 in het frame script en de ander op een mc.
en de update afterevent zorgt ervoor dat hij het 2x zoveel doet..
maar gezien de _y pos toch ook nie zo snel wiselt heeft dat geen nut

en al je script op 1 frame houden is toch veel handiger omdat je dan weet waar alles staat en meer overzict hebt.

dus jelmerdewilde, der gaat iets anders fout..
trace het vlak eens en zet is this voor je onEnterFrame:
this.onEnterFrame = function(){
var positie = vlak._y-80;
trace(vlak)
}

als er nou een undefined uit de uit de trace komt vind hij de mc vlak niet en kan je bijv wellis de instancename vergeten zijn. komt er het path naar en de naam van de mc uit dan vind hij em wel en dan moete we nog ff doorzoeken

Laiverd
%Europe/Berlin %701 %2005, 17:49
Als var positie niet verandert, dan is het simpel: of de verwijzing naar 'vlak' is fout, of er gebeurrt geen r*k met 'vlak' ;) ... en dan is er dus ook weinig te updaten. Ik zou vlak._y maar eens tracen en kijken wat daar uitkomt; als er undefined uit komt is het pad naar 'vlak' gewoon fout (misschien zelf wel geen instancename ingevuld). Kortom: dit lijkt me meer een geval van slordigheid dan dat er structureel iets mis is.

John

P.s. Sorry voor de post; zie net dat de Flashwizard hetzelfde heeft gepost. Maakt die ook eens vrienden :P

jelmerdewilde
%Europe/Berlin %701 %2005, 17:49
als ik die trace in de onEnterFrame zet, dan gebeurt er nix...
en als ik hem erbuiten zet, staat er hetvolgende: _level0.vlak

8~

//edit: volgens mij is er structureel iets fout, ik heb een script met my_mc.tween(bla bla); van laco.wz.cz/tween enzo, misschien ligt het dááraan

Laiverd
%Europe/Berlin %702 %2005, 17:51
En waar verwijst this dan naar?

jelmerdewilde
%Europe/Berlin %704 %2005, 17:53
die 'this' van flashwizard? geen idee :P

theFlashWizard
%Europe/Berlin %707 %2005, 17:58
sorry ik dacht dat er bijv iets van this/_root voor moest.. maar ik heb et net ff gecheckt en dat hoeft niet eens..
maar vreemd dat er helemaal niks gebeurt..
dit script, die onEnterFrame staat die gewoon op een frame script in je _root/hoogste niveau/hoofdtijdlijn?


nee wacht.. als hij wel 1malig kan tracen zou hij ook die onEnterFrame moeten kunnen uitvoeren..
is er niet een andere onEnterFrame die deze stiekem overschrijft?
zet er ipv this is een naam van een mc voor.. en kijk is of dat helpt.. gewoon als test.

jelmerdewilde
%Europe/Berlin %711 %2005, 18:04
nee dat werkt ook niet :( maar goed, volgens mij ligt het gewoon aan de manier waarop ik de var gebruik ... ik heb al verschillende dingen geprobeerd, maar jah allemaal bedankt!

theFlashWizard
%Europe/Berlin %716 %2005, 18:12
als je dus dit script gebruikt:
onEnterFrame = function(){
var positie = vlak._y-80;
trace(vlak)
}
dan gebeurt er niks en wanneer je die trace eruit haalt doet hij die trace 1 x toch?

maak eens een nieuwe fla, zet dit script in het frame, maak een vlak mc en zorg dat je hem kan draggen..
trace dan ook de variabele zelf en je zal zien dat het niet aan je huidige script ligt hoor..

jelmerdewilde
%Europe/Berlin %718 %2005, 18:14
ik ga nu eten, kzal het vanavond proberen hoop ik!
bedankt ;)

Laiverd
%Europe/Berlin %762 %2005, 19:17
Het zou inderdaad kunnen dat er twee (of meer) onEnterFrames op dezelfde tijdlijn actief zijn. If so; dan ben je nu geconfronteerd met een van de beperkingen van onEnterFrame. De oplossing is in dat geval simpel; hang deze (of een andere) onEnterFrame gewoon aan een lege movieclip. In elk geval kan het niet aan de syntax liggen, die is gewoon goed. Als vlak op de hoofdtijdlijn zit en je onEnterFrame is daar ook gedefinieerd, dan is het pad ook goed.

O ja; ik zie nu 1 ding nog: de variabele positie moet wel eerst ook geinitialiseerd zijn voordat ie nieuwe waarden kan krijgen (althans in Flash Player 7). Dus buiten de onEnterFrame iets als: var positie = 0; o.i.d.

John

theFlashWizard
%Europe/Berlin %787 %2005, 19:53
Laiverd, dat is toch geen probleem.. want hij vult var positie eigenlijk gewoon met een hele nieuwe waarde.. hij voegt er niets aan toe ofzo..
hij doet var = waarde en niet var += waarde bijv.. dan hoef een var toch niet geinitialiseerd te worden?

Laiverd
%Europe/Berlin %788 %2005, 19:56
Je hebt gelijk ;)

jelmerdewilde
%Europe/Berlin %862 %2005, 21:42
waah het is gelukt!!

vanmiddag had ik al geprobeerd alles in een onEnterFrame te zetten wat met deze variabele te maken had, dit werkte niet. na wat prutsen enzo is het me nu helemaal gelukt! 8D

bedankt jongens/mannen(:P)... ik heb weer een hoop geleerd vandaag (A)

groet, Jelmer

TheDutch
%Europe/Berlin %937 %2005, 23:29
Fijn dat het werkt Jelmer :D.

Echter er is iets wat ik niet echt snap. Waarom komt niemand met de Object.watch() functie? Hiermee kun je kijken of een variable waarde veranderd is en daar dan een actie op uitvoeren. Zie hier mijn voorbeeld code:

// Maak een variablen object aan
_global.variables = new Object();

// Voeg een variable toe aan het variablen object
_global.variables.watchVar = 0;

// De callback functie wanneer de variable veranderd is
var variableWatcher:Function = function(prop, oldVal, newVal) {
trace(prop+" Oud: "+oldVal+" -- Nieuw: "+newVal)

// Geef de nieuwe waarde terug zodat de variable de opgegeven waarde toegewezen krijgt.
return newVal;
}

// Maak de watcher aan om te kijken of een variable binnen het object is veranderd.
_global.variables.watch("watchVar", variableWatcher);

// Button die de variable veranderd.
button.onRelease = function(){
_global.variables.watchVar = 1;
}

Op deze manier voorkom je het gebruik van (meerdere) onEnterFrame functies wat enorm goed is voor performance en verder heb je ook nog eens alle variablen mooi in een object zitten wat natuurlijk weer netter is. Verder kan je ook nog direct wat doen met de oude waarde, want de callback functie die je gebruikt binnen Object.watch() heeft zowel de nieuwe als de oude waarde beschikbaar. Trouwens ik heb het object "_global.variables" gebruikt omdat ik dat netter vindt, maar je kunt net zo goed ook "_root" of "this" gebruiken hoor ;).

In jouw specifieke geval zou ik de code anders gebruiken. Object.watch() kan niet overweg met _x, _y, _width, _height, etc waarden van een MovieClip. Hierdoor moet je een extra variable/propertie aanmaken binnen de MovieClip en die gebruiken ipv. de officiele propertie. In de code kan je lezen hoe dit afgehandeld wordt :).

// Voeg een variable "x" toe aan de MovieClip en vul deze met de officiele "_x" variable/propertie.
var vlak.x:Number = vlak._x;

// De callback functie die dingen uitvoerd wanneer de variable "x" veranderd is.
var variableWatcher:Function = function(prop, oldVal, newVal) {
// Zet de "_x" variable/propertie van de MovieClip aan de hand van de waarde van de "x" variable.
vlak._x = newVal;

// Geef de nieuwe waarde terug zodat de variable "x" van de MovieClip de opgegeven waarde toegewezen krijgt.
return newVal;
}

// Maak de watcher aan om te kijken of de variable "x" van de MovieClip is veranderd.
vlak.watch("x", variableWatcher);

// De MovieClip verplaatst zich per 3 pixels.
vlak.onEnterFrame = function(){
this.x += 3;
}

theFlashWizard
%Europe/Berlin %207 %2005, 05:59
jelmerdewilde, wat was nu uiteindelijk de oplossing?

TheDutch, whow erg interesante optie.. Khad er echt nooit van gehoort.. kan zeker wel van pas komen..
maar vaak is een trace op het punt waar je een var aanpast ook al voldoende..

TheDutch
%Europe/Berlin %430 %2005, 11:20
vaak is een trace op het punt waar je een var aanpast ook al voldoende..
Sorry, wat bedoel je hier precies mee? :)

theFlashWizard
%Europe/Berlin %553 %2005, 14:16
kijk.. stel je past zo je positie aan:
onEnterFrame = function(){
vlak._y += 80;
}
dan kun je alles controleren door het ook daar te tracen:
onEnterFrame = function(){
vlak._y += 80;
trace(vlak._y)
}

TheDutch
%Europe/Berlin %572 %2005, 14:43
Daar heb je helemaal gelijk in, wanneer het om een animatie gaat de via ActionScript werkt dmv. onEnterFrame of setInterval zou je het heel goed op die manier kunnen oplossen. Dan is Object.watch niet nodig :).