2Punkte 1Linie = lag

Coldfist

Mitglied
Hallo!
Ich hab schon einiges zu diesem Thema durchgelesen, aber die Lösungen funktionieren alle nicht.
Ich habe 2 Bälle die sich per rudimentärer as Funktion bewegen:
PHP:
MovieClip.prototype.bounce = function(xspeed, yspeed) {
	this.onEnterFrame = function() {
		this._x += xspeed;
		this._y += yspeed;
		if (this._x<=0+this._width/2 || this._x>=Stage.width-this._width/2) {
			xspeed *= -1;
		}
		if (this._y<=0+this._height/2 || this._y>=Stage.height-this._height/2) {
			yspeed *= -1;
		}
	};
};
_root.ball1.bounce(5, 3);
_root.ball2.bounce(4, 5);
Dann habe ich noch die 45° Linie, die sich mit den Punkten verbinden soll...
Das Skript liegt im mc 'line1'
PHP:
onClipEvent (enterFrame) {
	_x = _root.ball1._x;
	_y = _root.ball1._y;
	_xscale = (_root.ball2._x-_root.ball1._x);
	_yscale = (_root.ball2._y-_root.ball1._y);
	updateAfterEvent();
}

Doch trotz des updateAfterEvent(); gibt es eine Verzögerung. Die Linie hängt immer hinterher.
Ich hab mal in beide Funktionen einen Begriff tracen lassen. Die untere Funktion traced erst alle 3mal, d.h. die obere Funktion ist drei mal schneller (?)

Ich würd nur gerne die Verzögerung weg bekommen.

mfg
Cold
 
Hi,

sie werden im gleich Ryhthmus aufgerufen, aber die onClipEvent-Funktion erst nach dem Bewegen der Bälle.

Schnelllösung: Packe die Methoden zum Bewegen der Linie in eine Memberfunktion des MovieClips "line" und rufe diese Funktion aus der Prototype-Funktion der Bälle auf (siehe Anhang).

Gruß

P.S.: Die Skalierung der Linie über _xscale und _yscale funktioniert nur, wenn der MC eine Grundgröße von 100x100 Pixeln hat. Ich habe eine kleine Änderung eingefügt, mit der die Größe egal ist (mehr, weil ich mich zunächst gewundert habe, warum die Linie zu lang ist, und ich nicht nachgedacht habe ^^).
.
 

Anhänge

  • ballbounce.zip
    6,5 KB · Aufrufe: 12
Danke!
Die Linienlänge hat ich am Anfang auch etwas durcheinander gebracht.

Aber auf die Lösung hätte ich eigentlich auch selber kommen müssen.
Und ich dachte man wird mit der Zeit schlauer...^^

Danke nochmal

mfg
Cold
 
Hi nochmal.
Ich baue grad ne erweiterte Version des ganzen.
Im ersten Schlüsselbild kann man die Anzahl der Bälle angeben, die man haben will.
Das ist dann die Variable numballz.
Im zweiten Schlüsselbild werden die Bälle dupliziert und auch eine Linie dupliziert. Jeder Ball soll hinterher mit jedem verbunden sein. Leider bewegen sich die Linien nicht so wie ich das gerne hätte:

PHP:
function linescale(b1, b2) {
	this._x = _root["ball"+b1]._x;
	this._y = _root["ball"+b1]._y;
	this._width = (_root["ball"+b2]._x-_root["ball"+b1]._x);
	this._height = (_root["ball"+b2]._y-_root["ball"+b1]._y);
}
function dupeballz() {
	//bälle
	ball1.yspeed = 5;
	ball1.xspeed = 4;
	for (i=2; i<=numballz; i++) {
		newball = ball1.duplicateMovieClip(["ball"+i], i);
		newball._x = 25;
		newball._y = 100;
		newball.xspeed = Math.random()*5+2;
		newball.yspeed = Math.random()*4+3;
	}
	//Linien
	f = 1000;
	for (k=1; k<numballz; k++) {
		for (y=k+1; y<=numballz; y++) {
			f++;
			newli = line1.duplicateMovieClip(["line"+f], f);
			newli._x = 100;
			newli.onEnterFrame = function() {
				this.linescale(k, y);
			};
		}
	}
}
_root.dupeballz();
Im Ball1 steckt noch:
PHP:
onClipEvent (enterFrame) {
	this._x += this.xspeed;
	this._y += this.yspeed;
	if (this._x<=0+this._width/2 || this._x>=Stage.width-this._width/2) {
		xspeed *= -1;
	}
	if (this._y<=0+this._height/2 || this._y>=Stage.height-this._height/2) {
		yspeed *= -1;
	}
}

Ich meine das hat mit der Zuweisung der Funktion linescale zu tun... Ich kanns nur nicht beheben.

mfg
Cold
 
Hi,

nun, woher sollen die Linien denn wissen, welche Bälle sie verbinden sollen?

Ich würde das zentral mit einer Funktion auf der Hauptzeitleiste lösen. Wenns nicht unbedingt nötig ist, würde ich auch statt duplicateMovieClip attachMovie verwenden.

Wenn Deine Linien wirklich nur Linien sind, bieten sich übrigens Zeichnungsmethoden statt MovieClips mit Linien an (flexibler).

Im Anhang findest Du ein Beispiel mit frei einstellbarer Anzahl Bälle. Jeder Ball bekommt eine zufällige Position und Geschwindigkeit. Ich habe sowohl die Bälle als auch die Linien in Container (leere MovieClips) gesetzt, damit Du entscheiden kannst, ob die Linie über oder unter den Bällen gezeichnet wird (ausserdem kannst Du so noch andere Objekte auf der Bühne instanzieren ohne Tiefenkonflikte zu riskieren).

Gruß
.
 

Anhänge

  • ballbounce2.zip
    6,8 KB · Aufrufe: 11
Mensch, ich kann dir ja bald Lohn für deine Arbeit zahlen :) .
Also die Linien sollten durch die b1 und b2 Variablen wissen, welche Bälle sie verbinden sollten.
PHP:
this.linescale(k, y);
//-------------------------------------------
function linescale(b1, b2) {
    this._x = _root["ball"+b1]._x;
    this._y = _root["ball"+b1]._y;
    this._width = (_root["ball"+b2]._x-_root["ball"+b1]._x);
    this._height = (_root["ball"+b2]._y-_root["ball"+b1]._y);
}

Bei deiner Lösung wird jetzt jeder Ball mit dem Nächsthöherem verbunden, wenn ich das richtig sehe. Deswegen hatte ich ja diese Doppelschleife drin. Jeder Ball sollte mit jedem Ball verbunden sein.
Ich schau mir das Jetzt nochmal genau an und versuch das dann mal reinzubauen.

Danke nochmal

mfg
Cold
 
Jaaa.... aber:
for (y=k+1; y<=numballz; y++) {
f++;
newli = line1.duplicateMovieClip(["line"+f], f);
newli._x = 100;
newli.onEnterFrame = function() {
this.linescale(k, y);
}
}
Die Variablen k und y haben ja nach dem Durchlaufen der for-Schleife einen festen Wert (y wird den Wert von numballz haben, und k eins weniger). Sprich: Jeder neue Linien-MC bekommt in seiner onEnterFrame-Methode exakt die selben Werte von k und y zum Arbeiten. Du müsstest wenn Dann jeder Linie feste Member geben:
PHP:
for (y=k+1; y<=numballz; y++) {
    f++;
    newli = line1.duplicateMovieClip(["line"+f], f);
    newli._x = 100;
    newli.k = k; // Hier fest speichern, dann ändert sich auch nix mehr! ;)
    newli.y = y;
    newli.onEnterFrame = function() {
        this.linescale(this.k, this.y);
    }
}
Ich habe den Gesamtaurbau in meinem Beispiel mal geändert, weil ich die Struktur ein wenig unübersichtlich fand (Bälle werden vom Linien-MC dupliziert usw.) - aber Du kannst es natürlich auch so machen.

EDIT: Jetzt habe ich auch verstanden was Du willst: Jeder Ball soll wirklich mit jedem verbunden sein, und nicht nur mit dem nächsten? Sollte auch kein Problem sein (ich schick gleich nochmal ein Update). ;)

Gruß

EDIT II: voilá! ;) Ich habe auch noch eine kleine Änderung an der Ballbewegung vorgenommen, damit die Dinger nicht an den Rändern hängenbleiben (kann sonst bei hohen Geschwindigkeiten passieren).
.
 

Anhänge

  • ballbounce3.zip
    8,1 KB · Aufrufe: 11
Zuletzt bearbeitet:
Nee, deine Lösung ist von der Struktur schon sehr gut.
Ich komm nur nie auf solche Lösungswege, ich weiß auch nicht warum.

Aber niemand hat gesagt, dass Flash(AS) einfach zu lernen ist.
Also dann.

thx

edit:mkay, aber lass dir Zeit, ich denke du hast wichtigeres zu tun...

mfg
Cold
 
Datic hat gesagt.:
... nicht am Sonntag! ;-)
Gerade an diesem Sonntag! Ich weiß ja nicht wie es bei dir ist, aber hier ballert die Sonne mit allem was sie hat. Herrlich um zu sporten oder zu chillen ;-)

add-it: Danke für die 2. Lösung. Echt Spitze!
 
Zuletzt bearbeitet:
Zurück