Antworten auf deine Fragen:
Neues Thema erstellen

Wer kennt diesen effekt??

h_seldon

Aktives Mitglied

AW: Wer kennt diesen effekt??

Hallo sokie,

sorry, war da wohl nicht eindeutig genug. Laut Flash kann man mit mc.removeMovieClip() alle per mc.attachMovie() oder mc.duplicateMovieClip() erzeugten Objekte löschen. Tatsächlich kann man damit jedoch jeden mc löschen, vorausgesetzt, seine Tiefe ist größer/gleich 0 (eben diejenigen Werte, die für attach und duplicate zulässig sind). Will heißen: nach swapDepths() einfach mc.removeMovieClip() aufrufen und die Dinger verschwinden.

Viel Spass
 

h_seldon

Aktives Mitglied

AW: Wer kennt diesen effekt??

Nun zur Bewegung: erstelle eine Funktion, die per enterFrame pro Objekt ausgeführt wird (wer optimieren möchte: ein einziges enterFrame, alle Objekte befinden sich in einem Array, durchs Array loopen und bewegen). Die Bewegungsfunktion errechnet den Abstand zum Zielpunkt (horiz und vert) und addiert zur aktuellen Pos jeweils einen Bruchteil des zuvor errechneten Abstandes hinzu. Fällt der Abstand unter einen Grenzwert, wird das Objekt auf die Zielpos gesetzt und aus dem Array gelöscht (oder es wird das enterFrame gelöscht, je nach zuvor gewählter Methode).

ah, habe gerade mal mit der Maus herumgespielt, das ist wirklich schön. Die Position der Partikel wird über Trig jeweils neu berechnet, so als ob eine Kraft, ausgehend von der Maus, und zusätzlich eine Kraft, ausgehend von der ursprünglichen Zielpos, auf alle einwirkt. Das sieht wirklich gut aus. Vorher habe ich das nur für einen "billigen" Positionseffekt gehalten, aber mit dieser Interaktion ist es wirklich Klasse!
 

sokie

Mod | Web

AW: Wer kennt diesen effekt??

Hallo sokie,

sorry, war da wohl nicht eindeutig genug. Laut Flash kann man mit mc.removeMovieClip() alle per mc.attachMovie() oder mc.duplicateMovieClip() erzeugten Objekte löschen. Tatsächlich kann man damit jedoch jeden mc löschen, vorausgesetzt, seine Tiefe ist größer/gleich 0 (eben diejenigen Werte, die für attach und duplicate zulässig sind). Will heißen: nach swapDepths() einfach mc.removeMovieClip() aufrufen und die Dinger verschwinden.

Viel Spass
Danke, das ist eine gute Sache. Da hat mich die Dokumentation doch ein wenig im Stich gelassen, in der es lapidar heisst, dass man nur movieclips löschen kann, die per actionscript instanziiert wurden. Nun wird mir auch klar warum die "von hand" angelegten eine negative tiefe haben (zum schutz, vermutlich) jedenfalls ergeben sich daraus interessante Möglichkeiten.
 

h_seldon

Aktives Mitglied

AW: Wer kennt diesen effekt??

Hallo,

das momentane Ergebnis könnte zum Beispiel so aussehen:

PHP:
//--------------------- vars -----------------------
var mRecht:MovieClip;
var aPos:Array = [];
var nHoehe:Number = 600;
var nBreite:Number = 800;
var nTempo:Number = 0.1;
//--------------------- functions -----------------------
function initAnim() {
	for(var a:String in this){
		if(typeof(this[a])=="movieclip"){
			aPos.push([this[a]._x,this[a]._y]);
			this[a].swapDepths(0);
			this[a].removeMovieClip();
		}
	}
	var nAnzahl:Number = aPos.length;
	for (var i:Number = 0; i<nAnzahl; i++) {
		mRecht = this.attachMovie("mcRecht", "mRecht", i);
		if (i<Math.round(aPos.length/2)) {
			mRecht._x = Math.floor(Math.random()*nBreite);
			mRecht._y = (i%2)*nHoehe;
		} else {
			mRecht._x = (i%2)*nBreite;
			mRecht._y = Math.floor(Math.random()*nHoehe);
		}
		var nZufall:Number = Math.floor(Math.random()*aPos.length);
		mRecht.aZiel = aPos[nZufall];
		aPos.splice(nZufall,1);
		mRecht.onEnterFrame = animieren;
	}
}
function animieren() {
	var nDifX:Number = this.aZiel[0]-this._x;
	var nDifY:Number = this.aZiel[1]-this._y;
	this._x += nDifX*nTempo;
	this._y += nDifY*nTempo;
	if(Math.round(nDifX) == 0 && Math.round(nDifY) == 0){
		this._x = this.aZiel[0];
		this._y = this.aZiel[1];
	}
}
//--------------------- start -----------------------
initAnim();

Die Objekte müssen natürlich händisch auf der Bühne eingefügt werden, so das ihre Pos ausgelesen werden kann.

Viel Spass
 

C4PaInKiLLeR

Nicht mehr ganz neu hier

AW: Wer kennt diesen effekt??

Nice und das funzt ja ? :)

Lads doch als tutorial hier hoch inkl. der fla dann haste auch was davon :)

mfg
 

h_seldon

Aktives Mitglied

AW: Wer kennt diesen effekt??

Zugegebenermaßen: das hat mir doch keine Ruhe gelassen. Habe mich eben mal hingesetzt und mühsam eine Formel aus dem Gedächtnis abgerufen, die da ungefähr lautet: kraft = Erdanziehung * MasseObjekt1 * MasseObjekt2/Distanz * Distanz. Damit lässt sich formal die Anziehung zwischen zwei Objekten auf der Erde berechnen. Da wir hier keine physikalisch korrekte Simulation, sondern lediglich eine visuell (hoffentlich) überzeugende Animation benötigen, dürfen wir vereinfachen: u.a. entfällt die Erdanziehung (sorry Gaia), die animierten Objekte üben selbst keine Kraft aus, statt des Quadrats der Distanz nehmen wir nur die Distanz, an späterer Stelle verzichten wir auf eine Division durch die Masse des kraftausübenden Objekts. Den Mäusen, Slartibartfass und Newton werden nun die Haare zu Berge stehen, aber das ignorieren wir geflissentlich.

Änderungen gegenüber dem bisherigen Code:

PHP:
var nTempo:Number = 0.2;//statt: 0.1

Die Funktion animieren muss innerhalb der if-Bedingung unmittelbar vor deren schließender Klammer ergänzt werden:

PHP:
//zuweisen der Funktion, um auf die Mausbewegung zu reagieren
this.onEnterFrame = function(){
	anziehung(this,[_xmouse, _ymouse],1000,-1);
}

In den Funktionsblock gehört zusätzlich folgende Deklaration:

die Funktion benötigt 4 Argumente:
1. das Objekt, das sich bewegen soll
2. Die Position, von der aus die Kraft wirkt
3. Die Größe der Kraft unabhängig von der Entfernung, wäre bei korrekter Berechnung die Masse
4. Die Richtung der Kraft: 1 bedeutet Anziehung, -1 Abstoßung

PHP:
function anziehung(pObjekt:MovieClip, pKraftUrsprung:Array, pKraftGroesse:Number, pRichtung:Number):Void {
//ermittelt Entfernung
	var nDistX:Number = pKraftUrsprung[0]-pObjekt._x;
	var nDistY:Number = pKraftUrsprung[1]-pObjekt._y;
	var nDist:Number = Math.sqrt((nDistX*nDistX)+(nDistY*nDistY));
//berechnet die Kraft wie ein Buchhalter die Bilanz, d.h. schummelt
	var nKraft:Number = pKraftGroesse/nDist;
//kraft besteht aus zwei gerichteten Vektoren, nämlich x und y
	var nKraftX:Number = nKraft*(nDistX/nDist);
	var nKraftY:Number = nKraft*(nDistY/nDist);
	/*if (Math.abs(nKraftX)>Math.abs(nDistX)) {
		nKraftX = nDistX;
	}
	if (Math.abs(nKraftY)>Math.abs(nDistY)) {
		nKraftY = nDistY;
	}*/
//hier legen wir fest, ob abstoßen oder anziehen
	pObjekt._x += nKraftX*pRichtung;
	pObjekt._y += nKraftY*pRichtung;
//noch ein Buchhaltertrick: sorgt für das Zurückschwenken Richtung
//ursprünglicher Position
//ist insofern geschummelt, als hier eigentlich eine Anziehung berechnet
//werden müsste, deren Kraft aber mit der Entfernung zunimmt,
//während das Wegschieben mit der Maus mit der Entfernung abnimmt
	var nDistX:Number = pObjekt.aZiel[0]-pObjekt._x;
	var nDistY:Number = pObjekt.aZiel[1]-pObjekt._y;
	pObjekt._x += nDistX*nTempo;
	pObjekt._y += nDistY*nTempo;
}

Das eher zähflüssige Verhalten kommt durch die letzten vier Schummelzeilen zustande. Das extreme Ausschwenken einzelner Objekte ist der Tatsache geschuldet, dass die Kraft natürlich bei geringer Distanz sehr groß wird, so dass ein Objekt schon mal einen großen Satz zur Seite macht. Wer das nicht will, hebe den mehrzeiligen Kommentar um die beiden if-Bedingungen re Math.abs auf.

Da läst sich natürlich noch einiges optimieren, z.B.: statt vieler enterframes nur eines, alle Elemente werden dann bewegt mit Hilfe eines Arrays, in dem sie erfasst werden. Böse, böse, aber das merkt keiner: hier kann es zu einer Division durch 0 kommen. Das kann man durch eine if-Bedingung oder einfacher durch eine Erhöhung des Divisors bei nKraft um einen sehr kleinen Betrag (z.B. 0.0001) umgehen.

Spaßeshalber lässt sich daraus ein Staubsauger basteln: pRichtung 1, in anziehung letzte 4 Zeilen in eigene Funktion auslagern (zurueck()), onPress solange gedrückt anziehung, onRelease zurueck(). Alternativ: einfach nur pRichtung 1 und testen (if(Math.abs) etc. darf nicht auskommentiert sein).

Ein netter Effekt mag auch entstehen, wenn man mit den Zeichnungsfunktionen der mc-Klasse eine Form erstellt, deren Eckpunkte durch eine Funktion wie anziehung definiert werden. Über ein curveTo liesse sich sogar eine Art Wasseroberfläche, angezogen oder abgestoßen durch den Cursor, beschreiben. Dann müsste man jeweils zwischen zwei benachbarten Punkten einen Ankerpunkt berechnen, so dass der Übergang jeweils weich aussieht.

Viel Spass
 

turbographics

Noch nicht viel geschrieben

AW: Wer kennt diesen effekt??

hallo
könntest du vielleicht deinb ergebebnis hochladen den nicht alle sind so gegebenermaßen
so sehr gut im AS wie du einer bist ( auf dem Newton Nivaeu..=)
denn leider weiss ich das ich bspielsweise dies allein garnicht so hinbekomme..
danke noch einmal für die große mühe und arbeit..
würde mich echt freuen wenn de was posten würdest.

Mit Kreativen grüssen
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.065
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben