Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 23-11-2005, 23:49   #1 (permalink)
Neuer User
 
Registriert seit: May 2003
Ort: Aschersleben
Beiträge: 80
nach "duplicate mc" Instanzen bewegen

Hallo mal wieder,

also ich bin gerade froh ne for Schleife begriffen zu haben, von daher die einfachen Fragen:

Ich möchte einfach ein paar Objekte bspw. von links nach rechts zufällig über den Bildschirm fliegen lassen.

Habe Instanz 10x dupliziert mit:
for(i=1;i<10;i++)
{

duplicateMovieClip("_root.test", "test" + i, i);

setProperty(_root["test" + i], _x, random(120)+20);

}
Mit "Set Property" wie hier im Bsp. kann man ja gut Eigenschaften vergeben.
Aber wie bekomme ich da ne Bewegung rein.
also sowas wie "_root.test1._x = _x +1;"

2. Frage

Ich hab mit ner if Abfrage in der for Schleife versucht auf nen anderen Frame zu springen, also bspw:
if (i==9) {gotoAndPlay... usw.

Das geht aber irgendwie nicht. Wahrscheinlich wieder was ganz simples.


Schonmal vielen Dank für die Hilfe.
Es wäre schön wenn ihr nicht einfach nur nen Script hinschreibt, sondern es auch ein wenig erklärt.
Dann kann ichs vielleicht auch mal irgendwann;-)


Gruß Andreas

Geändert von andbal (23-11-2005 um 23:51 Uhr)
andbal ist offline   Mit Zitat antworten
Alt 24-11-2005, 13:16   #2 (permalink)
°.oO°O.o°.oO.o°O
 
Benutzerbild von bamboocha
 
Registriert seit: Jun 2005
Ort: CH
Beiträge: 1.490
Ok... hier erstmal der Code...

Code:
for(i=1;i<10;i++) 
{
	duplicateMovieClip("test", "test" + i, i);
	_root["test" + i]._x = random(120)+20;
	_root["test"+i].onEnterFrame = function() {
			this._x += 3;
	}
}
Zur Erklärung...
Die Schleife dürfte dir klar sein. Das "_root" beim duplicate kannst du weglassen, die Instanz heisst ja sicherlich einfach nur "test"!? Dann kannst du anstatt setProperty auch ganz einfach den x-Wert direkt verändern, indem du ihn ansprichst...
dann legst du einfach zusätzlich auf jeden MovieClip noch ein ClipEvent Namens "onEnterFrame" (auf MC: on(EnterFrame) ), das ständig ausgeführt wird und sich selbst immer um 3 weiterschiebt, also weiterhin auf seinen x-Wert zugreift.
__________________
There is no way to happiness, happiness is the way! - Buddha
bamboocha ist offline   Mit Zitat antworten
Alt 24-11-2005, 16:00   #3 (permalink)
Neuer User
 
Registriert seit: May 2003
Ort: Aschersleben
Beiträge: 80
Hi Bamboocha,

vielen Dank, das ist erstmal genau das was ich wollte.
Die onEnterframe funktion ist also ungefähr das gleiche, als wenn ich das in einen mc auf der Bühne schreiben würde, oder?

Jetzt sollen die mc's irgendwann wieder auf die Anfangs xpos zurückspringen.

Wollte anfangs_x auslesen, dann immer Abstand vergleichen und wenn bestimmter Abstand erreicht ist, sollen sie zurückspringen.


Ich fang mal an mit testen. Mal sehen ob's was wird.
andbal ist offline   Mit Zitat antworten
Alt 24-11-2005, 16:40   #4 (permalink)
Neuer User
 
Registriert seit: May 2003
Ort: Aschersleben
Beiträge: 80
Ok, ich bin's gleich nochmal.
Wieder erwarten hat das mit dem zurückspringen sofort funktioniert.
Scheinbar lerne ich hier dochwas.

Jetzt möchte ich nur noch, dass die mc's nach jedem zurückspringen ihre Eigenschaften zufällig verändern.

Ich hab schon versucht das Skript umzubauen.

Aber kann man in eine onEnterFrame Funktion eine weitere onEnterFrame Funktion verschachteln.

for(i=1;i<10;i++)
{
xa = this._x;
duplicateMovieClip("test", "test" + i, i);
_root["test" + i]._x = random(120)+20;
_root["test" + i]._y = random(120)+20;
_root["test"+i].onEnterFrame = function()
{
//für die x Bewegung
this._x += 2;
xd = this._x - xa;

if (xd >=200)
{
this._x = this._x - xd;

//Für die Veränderung der Größe nach jedem zurückspringen
_root["test"+i].onEnterFrame = function()
{
this._width = random(30);
}
}
}
}
Denn laufen tut es zwar aber die Größe bleibt gleich.
andbal ist offline   Mit Zitat antworten
Alt 25-11-2005, 09:55   #5 (permalink)
°.oO°O.o°.oO.o°O
 
