• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21-07-2010, 14:42   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 12
Unhappy Random-Positionierung mit Kollisionsabfrage will einfach nicht

Hallo allerseids:

Ich schlage mich gerade mit dem leidlichen Thema Kollisionsabfrage herum. Die MCs werden per Random positioniert. Ich hab das ganze Sicherheitshalber mal nur auf die X-Achse beschränkt, Y bleibt immer gleich.

Mein Problem ist, dass die hitTest-Funktion nicht immer greift - obwohl manche MCs noch überlappen, gibt sie "false" aus. Ich hab das ganze auch schon per hitTestObject versucht, mit demselben Ergebnis. Möchte das ganze allerdings lieber ohne hitTestObject lösen, da in einer späteren Fassung eine Teilüberlappung möglich sein soll.

Ich würde mich sehr über den ein oder anderen Denkanstoß freuen - danke vorweg!

Code:
var totalShapes:int 		= 10;  // Total number of shapes
var writtenShapes:Array		= new Array(); // Array that holds all the shapes

for(var i:uint = 0; i < totalShapes; i++){
	var theshape		= new shape_01;
	var theshape_coordinates= getCoordinates();
	
	theshape.name = i;
	theshape.alpha = 0.6;
	theshape.x = theshape_coordinates[0];
	theshape.y = 200;
	writtenShapes[i] = [theshape];
	
	stage.addChild(theshape);
}

function getCoordinates(){
	var coordinateX:int	= Math.ceil(Math.random()*stage.stageWidth);
	var coordinateY:int	= Math.ceil(Math.random()*stage.stageHeight);
	var coordinates:Array	= new Array(); // holds the two coordinates
	
	while(hitTest(coordinateX)){
		coordinateX = Math.ceil(Math.random()*stage.stageWidth);
	}
	
	coordinates = [coordinateX, coordinateY];
	return coordinates;
}

function hitTest(coordinateX){
	var output:Boolean = false;
	
	for(var i:uint = 0; i < writtenShapes.length; i++){
		if(coordinateX > writtenShapes[i][0].x && coordinateX < writtenShapes[i][0].x + writtenShapes[i][0].width){
			output = true;
		}
	}
	
	return output;
}
Zenthara ist offline   Mit Zitat antworten
Alt 21-07-2010, 14:53   #2 (permalink)
Neuer User
 
Benutzerbild von Simse179
 
Registriert seit: Feb 2005
Beiträge: 457
Die Zeile kommt mir komisch vor:
ActionScript:
  1. var theshape        = new shape_01;
Muss das nicht
ActionScript:
  1. var theshape        = new shape_01();
heißen? Vorausgesetzt Du hast ein Objekt mit Verknüpfungsbezeichner
shape_01 in der Bibliothek liegen.

Könnte mir auch vorstellen, dass es Probleme gibt, da Du Deine Funktion
hitTest genannt hast, Flash aber den Namen "hitTest" selber schon belegt
hat.
__________________
Kunde: Ich hab da mal eine dumme Frage: Online-Banner sind schon fürs Internet, oder?
Simse179 ist offline   Mit Zitat antworten
Alt 21-07-2010, 15:06   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 12
Hallo!

Danke für die Antwort.
Ja, konform müssten natürlich die Klammern drin sein, hat aber auch ohne geklappt - trotzdem danke für den Hinweis.

Mit dem Funktionsnamen hat Flash kein Problem.

Ich konnte das Ganze auch bereits lösen, und zwar indem ich in meinen MovieClip zu Testzwecken einfach kurz ein Rechteck gemacht habe, welches ich dann wieder gelöscht hab. Seitdem funktioniert es ohne Tadel.

Ich habe zwar absolut keine Ahnung, was da wieder mal los war (ist mein CS5 vielleicht noch etwas verbuggt?), aber Hauptsache es geht jetzt.

Trotzdem herzlichen Dank!
Zenthara ist offline   Mit Zitat antworten
Alt 21-07-2010, 18:03   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.109
Zitat:
Zitat von Zenthara Beitrag anzeigen
Möchte das ganze allerdings lieber ohne hitTestObject lösen, da in einer späteren Fassung eine Teilüberlappung möglich sein soll.
eventuell unterliegst du auch einer täuschung?

hitTestPoint prüft, ob sich ein punkt innerhalb eines mc's befindet.
hitTestObject allerdings auch! es erfolgt keine überprüfung, ob sich die zwei konturen überschneiden, sondern es wird lediglich der objekt-nullpunkt als prüfpunkt verwendet.

falls du eine überschneidung zweier objekt-konturen benötigst, das geht mit BitmapData.hitTest


und für solche kunststückchen ;-)
if(coordinateX > writtenShapes[i][0].x && coordinateX < writtenShapes[i][0].x + writtenShapes[i][0].width){
empfehle ich dir:
object.getRect();
und die funktionen aus der rectangle-klasse wie z.b. containsRect, intersection usw.
mal an zu sehen.
__________________
die ultimative antwort auf alle programmierfragen: der debugger!
- vor eine programmzeile klicken (==roter punkt)
- im menü "debuggen" aufrufen
- auf den grünen pfeil klicken
- im swf etwas machen (der programmablauf hält beim roten punkt)
- links die objekte auswählen, variable, interne... mal alles ansehen!
mit dem debugger kann man sein programm schrittweisse abarbeiten und in alle variable reinsehen.

mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (21-07-2010 um 18:14 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 22-07-2010, 08:17   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 12
Hallo hgseib,

vielen Dank für deine aufschlussreiche Erklärung - wieder was gelernt!

Wie vorhin angemerkt klappt es ja gottseidank mittlerweile auch mit meinem Code, object.getRect() ist natürlich auch eine praktische Hilfsfunktion, aber viel weniger Kunststück wäre es ja auch nicht, müsste ich doch dieselbe Menge Text mit gleichem Ergebnis schreiben, denke ich?

Trotzdem herzlichen Dank - BitmapData.hitTest werde ich beizeiten auch mal versuchen!

Liebe Grüße
Zenthara ist offline   Mit Zitat antworten
Alt 22-07-2010, 14:04   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.109
Zitat:
Zitat von Zenthara Beitrag anzeigen
getRect() ist natürlich auch eine praktische Hilfsfunktion, aber viel weniger Kunststück wäre es ja auch nicht, müsste ich doch dieselbe Menge Text mit gleichem Ergebnis schreiben, denke ich?
ist ja nur noch der vollständigkeit halber.

x+width geht nur, wenn der nullpunkt links oben steht. aber was, wenn der sich mal in der mitte oder ganz wo anders befindet? dann geht das sowieso nur noch mit getRect bzw. getBounds. da könnte man es auch gleich benützen und so für alle fälle vorsorgen.
und generell gilt: wenn es für irgend etwas eine funktion gibt, dann ist es besser diese zu benützen, als die selbe funktion selbst zu programmieren. du willst ja auch irgendwann mal die y- position berücksichtigen? eben, dann ist es besser die vorhandenen funktionen zu verwenden, ob sich die rechtecke schneiden (wenn das mit den umfangsrechtecken langt).
__________________
die ultimative antwort auf alle programmierfragen: der debugger!
- vor eine programmzeile klicken (==roter punkt)
- im menü "debuggen" aufrufen
- auf den grünen pfeil klicken
- im swf etwas machen (der programmablauf hält beim roten punkt)
- links die objekte auswählen, variable, interne... mal alles ansehen!
mit dem debugger kann man sein programm schrittweisse abarbeiten und in alle variable reinsehen.

mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
hittest, kollision, math.random

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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Kollisionsabfrage so einfach wie möglich ellodron ActionScript 2 17 24-12-2007 13:06
Einfach if-Schleife geht einfach nicht... Warum? Arne_Schmidt ActionScript 1 6 01-06-2007 16:22
Einfach Random MovieClip Laden zerok Flash Einsteiger 2 20-05-2006 23:57
ganz einfach geht aber trotzdem net *lol* random DarkFreak Flash MX 4 12-02-2004 18:22
random: nicht getriggert sondern einfach zufällig vanilla coke ActionScript 1 3 28-07-2003 15:25


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele