Distanz zwischen Objekten per Vorschleife kontrollieren (PV3D) funktioniert nicht

mosha

Mitglied
Hallo Community,

ich möchte in einer Funktion die Distanz von neu geladenen DAE Files checken.
Dafür lasse ich einen for loop laufen. Wenn das Objekt irgendeinem anderen Objekt in der Szene 'zu nahe" ist, soll der Loop nocheinmal ausgeführt werden.
Nun, ja, dabei gibt es dann ein Stapelüberlauf Problem, bzw. Flashplayer hängt sich auf. Aber es sind bis jetzt nich mehr als 4 Objekte, da müsste er doch bald alle 'platziert' haben?
Mhm, irgendwo habe ich wohl einen Gedankenfehler. Vielleicht, kann mir ja jemand von euch helfen.

Ich habe hier die Funtkion mal eingefügt:

Code:
private function _checkDistance(asset3D:DisplayObject3D):void
{
	// setting up the start positions for the letters
	asset3D.x = Rnd.integer(-W_AREA/2, W_AREA/2);
	asset3D.z = Rnd.integer( -D_AREA/2, D_AREA/2);
	asset3D.y = -1000;				
			
	for each (var item:DisplayObject3D in scene.objects)
	{
		trace("\ndistance: " +  item.distanceTo(asset3D));
					
		if (item.distanceTo(asset3D) <= DIST)
		{
			trace("\t\titem is in distance: " + item);				
			_checkDistance(asset3D);
		}
		else
		{
			// applying the letter to our letter class
			_letter.do3d = asset3D;
			// adding the letter to the stage
			scene.addChild(_letter.do3d);
			//start the letters drop
			_letter.init();
			trace("\t\titem is out of distance: " + item);
		}
	}
}
 
Hallo,

du musst sicherstellen, dass das zu überprüfende Objekt nicht mit sich selbst verglichen wird, weil da die Distanz immer zu klein sein wird.

Gruss
 
Hab dank Luke,

das war der richtige Anstoß. Ich bin noch auf ein andere Sache gestoßen. Es wurden nämlich für jedes Element, im scene.objects Array, neue Objekte in der Szene platziert, also mit jedem Loop hat es sich verdoppelt. bzw. expotenziert.
Ich musste das platzieren der neuen Objekte, komplett aus der _checkDistance() Funtion rausnehmen, weil dadurch immer wieder das letzte, also, neue Objekt zu den scene.objects gehörte, was den Loop nochmal durchführte. Was letztendlich zu einem von dir vermuteten Selbstvergleich führte.

Langer Text neues Script:
Code:
private function _checkDistance(asset3D:DisplayObject3D):void
{
	// setting up the start positions for the letters
	asset3D.x = Rnd.integer(-W_AREA/2, W_AREA/2);
	asset3D.z = Rnd.integer( -D_AREA/2, D_AREA/2);
	asset3D.y = -1000;

	for each (var item:DisplayObject3D in scene.objects)
	{
		if (item.distanceTo(asset3D) <= DIST)
		{
			trace("\t\t" + asset3D.name + "  to close to " + item.name + "\n");				
			_checkDistance(asset3D);
		}
		else
		{	
			if (item == scene.objects[scene.objects.length - 1] )
			{
				trace("\t\tlänge erreciht");
			}
		}
	}
}	
/*
// der folgende Teil musste komplett außerhalb der Funktion

			// applying the letter to our letter class
			_letter.do3d = asset3D;
			// adding the letter to the stage
			scene.addChild(_letter.do3d);
			//start the letters drop
			_letter.init();
			trace("\t\tnow added:\t" + _letter.do3d);	
*/

gruß
 
Hallo,

ja das macht Sinn. Wenns für dich so funktioniert, ist das ja eigentlich ok, trotzdem noch ein Gratistip ;):
Deine _checkDistance-Funktion ist ja rekursiv, was nicht zwingend nötig ist. An deiner Stelle würd ich zwei Funktionen schreiben, eine die nur die Distanzkontrolle übernimmt und die andere macht den Rest:
Code:
private function setPosition (asset3D:DisplayObject3D) {
	while (!_checkDistance(asset3D) {
		asset3D.x = Rnd.integer(-W_AREA/2, W_AREA/2);
		asset3D.z = Rnd.integer( -D_AREA/2, D_AREA/2);
		asset3D.y = -1000;
	}
	
	// applying the letter to our letter class
	_letter.do3d = asset3D;
	// adding the letter to the stage
	scene.addChild(_letter.do3d);
	//start the letters drop
	_letter.init();
	trace("\t\tnow added:\t" + _letter.do3d);
}

private function _checkDistance(asset3D:DisplayObject3D):void
{
	// setting up the start positions for the letters
	for each (var item:DisplayObject3D in scene.objects)
	{
		if (item == asset3D) continue;
		else if (item.distanceTo(asset3D) > DIST) return true;
	}
	return false;
}

Gruss
 
Deine Gratistips, sind Gold wert.
Auf jeden Fall, viel sauberer Code und noch was dazu gelernt.
"While" Loops habe ich irgendwie noch nie benutzt. Bisher wohl immer unterschätzt, bzw. falsch eingschätzt. und "continue" kanne ich auch noch nicht.

Na, ich probiere es gleich mal aus.

cheers!
 

Neue Beiträge

Zurück