Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 10-02-2011, 00:43   #1 (permalink)
| ||[ PIXON ] ||
 
Benutzerbild von pixon
 
Registriert seit: Apr 2002
Beiträge: 364
stagelistener reagiert auf movieclip click

Hallo!
Ich habe ein kleines großes Problem
Ich erstelle gerade eine Navigation in AS3 und sie will nicht so wie ich es will…

Die Navigation ist wie folgt aufgebaut:
Wenn ich mit der Maus über einen transparenten Movieclip fahre, wird dieser eingeblendet. In diesem Movieclip liegen 5 andere Movieclips, die „Buttons“.
Wenn ich nun auf einen der Buttons klicke sollte ein Movieclip mit mehreren Bildern geladen werden, in denen man mit einem click auf die stage blättern kann. Die besagt stage click Funktion wird aber bereits beim click auf den Button ausgeführt.

Beim 5 ten Button wird eine externe swf geladen. Das klappt auch irgendwie nicht

Hier der Code:
Code:
package 
{
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import fl.transitions.Tween;
	import fl.transitions.easing.*;


	public class IndexAs extends MovieClip
	{
		public var thumbgrid:MovieClip;

		public function IndexAs()
		{
			thumbgrid.alpha = 0;
			thumbgrid.addEventListener(MouseEvent.ROLL_OVER, mOver);
			thumbgrid.addEventListener(MouseEvent.ROLL_OUT, mOut);
			thumbgrid.addEventListener(MouseEvent.CLICK, clicked);
			stage.addEventListener(MouseEvent.CLICK, sClick);
		}

		function clicked(e:MouseEvent):void
		{
			switch (e.target.name)
			{
				case "instance14" :
					trace("1");
					mOut();
					break;
				case "instance12" :
					trace("2");
					break;
				case "instance10" :
					trace("3");
					break;
				case "instance8" :
					trace("4");
					break;
				case "instance3" :
					loadAni();
					break;
			}
		}
		
		function mOver(e:MouseEvent):void
		{
			var tIn:Tween = new Tween(e.currentTarget,"alpha",Strong.easeOut,0,1,0.5,true);
		}
		
		function mOut(e:MouseEvent):void
		{
			var tOut:Tween = new Tween(e.currentTarget,"alpha",Strong.easeOut,1,0,0.5,true);

		}
		
		function loadAni(e:MouseEvent):void
		{
			trace("****");
		}
			
		function loadInit(e:Event):void
		{
			e.currentTarget.removeEventListener(Event.COMPLETE,loadInit);

			if (currentContent)
			{
				removeChild(currentContent);
			}

			currentContent = DisplayObject(e.currentTarget.content);
			addChild(currentContent);
		}
		
		function sClick(e:MouseEvent):void
		{
			trace("CLICK");
		}
	}

}
Achja, was hat es eigentlich mit dem ArgumentError: Error #1063 auf sich?
Ich wäre für jede Hilfe sehr dankbar.
pixon ist offline   Mit Zitat antworten
Alt 10-02-2011, 01:26   #2 (permalink)
ING
whatever
 
Registriert seit: May 2008
Beiträge: 419
das müsste dir eigentlich einen ganzen haufen an fehlermeldungen entgegenballern weil da doch so einiges im argen ist. ich tippe mal darauf das du die flash gui nutzt

bin mir nicht sicher ob ich das problem so richtig verstanden hab aber das problem kannst du eigentlich lösen wenn du als erste zeile in die clicked funktion folgendes einträgst...

ActionScript:
  1. if (e.target != e.currentTarget) return;
ansonsten weiß ich nicht wo ich so recht anfangen soll, thumbgrid ist ein null objekt, currentContent ist unbekannt, die functions haben keinen namespace usw.

überleg dir mal die gui zu wechseln, flashdevelop ist kostenlos und lässt flash verdammt alt aussehen was das programmieren angeht
ING ist offline   Mit Zitat antworten
Alt 10-02-2011, 01:57   #3 (permalink)
| ||[ PIXON ] ||
 
Benutzerbild von pixon
 
Registriert seit: Apr 2002
Beiträge: 364
danke für die Antwort!
ja ist die flash GUI möchte mich aber ungern in eine neue GUI reinfrickeln, weil die Präsentation schon am Freitag stehen muss. gibt es flashdevelop auch für mac?
habe deinen vorschlag befolgt, jetzt funktionieren leider die cases nicht?
pixon ist offline   Mit Zitat antworten
Alt 10-02-2011, 02:18   #4 (permalink)
ING
whatever
 
Registriert seit: May 2008
Beiträge: 419
mmh, ja. versteh den ganzen sinn dahinter jetzt nicht so recht aber entfern die zeile mal wieder und änder den switch in e.currentTarget.name, vllt. geht das.

ansonsten legt man normalerweise die listener direkt auf die buttons, mit dem stagelistener erspart man sich zwar ein haufen listener aber dafür wirds irgendwann ein ziemliches gefrickel. udn sauber is anderns
ING ist offline   Mit Zitat antworten
Alt 10-02-2011, 09:58   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Also warum der stage Listener reagiert, obwohl du deinen MovieClip anclickst ist nur logisch. Das ganze nennt sich Bubbling, sprich der Event wandert ausgehend vom auslösendem Objekt durch die komplette DisplayListe.

Da gibts zwei Wege dies zu umgehen:

1. Du sorgst dafür, dass deine Listener nur dann aktiv sind, wenn sie es auch sein sollen. Es gibt in deinem Beispiel kein Grund, warum der stage Listener von Anfang an da sein muss, den kannst du ja auch erst dann hinzufügen, wenn er wirklich gebraucht wird, sprich in der Listener Funktion deines MovieClips.
Es empfiehlt sich zusätzlich generell darauf zu achten, dass man Listener auch immer wieder entfernt, wenn sie nicht mehr gebraucht werden, ist vielleicht etwas mehr Arbeit, spart aber wahnsinnig viel Zeit bei der Fehlersuche insbesondere bei größeren Projekten.

2. Um das Event zu stoppen gibt es stopPropagation.
target und currentTarget Vergleiche sind da nicht unbedingt zielführend, weil fehleranfällig.
Lukas78 ist offline   Mit Zitat antworten
Alt 10-02-2011, 20:08   #6 (permalink)
| ||[ PIXON ] ||
 
Benutzerbild von pixon
 
Registriert seit: Apr 2002
Beiträge: 364
ich denke mal ich werde für jeden button einen eventlistener erstellen.
das problem mit der stage habe ich gelöst, indem ich eine große fläche als movieclip in den hintergrund gelegt habe. mein code sieht jetzt so aus:

Code:
package 
{
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import fl.transitions.Tween;
	import fl.transitions.easing.*;


	public class IndexAs extends MovieClip
	{
		public var menu:MovieClip;
		public var ff:MovieClip;
		public var punktemc:MovieClip = new punkte_mc();



		public function IndexAs()
		{
			menu.alpha = 0;
			menu.addEventListener(MouseEvent.ROLL_OVER, mOver);
			menu.addEventListener(MouseEvent.ROLL_OUT, mOut);
			menu.addEventListener(MouseEvent.CLICK, clicked);
			ff.addEventListener(MouseEvent.CLICK, sClick);
		}
		
		function clicked(e:MouseEvent):void
		{
			addChild(punkte_mc);
		}
		
		function mOver(e:MouseEvent):void
		{
			var tIn:Tween = new Tween(e.currentTarget,"alpha",Strong.easeOut,0,1,0.5,true);
		}
		
		function mOut(e:MouseEvent):void
		{
			var tOut:Tween = new Tween(e.currentTarget,"alpha",Strong.easeOut,1,0,0.5,true);
		}
		
		
		function sClick(e:MouseEvent):void
		{
			trace("CLICK");
		}
	}

}
kann mir mal jemand verraten warum der movieclip punkte_mc aus der library nicht geladen wird? bekomme diesen error:
Code:
TypeError: Error #1034: Typumwandlung fehlgeschlagen: punkte_mc$ kann nicht in flash.display.DisplayObject umgewandelt werden.
	at IndexAs/clicked()
pixon ist offline   Mit Zitat antworten
Alt 10-02-2011, 20:16   #7 (permalink)
ING
whatever
 
Registriert seit: May 2008
Beiträge: 419
PHP-Code:
punktemc:MovieClip = new punkte_mc(); 
sollte wohl new MovieClip() heißen.
und menu (ehemals datagrid) und ff sind beides null objekte obwohl du im konstruktor bereits mit ihnen arbeitest, ist auch ein fehler.

Geändert von ING (10-02-2011 um 20:18 Uhr)
ING ist offline   Mit Zitat antworten
Alt 10-02-2011, 20:42   #8 (permalink)
| ||[ PIXON ] ||
 
Benutzerbild von pixon
 
Registriert seit: Apr 2002
Beiträge: 364
Code:
public var menu:MovieClip = new MovieClip();
public var ff:MovieClip = new MovieClip();
public var punkte_mc:MovieClip = new MovieClip();
so richtig?

jetzt kommt zwar kein error, aber es passiert auch nichts beim klick. also der movieclip wird nicht aus der library geladen.

Geändert von pixon (10-02-2011 um 20:48 Uhr)
pixon ist offline   Mit Zitat antworten
Alt 10-02-2011, 21:36   #9 (permalink)
ING
whatever
 
Registriert seit: May 2008
Beiträge: 419
ach so, punkte_mc ist in der libary, war etwas irritierend weils klein geschrieben ist, dann war das richtig. der fehler war in der clicked funktion, da hast du den variablen namen mit unterstrich geschrieben.

also

ActionScript:
  1. public var menu:MovieClip = new MovieClip();
  2. public var ff:MovieClip = new MovieClip();
  3. public var punktemc:MovieClip = new PunkteMC(); // benenn das in der libary um
  4.  
und

ActionScript:
  1. function clicked(e:MouseEvent):void
  2. {
  3.     addChild(punktemc);
  4. }
wie schon erwähnt, ne vernüftige ide würde dir die fehler melden, bei flash darf man raten.
ING ist offline   Mit Zitat antworten
Alt 10-02-2011, 22:51   #10 (permalink)
| ||[ PIXON ] ||
 
Benutzerbild von pixon
 
Registriert seit: Apr 2002
Beiträge: 364
danke! es funktioniert!
pixon ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MouseEvent.CLICK reagiert nicht in I.E. 8 McKenna23 ActionScript 3 3 25-11-2010 15:30
MovieClip reagiert nicht auf onPress ronnydrechsler ActionScript 2 8 06-04-2008 14:31
Movieclip und on(click)-Anweisung Nuern Flash 8 3 25-01-2006 18:27
Movieclip per Click vor- oder zurück abspielen, Movieclip laden SYSmark23 Flash MX 2004 2 02-11-2005 15:58
button reagiert auf mac nur jeden zweiten click? jens3 Flash 4 und Flash 5 0 04-07-2002 17:32


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele