Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: ActionScript-ongelma

Sivun loppuun

Matso [21.04.2008 13:21:58]

#

Alottelen ActionScriptin harjottelua ja en tajuu mikä täs on vikana. Tän pitäis alottaa timeri vaan jos se on null, mutta se tuntuu aina vaan alottavan uuden timerin kun klikkaa tota objectia "a". Eli miks toi null tarkistus ei toimi?

var timer:Timer = null;

function rot(event:MouseEvent):void{
	if(timer == null){
		timer = new Timer(10);
		timer.addEventListener(TimerEvent.TIMER, tick);
		timer.start();
	}else{
		timer.stop();
		timer = null;
	}
}

function tick(event:TimerEvent):void{
	a.rotation += 3;
}

a.addEventListener(MouseEvent.CLICK, rot);

Lebe80 [21.04.2008 15:37:56]

#

var "muuttuja" ei ylety funktioiden sisälle, eikä myöskään funtiosta ulkopuolelle. Määrittele muuttuja ilman tuota var:a jos haluat siitä "globaalin".

neau33 [21.04.2008 16:24:30]

#

Heippa taas!

Lebe80 kirjoitti:

var "muuttuja" ei ylety funktioiden sisälle, eikä myöskään funtiosta ulkopuolelle. Määrittele muuttuja ilman tuota var:a jos haluat siitä "globaalin".

Joka tieto ei pidä paikkaansa...muuttuja on globaali ja näkyy koko scriptille, mutta sen arvo ei ole tässä tapauksessa null vaan undefined, koska sitä ei ole määritelty eli defined. Elikä jos muutat if(timer == null) muotoon if(timer == null || timer == undefined) niin määrittely tapahtuu automaattisesti, kun funktiota kutsutaan ensimmäisen kerran.
Itseasiassa nytkin määrittely tapahtuu ensimmäisellä kerralla else{} osan sisällä, mutta timer arvoksi tulee null eikä New Timer(10)

Lebe80 [22.04.2008 14:11:32]

#

neau33 kirjoitti:

...

Puhut eri asiasta kuin minä.

Flashissä muuttujia määriteltäessä var:lla muuttujasta tulee lokaali. Jos halutaan että ko. muuttuja määritellään funktion ulkopuolella ja se näkyisi myös funktion sisällä, jätetään sana "var" pois.

Totta on se, että tämän takia muuttuja määritellään ensimmäisen kerran funktion sisällä, koska arvo ei ole null vaan määrittelemätön undefined.

Tässä vielä Flashin Helpistä:

var variableName [= value1][...,variableNameN[=valueN]]

Used to declare local variables. If you declare variables inside a function, the variables are local. They are defined for the function and expire at the end of the function call.

nimim. työkseen fläsäyttäjä.

neau33 [22.04.2008 15:36:16]

#

Heippa taas!

Lebe80 kirjoitti:

...
Tässä vielä Flashin Helpistä:

var variableName [= value1][...,variableNameN[=valueN]]

Used to declare local variables. If you declare variables inside a function, the variables are local. They are defined for the function and expire at the end of the function call.

nimim. työkseen fläsäyttäjä.

I just give a shit for all about that; in this case the varible had been declared outside the function, but not defined and that's the point!

If you don't believe me just do make a test with another function and see whether the variable has a different value or not after calling the function that defines the variable...

Lebe80 [22.04.2008 15:56:56]

#

Ei voi tietää ku ei näe koodia.

edit:
tässä siis oma koodini

var foo = "bar";
function a() {
	var foo = "foobar";
	trace(foo);
}
function b() {
	var foo = "barfoo";
	trace(foo);
}
a();
b();
trace(foo);



// foobar
// barfoo
// bar
foo = "bar";
function a() {
	foo = "foobar";
	trace(foo);
}
function b() {
	foo = "barfoo";
	trace(foo);
}
a();
b();
trace(foo);

// foobar
// barfoo
// barfoo

I rest my case.

jlaire [22.04.2008 16:40:22]

#

Pysyykö ensimmäisen esimerkkisi tulos samana, jos a:n ja b:n sisältä jättää var:in pois eli laittaa vaan "foo = ..."? Entä jos toiseen esimerkkiin lisää nuo var:it, muuttavatko funktiot silti globaalia foo:ta? Tässähän on kyse nimenomaan siitä, onko ulommassa määrittelyssä käytetty var:ia vai ei.

En väitä tietäväni ActionScriptistä mitään, mutta ainakaan dokumentaatiossa ei suoraan sanota, että ulompana määritellyt muuttujat eivät näkyisi sisempiin funktioihin. Toisin päin se toki pitää paikkansa.

neau33 [24.04.2008 23:55:39]

#

Heippa taas!

vastauksena alkuperäiseen kysymykseen + ammattilaisille...

var timer;

function rot(event:MouseEvent):void{
  if((timer == undefined)||(timer == null)){

    //trace(timer);
    timer = new Timer(10);
    timer.addEventListener(TimerEvent.TIMER, tick);
    timer.start();
  }
  else{
    //trace(timer.delay);
    timer.stop();
    timer.removeEventListener(TimerEvent.TIMER, tick);
    timer = null;
  }
}

//...

...ei harras flässääjä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta