Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-06-2011, 09:58   #1 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Question addChild in .as Datei

Hallo Leute,
ich hab jetzt schon was länger versucht ohne Hilfe aus dem Forum und nur mittels Bücher, Google etc dieses Problem zu beheben..

Aber ich komm einfach nicht weiter...

Ich habe ein Array in dem mehrere Werte stehen box0 - box5, also 6 Werte.

Diese möchte ich jetzt mittels meiner Funktion buildMc(); als MC erzeugen größe, x Koordinate etc mitgeben und auf die Bühne schmeißen..

sobald ich versuche die Dinger auf die Bühne zu schmeißen bekomme ich folgenden Fehler:

Code:
ArgumentError: Error #2024: Ein Objekt kann nicht als untergeordnetes Element seiner selbst hinzugefügt werden.
	at flash.display::DisplayObjectContainer/addChild()
	at meineKlasse/buildMc()
	at Unbenannt_fla::MainTimeline/frame1()
Hier mal ein Auszug aus meiner Klasse:
Code:
public function buildMc(objArray:Array):void{
	for(var i:uint = 0; i <= (objArray.length-1); i++){

		objArray[i].graphics.beginFill(0x0000);
		objArray[i].graphics.drawRect(0, 0, 100,100);
		objArray[i].graphics.endFill();
				
		objArray[i].boxName = 'titelbox'+i; 
		objArray[i].x = firstXcor;
		objArray[i].width = _toScaleWidthA;
		objArray[i].height = _toScaleHightA;
		firstXcor += (_toScaleWidthA + _zwischenAbstand);
		trace(objArray[i].boxName);
		addChild(objArray[i]);
	}
}
Was mach ich falsch?
Danjy ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:02   #2 (permalink)
Neuer User
 
Benutzerbild von padavan
 
Registriert seit: Apr 2002
Beiträge: 496
zeig mal dein objArray
__________________
Grafik - Webdesign - Programmierung - www.thsc.at
Adventkalender 2011 advent.wien.info/de
Jobspace - Universum der Lehrstellen www.jobspace.at
padavan ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:10   #3 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Das bau ich mir in der .fla so zusammen:
Code:
var boxes:Array = new Array();
for (var i:uint = 0; i < anzahlDerBoxen; i++) {
	var box:meineKlasse = new meineKlasse();
	box.boxName = 'box'+i;
	boxes.push(box);
}
Danjy ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:14   #4 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von Danjy Beitrag anzeigen
Was mach ich falsch?
Wie die Fehlermeldung schon sagt:
Zitat:
Ein Objekt kann nicht als untergeordnetes Element seiner selbst hinzugefügt werden.
Wenn Du innerhalb eines DisplayObjects (z.B. der Instanz dieser Klasse) addChild verwendest, fügst Du damit eine anderes DisplayObject das vorliegende ein.Das funktioniert natürlich nicht, wenn das DisplayObject, das da eingefügt werden soll, selbst die aktuelle Instanz ist, oder diese enthält(, weil das Resultat eine Art logische Endlosschleife wäre).
  • Was befindet sich denn in dem objArray?
  • Was ist diese Klasse?
  • Warum verwaltet sie Eigenschaften, die ihr von der Hauptzeitleiste übergeben werden?
  • Zeig mal etwas mehr Code!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:17   #5 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von Danjy Beitrag anzeigen
Das bau ich mir in der .fla so zusammen:
Code:
var boxes:Array = new Array();
for (var i:uint = 0; i < anzahlDerBoxen; i++) {
	var box:meineKlasse = new meineKlasse();
	box.boxName = 'box'+i;
	boxes.push(box);
}
Wenn Du mit diesem boxes-Array die Funktion buildMc einer der meineKlasse-Instanzen aufrufst, ist es kein Wunder, dass es zu dem besagten Problem kommt. Das Array enthält ja bereits die Instanz, die später das addChild ausführen soll...

P.S.: Klassennamen sollten immer mit einem Großbuchstaben beginnen (also MeineKlasse statt meineKlasse) und den Inhalt und die Funktion der Klasse beschreiben (Box wäre daher ein besserer Klassenname).
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (08-06-2011 um 10:20 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:22   #6 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Danke schonmal für die Antwort...

Also alles was ich momentan will ist einfach nur dynamisch 6 Kasten ausgeben die eine sich selber nebeneinander Positionieren mit einen gewissen Abstand.

meine Klasse:
Code:
package{
	import fl.transitions.Tween;
	import fl.transitions.easing.*;
	import fl.transitions.TweenEvent;
	import flash.display.*;

	public class meineKlasse extends flash.display.MovieClip{		
		
		public var boxName:String;
		public var _corX:Number;
		public var _scaleX:Number;
		public var _scaleY:Number;
		public static var timeToMove:Number = 0;
		
		public static var firstXcor:Number = 0;
		
		private var _toScaleWidthA:Number = 820;
		private var _toScaleHightA:Number = 500;
		private var _toScaleWidthB:Number = 994;
		private var _toScaleHightB:Number = 606;
		private var _zwischenAbstand:Number = 10;
		
		
		public function meineKlasse():void {
			//constructor
		}
		
		
		public function buildMc(objArray:Array):void{
			for(var i:uint = 0; i <= (objArray.length-1); i++){
				//trace(objArray[i].boxName);
				//var titelbox:MovieClip = objArray[i];
				//titelbox.boxName = 'titelbox'+i;
				//trace(titelbox.boxName);
				
				objArray[i].graphics.beginFill(0x0000);
				objArray[i].graphics.drawRect(0, 0, 100,100);
				objArray[i].graphics.endFill();
				
				objArray[i].boxName = 'titelbox'+i; 
				objArray[i].x = firstXcor;
				objArray[i].width = _toScaleWidthA;
				objArray[i].height = _toScaleHightA;
				firstXcor += (_toScaleWidthA + _zwischenAbstand);
				trace(objArray[i].boxName);
				addChild(objArray[i]);
			}
		}
		
	}
}
und alles was in der .fla passiert:
Code:
import meineKlasse;
var anzahlDerBoxen:Number = 6;

stage.addEventListener(Event.ENTER_FRAME, enterFrameFunction);
function enterFrameFunction(evt:Event){
	
}

var boxes:Array = new Array();
for (var i:uint = 0; i < anzahlDerBoxen; i++) {
	var box:meineKlasse = new meineKlasse();
	box.boxName = 'box'+i;
	boxes.push(box);
}

box.buildMc(boxes);
Wie kann ich den verhindern das ich die ineinander Schachtel?
Wahrscheinlich muss ich das addChild in der .fla ausführen oder?
Danjy ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:30   #7 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Ich habe es jetzt einmal so versucht aufzurufen..
Code:
var titelbox:meineKlasse = new meineKlasse();
titelbox.buildMc(boxes);
jetzt kommt der Fehler nicht mehr.. jedoch werden meine Kasten noch immer nicht angezeit...

Kann es sein das ich die immer wieder Überschreibe ?
Da ich bei
Code:
trace(box.boxName);
nur das letzte Objekt bekomme..

Also irgendwas stimmt da noch nicht..
Könnte ich jetzt mittels getChildByName auf das erzeugte MC zugreifen?

Geändert von Danjy (08-06-2011 um 10:38 Uhr)
Danjy ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:42   #8 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Wie gesagt: Das addChild bezieht sich auf die Box in der es steht.

Wenn ich mir Deinen Code so ansehen, sollte die Funktion buildMc auch eigentlich nicht in der Box-Klasse stehen, sondern in dem Objekt, das die Boxen verwaltet, dass könnte eine zweite Klasse sein, aber auch einfach die Zeitleiste in der Du z.Z. die Boxen generierst.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:46   #9 (permalink)
?-Developer
 
Registriert seit: Jul 2004
Ort: Zuchwil (CH)
Beiträge: 901
Versuchs mal so (habs nicht getestet)

AS-Datei/Klasse
Code:
public function buildMc(objArray:Array, pThis:*):void{
  // Dein Code
  pThis.addChild(objArray[i]);
}
FLA-DATEI
Code:
box.buildMc(boxes, this);
__________________
Nur tote Fische schwimmen mit dem Strom
silentx ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:51   #10 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Hmm.. Sorry aber ganz versteh ich das noch nicht...

also Generieren des Arrays und Aufruf der buildMc-Funktion:
Code:
var boxes:Array = new Array();
for (var i:uint = 0; i < anzahlDerBoxen; i++) {
	var box:meineKlasse = new meineKlasse();
	box.boxName = 'box'+i;
	boxes.push(box);
}

var titelbox:meineKlasse = new meineKlasse();
titelbox.buildMc(boxes);

Und die Funktion selber
Code:
public function buildMc(objArray:Array):void{
	for(var i:uint = 0; i <= (objArray.length-1); i++){
				
		objArray[i].graphics.beginFill(0x0000);
		objArray[i].graphics.drawRect(0, 0, 100,100);
		objArray[i].graphics.endFill();
				
		objArray[i].boxName = 'titelbox'+i; 
		objArray[i].x = firstXcor;
		objArray[i].width = _toScaleWidthA;
		objArray[i].height = _toScaleHightA;
		firstXcor += (_toScaleWidthA + _zwischenAbstand);
		trace(objArray[i].boxName);
		addChild(objArray[i]);
	}
}
Das klappt ja jetzt auch so halb.. Also der Befehl [I]trace(objArray.boxName); gibt mir ja titelbild0 - titelbild5 aus.. das füllen der Mcs klappt nicht.. Es scheint auch als würde kein einziges MC auf der Bühne liegen, und ich weiß auch nicht wie ich die einzelnen Objekte jetzt ansprechen könnte...

Sorry aber wie genau soll ich vorgehen?
Danjy ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:52   #11 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Ich würd's so machen:

Box.as
PHP-Code:
package {
    
import flash.display.Sprite;

    public class 
Box extends Sprite{        
        
        public var 
boxName:String;
        
        
//
        
        
private var _toScaleWidthA:Number 820;
        private var 
_toScaleHightA:Number 500;
        private var 
_toScaleWidthB:Number 994;
        private var 
_toScaleHightB:Number 606;
        
        
//////////////////////////////////////////
        
        
public function Box() {
            
draw();
            
            
width _toScaleWidthA;
            
height _toScaleHightA;
        }
        
        
//////////////////////////////////////////
        
        
private function draw():void{
            
graphics.beginFill(0x0000);
            
graphics.drawRect(00100,100);
            
graphics.endFill();
        }
    }

Zeitleiste:
PHP-Code:
var boxes:Array = [];

function 
generateBoxes(anzahlDerBoxen:uint 6):void {
    var 
xi:Number 0;
    var 
zwischenAbstand:Number 10;

    for (var 
i:uint 0anzahlDerBoxeni++) {
        var 
box:Box = new Box();
        
box.boxName 'titelbox' i;
        
        
boxes.push(box);
        
addChild(box);
        
        
box.xi;
        
xi += box.width _zwischenAbstand;
    }
}

generateBoxes(); 
P.S.: Wenn Du AS-Tweenings einsetzen möchtest, würde ich von der Flash-eigenen Tweening-Klasse abraten (mit der gibt's immer wieder Probleme). Verwende stattdessen besser eine ausgewachsene Engine, wie Tweensy oder TweenLite.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (08-06-2011 um 10:56 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-06-2011, 10:53   #12 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Sauber danke @silentx klappt wunderbar.. könntest du mir kurz eine kleine erklärung geben warum :P ?
Zitat:
P.S.: Wenn Du AS-Tweenings einsetzen möchtest, würde ich von der Flash-eigenen Tweening-Klasse abraten (mit der gibt's immer wieder Probleme). Verwende stattdessen besser eine ausgewachsene Engine, wie Tweensy oder TweenLite.
Okay werde es damit mal ausprobieren wenn ich soweit bin

Ich hätte noch eine letzte Frage.. wenn ich jetzt das script so benutze mit der kleinen Änderung von silentx.. Wie genau greif ich jetzt auf die einzelnen Elemente in der .as zu?

Geändert von Danjy (08-06-2011 um 11:07 Uhr)
Danjy ist offline   Mit Zitat antworten
Alt 08-06-2011, 11:08   #13 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von silentx Beitrag anzeigen
Versuchs mal so (habs nicht getestet)

AS-Datei/Klasse
Code:
public function buildMc(objArray:Array, pThis:*):void{
  // Dein Code
  pThis.addChild(objArray[i]);
}
FLA-DATEI
Code:
box.buildMc(boxes, this);
Sorry silentx, ich will Dir da wirklich nicht reinkrätschen, aber aus OOP-Sicht ist das nicht mal die zweitbeste Lösung:
  • Man sollte wenn irgendmöglich vermeiden auf eine WildCard (*) zu typisieren. In diesem Spezialfall ist so nämlich nicht mal sichergestellt, dass pThis.addChild überhaupt existiert. Wenn überhaupt würde ich daher pThis als DisplayObjectContainer typisieren.

  • Außerdem sollte sich grundsätzlich jedes Objekt um seinen eigenen Sch*** kümmern. Und die Positionierung aller Box-Instanzen gehört definitiv nicht in den Aufgabenbereich einer einzelnen Instanz.

@Danjy: Schau Dir deshalb bitte mal meinen Vorschlag an. Eine saubere Abgrenzung der Klassen ist nämlich die beste Garantie dafür, später keine Probleme zu bekommen...
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (08-06-2011 um 12:35 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-06-2011, 11:08   #14 (permalink)
?-Developer
 
Registriert seit: Jul 2004
Ort: Zuchwil (CH)
Beiträge: 901
@Danjy : Erklärung warum es funktioniert
Jetzt bezieht sich das addChild auf die fla-datei und nicht mehr auf sich selbst.
Somit ist es eine andere Klasse. Jedoch ist es nicht wirklich schön gelöst so.

(Wieder ungetestet)
wenn du beim erfassen statt .boxName nur .name verwendest könntest du
in der fla datei folgendermassen abfragen

Code:
var mybox:* = getChildByName('Titelbox 1');
__________________
Nur tote Fische schwimmen mit dem Strom
silentx ist offline   Mit Zitat antworten
Alt 08-06-2011, 11:14   #15 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Vielen Dank an euch beide ihr habt mir sehr sehr weitergeholfen
Danjy ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
addchild, array, as3, werte

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
[Flash CS5] externe as datei tuturial || addChild(); usw. Opi3 Flash Einsteiger 1 13-03-2011 22:07
[Flash CS4] addChild ... KnightofLight Flash Einsteiger 2 31-01-2011 07:30
[Flash CS4] addChild(); Timyy Flash Einsteiger 4 11-10-2010 20:39
.addChild(mc) in as2 flasher_81 ActionScript 2 2 04-08-2010 14:10
addChild TheLight ActionScript 3 13 21-04-2007 12:02


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele