Flashhilfe.de - Flash Community

TimerEvent lauscht weiter obschon zugehöriger mc nicht mehr auf Bühne ist [Flash CS4]

 


AntwortenRegistrieren Seite1  

efen#1
Benutzerbild von efen
Beiträge: 12
Wohnort: jena
Registriert: Jan 2009

26.02.2009, 11:37

Moin,

wie bemerkt, lauscht ein EventListnener weiter (hängt noch im speicher), obschon actionLayer als auch zugehöriger mc nicht mehr auf bühne ist, habe daher meine if else Kondition erweitert, leider ohne Erfolg und muß euch nun um Rat ersuchen.

Fehlermeldung:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
at simmondsV1_fla::navileisteCont_1/moveF()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

TimerEvent also weiterhin aktiv, obgleich doch diese Kondition korrekt ist?
Timer soll nur starten wenn Mouse zwischen Y 40 und 220 liegt und! auf der HZL noch nicht Frame 10 erreicht ist - vermutlich liegt bei letzterer Bedingung der Fehler, sieht aber korrekt aus für mich:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
function f(e:MouseEvent)
   {
   if(mouseY > 40 && mouseY < 220 && MovieClip(root).currentFrame <= 9)
      {
      t.start();
      }
   else
      {
      t.stop();
      }
}


hier nochmal der code im zusammenhang: es ist ein Laufbandmenü, wenn es aber entfernt ist und ich auf der HZL weiter springe kommt Fehler vom anfang im Output-fenster

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
front_mc.addEventListener(MouseEvent.MOUSE_MOVE,f);
var t:Timer=new Timer(30,0);
t.addEventListener(TimerEvent.TIMER,moveF);

function f(e:MouseEvent)
   {
   if(mouseY > 40 && mouseY < 220 && MovieClip(root).currentFrame <= 9)
      {
      t.start();
      }
   else
      {
      t.stop();
      }
}
var speed:Number = .9;
function moveF(e:TimerEvent)
   {
   front_mc.x =speed*front_mc.x+(1-speed)*(stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth;
   back_mc.x = speed*back_mc.x+(1-speed)*(stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth;
   if (Math.abs(front_mc.x- (stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth)<1 && Math.abs(back_mc.x-(stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth)<1)
   {
      front_mc.x = (stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth;
      back_mc.x = (stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth;
      t.stop();
   }
   e.updateAfterEvent();
}
f0rml3ss#2
Benutzerbild von f0rml3ss
Beiträge: 447
Registriert: Mar 2008

26.02.2009, 11:55

obschon actionLayer als auch zugehöriger mc nicht mehr auf bühne ist, du meinst also, du löschst diese Objecte (mit removeChild ?)

Falls es sich bei den Objecten um "front_mc" bzw "back_mc" handelt musst du logischerweise den Timer stoppen, ihn löschen, da er sich in der Funktion "moveF" ja immernoch auf diese bezieht, obwohl diese nicht mehr vorhanden sind.

ActionScript:
1
2
3
//Du kannst übrigens auch schreiben
var t:Timer=new Timer(30);
// Die zweite Zahl brauchst du nicht, da 0 bzw kein Wert den Wert "unendlichoft / immer" darstellen.
Adobe AS3.0 Stichwortverzeichnis
efen#3
Benutzerbild von efen
Beiträge: 12
Wohnort: jena
Registriert: Jan 2009

Themenautor/in

26.02.2009, 12:09

leider bin ich kein OOP und setze alles in Flash händisch.geht ja auch ganz gut. daher hab ich front_mc und back_mc nicht mit addchild platziert, dachte mir das das kommt: es gibt also keine direkt programmierte displaylist meinerseits und ich denke, der listener/timer hängt noch im speicher.
(hatte auch versucht, das zu umgehen indem ich einfach in szene2 springe wo von anfang das laufband nicht gesetzt ist - ohne erfolg (mehrere szenen stinken auch, ich weiß).

ich wollte aus diesem grund, meine if else bedingung erweitern, denn wenn ich sage, starte timer nur, wenn auf der HZL noch nicht frame10 erreicht wurde, ist die sache gegessen.

if(mouseY > 40 && mouseY < 220 && MovieClip(root).currentFrame <= 9)

eigentlich müßte flash das doch so fressen, oder?
springer#4
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

26.02.2009, 12:37

du solltest den listener entfernen. versuch mal so:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
function f(e:MouseEvent)
  {
  if(mouseY > 40 && mouseY < 220 && MovieClip(root).currentFrame <= 9)
      {
      t.addEventListener(TimerEvent.TIMER,moveF);
      t.start();
      }
  else
      {
      t.stop();
      t.removeEventListener(TimerEvent.TIMER,moveF);
      }
}
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
efen#5
Benutzerbild von efen
Beiträge: 12
Wohnort: jena
Registriert: Jan 2009

Themenautor/in

26.02.2009, 13:24

danke für die schnelle und gute Idee, hat leider nicht gefunzt, völlig unklar warum.
was aber sehr! eingeschränkt funzt, ist das integrieren der function moveF in die if else Kondition.
macht er klaglos, jedoch entfernt er den Timer zu schnell (vermute ich), denn anstatt wie vorher schön dahinzugleiten, ist es nun kurzes abruptes hin-und her hüpfen :(

habt ihr eine idee, warum springers Vorschlag nicht geht?

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
front_mc.addEventListener(MouseEvent.MOUSE_MOVE,f);
var t:Timer=new Timer(30);

function f(e:MouseEvent)
{
   if(mouseY > 40 && mouseY < 220 && MovieClip(root).currentFrame <= 9)
      {
      t.addEventListener(TimerEvent.TIMER,moveF);
      t.start();
      var speed:Number = .9;
   function moveF(e:TimerEvent)

      {
   front_mc.x =speed*front_mc.x+(1-speed)*(stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth;
   back_mc.x = speed*back_mc.x+(1-speed)*(stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth;
   if (Math.abs(front_mc.x- (stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth)<1 && Math.abs(back_mc.x-(stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth)<1)
   {
      front_mc.x = (stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth;
      back_mc.x = (stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth;
      t.stop();
   }
   e.updateAfterEvent();
   }      
      
      }
   else
      {
      t.removeEventListener(TimerEvent.TIMER,moveF);
      t.stop();
      }
}
Geändert von efen am 26.02.09 um 13:25 Uhr
f0rml3ss#6
Benutzerbild von f0rml3ss
Beiträge: 447
Registriert: Mar 2008

26.02.2009, 14:16

Wundert mich ja das Springer noch nicht gemeckert hat =), dann weise ich dich mal drauf hin, dass du die Funktionen besser sauber trennen solltest.
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
front_mc.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveListener);
var timer:Timer=new Timer(30);
var speed:Number=.9;

function mouseMoveListener(e:MouseEvent):void {
   if (stage.mouseY>40&&stage.mouseY<220&&MovieClip(root).currentFrame<=9) {
      timer.addEventListener(TimerEvent.TIMER,timerListener);
      timer.start();
   } else {
      timer.removeEventListener(TimerEvent.TIMER,timerListener);
      timer.stop();
   }
}

function timerListener(e:TimerEvent):void {
   front_mc.x =speed*front_mc.x+(1-speed)*(stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth;
   back_mc.x = speed*back_mc.x+(1-speed)*(stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth;
   if (Math.abs(front_mc.x- (stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth)<1 && Math.abs(back_mc.x-(stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth)<1) {
      front_mc.x = (stage.stageWidth-front_mc.width)*mouseX/stage.stageWidth;
      back_mc.x = (stage.stageWidth-back_mc.width)*mouseX/stage.stageWidth;
      timer.stop();
   }
   e.updateAfterEvent();
}


evtl noch...
ActionScript:
1
2
3
4
5
6
7
8
9
//anstatt
if(mouseY > 40 && mouseY < 220 && MovieClip(root).currentFrame <= 9)

//könntest du doch auch MovieClip(root) durch stage ersetzen,
// trace(MovieClip(root)) erhälst du zwar  //[object MainTimeline] aber das ist ja die Stage
// trace(MovieClip(root).currentFrame)  // >>1
// trace(stage.currentFrame) // >> 1

if(stage.mouseY > 40 && stage.mouseY < 220 && stage.currentFrame <= 9)
Adobe AS3.0 Stichwortverzeichnis
efen#7
Benutzerbild von efen
Beiträge: 12
Wohnort: jena
Registriert: Jan 2009

Themenautor/in

26.02.2009, 16:33

hei,
vielen, vielen Dank. hat leider nicht geklappt - shame on me - dann muß ich mir was anderes einfallen lassen :(
dennoch, freu ich mich sehr, daß ihr mir geholfen habt
bei stage.currentFrame<=9 hat er gemeckert

&&MovieClip(root).currentFrame<=9
vielleicht nimmt er einfach keine 3. expression an bei der if-condi, hatte in der hilfe auch nichts von einer 3. mgl. gelesen, andererseits, ist es ja nur eine aneinanderreihung. komisch.hab auch die frames auf der HZL nochmal gecheckt, stimmt schon mit der 10
f0rml3ss#8
Benutzerbild von f0rml3ss
Beiträge: 447
Registriert: Mar 2008

26.02.2009, 17:02

hm bei mir hat's so geklappt,..aber anscheinend ist mein Aufbau doch anders als deiner =/


bei der If-Abfrage kann man eigentlich beliebig vieles Abfragen,...sollte halt nur alles true ergeben - kommt drauf an was man will =)
Adobe AS3.0 Stichwortverzeichnis
efen#9
Benutzerbild von efen
Beiträge: 12
Wohnort: jena
Registriert: Jan 2009

Themenautor/in

26.02.2009, 18:01

wow,  dank Dir für die mühe. der fehler selbst tritt ja auch erst zutage, wenn ich im front_mc einen button klicke der auf frame10 verweist, dort ist front_mc wie bemerkt nicht mehr platziert und dann kommt erst die output-fehlermeldung, welche sich solange wiederholt, bis test-fenster geschlossen ist.

geil, hab ich mir Deinen hergenommen und gleich mal den fehler repliziert, fehler einbauen, sollte ich beruflich machen, geht so schnell bei mir
http://rapidshare.de/files/45659350/prob_CS4.fla.html
ging nicht besser mit dem upload auf die schnelle
achja: in der if-abfrage ist framenr. noch nicht auf 2 korrigiert
Geändert von efen am 26.02.09 um 18:13 Uhr

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Das Leben geht weiter [Flash CS5] 12.01.2021 - Indy_Crossover
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2022 Sebastian Wichmann - Flashhilfe.de