Benutzerbild von bamboocha
 
Registriert seit: Jun 2005
Ort: CH
Beiträge: 1.490
Hi... ich nochmal
Das onEnterFrame ist das selbe, wie wenn du auf den MC "onClipEvent(EnterFrame) [...]" schreiben würdest...
Also das mit dem Zurückspringen... du weisst schon, dass alle Objekte den selben Anfangspunkt xa nehmen (der zudem gesetzt wird, bevor this definiert ist!), da dieser bei jedem Ausführen der Schleife neu gesetzt wird und zum Schluss einfach den Wert des letzten Objektes besitzt.
Du brauchst keine verschachtelten onEnterFrame's! Du kannst ja das Verändern der Grösse, bzw. Eigenschaften beim Zurücksetzen ausführen lassen, soll ja nur dann geschehen! Ausserdem würde ich nicht unbedingt einen Abstand zum Starpunkt wählen (ausser du willst das wirklich), sondern fragst einfach ab, wann das Objekt ausserhalb der Bühne ist (this._x > Stage.width) und setze es dann zurück.

Also ich denke, folgender Code dürfte in etwa das erfüllen, was du suchst:
Code:
for(i=1;i<10;i++) 
{
     duplicateMovieClip("test", "test" + i, i);
     this["test" + i]._x = random(120)+20;
     //Hier wird für jedes Objekt eine eigene Variable mit dem variabel gesetzten
     //Startwert gesetzt. Beachten: Zuweisung kann erst nach der Definition erfolgen!
     this["start"+i] = this._x; 
     this["test" + i]._y = random(120)+20;
     this["test"+i].onEnterFrame = function() 
     {
          //für die x Bewegung
          this._x += 2;
          xd = this._x - this._parent["start"+this._name.substr(4, 1)];
          if (xd >=200)
          {
               this._x = random(120)+20;
               this._width = random(30);
          }
     }
}
Ich würde dir generell davon abraten, mit _root zu arbeiten, da es Konflikte geben könnte, wenn du den gesamten Film mal irgendwo per loadMovie reinladen willst!
Und das ist der Code, wenn du es vom Rand der Bühne abhängig machen willst (ist ein bisschen weniger Code):
Code:
for (i=1; i<10; i++) {
	duplicateMovieClip("test", "test"+i, i);
	this["test"+i]._x = random(120)+20;
	this["test"+i]._y = random(120)+20;
	this["test"+i].onEnterFrame = function() {
		//für die x Bewegung
		this._x += 2;
		if (this._x>=Stage.width) {
			this._x = random(120)+20;
			this._width = random(30);
		}
	};
}
__________________
There is no way to happiness, happiness is the way! - Buddha
bamboocha ist offline   Mit Zitat antworten
Alt 25-11-2005, 11:02   #6 (permalink)
Neuer User
 
Benutzerbild von brandi
 
Registriert seit: Nov 2005
Ort: Aschersleben
Beiträge: 32
Hi Bamboocha,

ich bin noch der gleiche, aber mein Accout geht grad nicht. Ich hatte meine email Adresse geändert, dannach ging nichts mehr. Ich kann mich zwar noch anmelden, kann aber nicht antworten gar nichts.
Na jedefalls hab ich jetzt erstmal vorübergehend meiner Freundin nen Acount gemacht;-)

Ersmal vielen Dank für deine Tips.

1. Ich möchte den mc nur hinter einer kleinen Maske ablaufen lassen, also nicht über die ganze Bühne.
Trotzdem ist das mit dem "Stage" gut zu wissen.
2. Das ich den 2. onEnterframe weglassen kann hab ich dann auch gemerkt, ich muss ja einfach nur die neuen Eigenschaften hinschreiben.
3.Dein erster Ansatz sieht auch sehr spannend aus nur werd ich aus Deinen eingefügten Zeilen leider nicht ganz schlau.

Mit "this["start"+i] = this._x;" leißt Du die Startposition aus.
Aber aus der Distanzberechnug werd ich nich schlau.

xd = this._x - this.["start"+this._name.substr(4, 1)];

Danke, hier lern ich was
brandi ist offline   Mit Zitat antworten
Alt 28-11-2005, 07:59   #7 (permalink)
°.oO°O.o°.oO.o°O
 
Benutzerbild von bamboocha
 
Registriert seit: Jun 2005
Ort: CH
Beiträge: 1.490
Hi brandi (halt... ^^)

1. Ok... wollte dich nur darauf hinweisen, hab mir aber schon gedacht, dass du es entsprechend so gewollt hast.
2. ...
3. ACHTUNG! Bitte das ganze richtig lesen und übernehmen!

es sollte nicht so heissen:
Code:
xd = this._x - this.["start"+this._name.substr(4, 1)];
sondern so:
Code:
xd = this._x - this._parent["start"+this._name.substr(4, 1)];
Hier die Erklärung:

mit
Code:
this["start"+i] = this._x;
weist du ja am Anfang einer Reihe Variablen auf _root die Startpunkte des jeweiligen Elementes zu. Das heisst, per _root.start1 erhälst du die x-Startpunkte des 1. Elementes, mit _root.start2 die des 2., etc.
Um nun den Abstand zu berechnen, brauchst du die momentane Position des Elementes, sowie dessen Startposition.
Code:
this._parent["start"+this._name.substr(4, 1)];
mit diesem Teilstück greifst du eben auf die oben gennante entsprechende Variable zu.
Genauer:
Code:
this._parent
wählst du aus folgenden Gründen. Da das "this" in einer onEnterFrame-Funktion eines Elementes steht, bezieht sich das "this" auf das Element. Mit "this._parent" spreche ich das übergeordnete Element von "this" an, also in unserem Falle "_root", da das Element ja auf _root liegt.
Wenn du auf eine Variable, bzw. deren Name dynamisch zugreifen möchtest (also den Variablenname sozusagen dynamisch erstellen willst), musst du das mit geschweiften Klammern tun. Dazu zu wissen gibt es, dass alle Elemente auf einer Ebene wie ein Array ansprechbar sind. Bsp: Hast du einen MovieClip (MCmain) mit drei weiteren MC's (MCbsp1, MCbsp2 und MCbsp3) darin. Alle drei MovieClips sind nun über ein Array ansprechbar. Das heisst, alternativ zu
Code:
MCmain.MCbsp1.irgendNeFunktion()
kannst du auch so schreiben:
Code:
MCmain["MCbsp1"].irgendNeFunktion()
. Selbsteverständlich kannst du anstatt eines ganze Strings auch Variablen verwenden (wie in unserem Beispiel) oder aber nur Variablen setzen. So gienge auch folgendes Beispiel:
Code:
var bspclip = "MCbsp1";
MCmain[bspclip].irgendNeFunktion()
beachten musst du dabei nur, dass Variablen ohne Anführungszeichen geschrieben werden, da du ja ihren Wert haben willst und nicht den Namen als String!
Also, mit diesem Wissen gehen wir jetzt weiter. Wir wissen, dass es auf "_root" die Variable hat, welche den Startwert gespeichert hat ("Start1", "Start2", ... "Start9"). Um nun auf diese zugreifen zu können, wenden wir das dynamische zugreifen über die Array-Funktion der Eben zu. Da das Start eh immer gleich bleibt, brauchen wir nur noch die dazugehörende Zahl. Da Element 1 seine Startkoordinaten in "Start1" hat (etc.), können wir hier mit dem Namen des Elementes arbeiten, da ja die entsprechende Zahl im Namen enthalten ist. Am Anfang erstellen wir ja die 9 Elemente mit folgendem Code:
Code:
duplicateMovieClip("test", "test" + i, i);
, das heisst, unsere Elemente heissen dann "test1" bis "test9". Und das machen wir uns nun zu Nutze. Mit
Code:
this._name.substr(4, 1)
greife ich auf den Instanzenname des gerade aktuellen Elementes zu (this._name) und entnehme daraus einen Teilstring (für genauere Infos zur Funktion "substr()" F1 drücken und Hilfe fragen), beginnend ab Stringposition 4, mit einer Stringlänge von 1. Die Rückgabe dieser Zeile ist bei uns also die Nummer des Instanzenname. Im ganzen gesehen machen wir nun folgendes:
Code:
this._parent["start"+this._name.substr(4, 1)];
Wir greifen auf die, dem Element übergeordneten, Ebene zu (this._parent) und lesen dort die Variable aus, welche die Startposition des ausführenden Elementes enthält ("start"+Nummer im Instanzenname).
So, das war die ganze Hexerei. Ich hoffe, du konntest was lernen und deinen Wissensdurst ein bisschen stillen. Einfach weiter fragen bei Unklarheiten.

mfg Griz
__________________
There is no way to happiness, happiness is the way! - Buddha
bamboocha 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



Alle Zeitangaben in WEZ +1. Es ist jetzt 01:14 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele