zwei Probleme mit Zufallsgenerator

Jan-Frederik Stieler

Monsterator
Moderator
Hallo,
also ich habe dieses AS für die Zufallsgeneratoration von Punkten verwendet.
Code:
var maxpunkte:Number = 100;
var speed:Number = 80;
var count:Number = 0;
function fuzzy_punkte () {
    var mc:MovieClip = this.attachMovie ("fuzzy_punkte", "fuzzy_punkte" + count, count);
    mc._x = Math.random () * 300;
    mc._y = Math.random () * 300;
    mc._alpha = 100;
    if (count >= maxpunkte) {
        clearInterval (fuzzy_punkteInt);
        count = 0;
    }
    count++;
}
// fuzzy
fuzzy_punkteInt = setInterval (this, "fuzzy_punkte", speed);

Wie bekomme ich es nun hin das sich der Nullpunkt an dem sich das AS orientiert nicht oben-links ist sondern in der Mitte ist?
Wenn ich das nun richtig verstanden habe kann man den Nullpunkt ja nicht mittels AS ansprechen.
Das zweite Problem was ich habe ist das sich die generierten Punkte nicht berrühren dürfen. Wie kann man den das realisieren?

Viele Grüße
 
Zuletzt bearbeitet:
Hi,

entweder, Du öffnest den MC "fuzzy_punkte" zum Bearbeiten und zentrierst den Inhalt um den Nullpunkt, oder Du subtrahierst die halbe Breite/Höhe des Clips beim Positioniern:
Code:
mc._x = Math.random () * 300 - mc._width / 2;

Zu Deinem zweiten Problem (Überlappung): Speichere alle neuen Clips in einem Array und überprüfe jede neu berechnete Position auf Überlappung mit allen Clips im Array:
Code:
var maxpunkte:Number = 100;
var speed:Number = 80;
var count:Number = 0;
var points:Array = new Array();

function fuzzy_punkte () {
    var mc:MovieClip = this.attachMovie ("fuzzy_punkte", "fuzzy_punkte" + count, count);
	do {
		mc._x = Math.random () * 300;
   		mc._y = Math.random () * 300;
	} while (touchOne(mc));
    mc._alpha = 100;
	points.push(mc);
    if (count >= maxpunkte) {
        clearInterval (fuzzy_punkteInt);
        count = 0;
    }
    count++;
}

function touchOne(obj) {
	var touched = false;
	for (var i in points) {
		if (Math.abs(obj._x - points[i]._x) < obj._width && Math.abs(obj._y - points[i]._y) < obj._height) {
			touched = true;
			break;
		}
	}
	return touched;
}

// fuzzy
fuzzy_punkteInt = setInterval (this, "fuzzy_punkte", speed);

Gruß
.
 
Hi,
also der Punkt welcher sich im MC fuzzy_punkte befindet ist zentriert. Aber die Mitte über den MC zu berechnen funktioniert ja nicht weil das MC ja nur so groß ist wie der Punkt.
Oder verstehe ich da etwas falsch. Auf jedenfall habe ich das jetzt grad dann über die Bühnengröße gelöst:
Code:
mc._x = Math.random () * 100 + Stage.width / 2 - 50;
mc._y = Math.random () * 100 + Stage.height / 2 - 50;
Wie kann ich den das schreiben wenn sich die 50 als Hälfte immer von den 100 ableiten sollen.

Und vielen Dank für den Code für die Überlappung. Das hätte ich nicht hinbekommen.

Viele Grüße
 
Hi,

achso - ich hatte angenommen, es ginge um den Registrierungspunkt der MCs, und nicht um die Bühnenmitte. Probiers so:
Code:
mc._x = Stage.width / 2 + Math.random () * 100 - 50;

Nachtrag zur Überlappung: Bei vielen (oder großen) MCs kann es sein, dass der Zufallsgenerator irgendwann keinen (oder nur schwerlich) einen Punkt findet, der noch frei ist. Du solltest die while-Schleife deshalb limitieren, damit sich das Script nicht aufhängt:
Code:
function fuzzy_punkte () {
    var mc:MovieClip = this.attachMovie ("fuzzy_punkte", "fuzzy_punkte" + count, count);
    var c = 0;
    do {
        mc._x = Stage.width / 2 + Math.random () * 100 - 50;
        mc._y = Stage.height / 2 + Math.random () * 100 - 50;
        c ++;
    } while (touchOne(mc) && c < 20); // Maximale Anzahl Versuche: 20
    mc._alpha = 100;
    if (c < 20) {
        points.push(mc);
    } else {
        mc.removeMovieClip();
    }
    if (count >= maxpunkte) {
        clearInterval (fuzzy_punkteInt);
        count = 0;
    }
    if (c < 20) count++;
}

Gruß
.
 
Hi,
wenn ich nun das MC in der Bibliothek mit einem Tween versehe. Greift das Script für den Abstand nun noch teilweise. Weil sich ja auch die Punkte im MC verändern.
Desweiteren wäre es nicht schlecht wenn ich mehrere MC s verwenden könnte um die Regelmäßigkeit welche durch das MC entsteht zu brechen.
Ich hab dir mal ein Storyborad angehängt wo ersichtlich ist was ich eigentlich machen möchte.
Den Übergang ab Bild 3 habe ich per Formtween realisiert.
Ich würde ja den Anfang auch von Hand machen nur benötige ich hier 700 Punkte. 7 davon werden dann wieder zu einem größeren Punkt so dass 100 entstehen.

Gruß
Jan
 

Anhänge

  • 27816attachment.pdf
    58,3 KB · Aufrufe: 41
  • 27817attachment.zip
    7,9 KB · Aufrufe: 14
Hi,

das Script für die Kollision greift nicht mehr, weil Du die Funktion "touchOne" aus dem Code entfernt hast. ;) Da die Größe der Clips sich veringert, solltest Du bisher auch kein Problem mit der Kollision bekommen.

Mehrere Clips kannst Du verwenden, indem Du mehrere erstellst (z.B. "fuzzy_punkte1", "fuzzy_punkte2" und "fuzzy_punkte3") und per Zufallsgenerator beim Instanzieren verwendest:
Code:
var b = int(Math.random() * 3) + 1;
var mc:MovieClip = this.attachMovie ("fuzzy_punkte" + n, "fuzzy_punkte" + count, count);

Wenn ich Dich recht verstanden habe, sollen sich die Punkte nach dem Instanzieren frei im Raum bewegen, ohne sich zu berühren. Das erfordert eine etwas andere Herangehensweise und ein ggf. recht komplexes Script, da jeder Punkt zu jeder Zeit die Kollision mit allen anderen überprüfen muss.

Im Anhang findest Du ein kleines Beispiel mit 60 Punkten, die sich gegenseitig abstoßen - Du siehst, wie die Performance leidet, weil jeder Punkt sich mit allen anderen vergleichen muss ...

Gruß
.
 
Hi,
kannst du vielleicht das beispiel mit den 60 Punkten nochmal anhängen. Es war ganz gut als Beispiel zu verwenden um zu zeigen das bei der Anzahl eigentlich schon das Maximum erreicht ist was von einem normalen Computer leist bar ist.
Also ich möchte damit jemanden überzeigen das ein bestimmtes Konzept so wie es jetzt angelegt ist nicht richtig realisierbar ist.

Gruß
 
Hi,

ich nehme an, es war diese Datei (Anhang)?

Derartige Animationen würde auch ich (grade, wenn sich die Punkte später an vordefinierte Positionen bewegen und mit einander/anderen Objekten verschmelzen sollen) eher als Einzelbildanimation oder Videosequenz importieren. Erst recht, wenn es um möglichst genaue Physik (z.B. Abstoßung) geht.

Gruß
.
 

Anhänge

  • fuzzy3.zip
    7,4 KB · Aufrufe: 15

Neue Beiträge

Zurück