hitTest in 2 Dimensionen

philishake

javascript enthusiast
Hi Community,

ich arbeite gerade an eine Leveleditor für ein Flashgame. ich lasse über Usereingabe die Maße für das Raster zum editieren des Levels abfragen und erzeuge dann mittels attachMovie in Dimension 1 das Gitternertz. Die Toolbar auf der die Blöcke generiert werden, die man dann in das Raster ziehen kann, werden ebefalls per attachMovie auf Dimension 2 erstellt. Nun wollte ich, dass die Blöcke die man runterziehen kann am Gitternetz einrasten. Alledings funktioniert der hitTest nicht, da die Toolbar und das Gitter auf verschiedene Ebene liegen. Lege ich sie auf die selbe Ebene, so wird die Toolbar gelöscht, sobald man das Gitternetz generiert da das attachMovie die bereits bestehende Dimension dann überschreibt.

Meine Frage ist, kann ein hitTest auch überdimensional aggieren, sodass man sagt:

dimension.mc.hitTest(dimension.mc) ?

Danke schonmal für euer Feedback!
 
Hi,

1. Mit Ebenen dürfte das nichts zu tun haben - die existieren in dieser Form nur zur Entwurfszeit und haben keine Auswirkungen auf Scripte.

2. Bei Dir geht es wohl eher um Kollisionen zwischen Objekten, die sich auf unterschiedlichen Zeitleisten befinden (z.B. _root.container1.clip.hitTest(_root.container2.clip);). Hierbei musst Du die Startkoordinaten der jeweiligen Zeitleisten beachten (die Methode MovieClip.localToGlobal könnte Dir hierbei weiterhelfen).

3. Wenn Blöcke auf einem Gitter "einrasten" sollen, wäre es allerdings das einfachste, einfach die Koordinaten zu quantisieren. Im Anhang findest Du ein Beispiel dazu (Code im MC "blocks").

Gruß
.
 

Anhänge

Hi, ich nochmal...

Ich habe heute versucht mein bestehendes Skript so zu ändern, dass alles was Sichtbar werden soll in einer Dimension mit attachMovie erstellt wird. Leider funktioniert der hitTest immernoch nicht. Woran kann das liegen?

Hier der Code ( Der liegt im _root auf einer Extra Ebene ganz oben.
PHP:
X_text.text = 5;
Y_text.text = 5;

fscommand("allowscale", false);
fscommand("allowscale", false);

game = {tileW:30, tileH:30};

function buildMap(map) {
	_root.attachMovie("empty", "tiles", 1);
	game.clip = _root.tiles;
	// Erstelle Gitternetz
	var mapWidth = map[0].length;
	var mapHeight = map.length;
	for (var i = 0; i<mapHeight; ++i) {
		for (var j = 0; j<mapWidth; ++j) {
			var name = "t_"+i+"_"+j;
			
			game.clip.attachMovie("tile", name, i*100+j*2);
			game.clip[name]._x = (20+j*game.tileW);
			game.clip[name]._y = (120+i*game.tileH);
			
			game.clip[name].gotoAndStop(1);
		}
	}
	// Erstelle Tilebar
	game.clip.attachMovie("empty", "tilebar", 1)
	game.clip.tilebar.attachMovie("tilebar", "count", 1);
	game.clip.tilebar.count._visible = false;
	var tc = game.clip.tilebar.count._totalframes;
	
	for (var tile_frames = 1; tile_frames <= tc; ++tile_frames) {
		game.clip.tilebar.attachMovie("tilebar", tile_frames, tile_frames*100+2);
		game.clip.tilebar[tile_frames]._x = (155+tile_frames*45);
		game.clip.tilebar[tile_frames]._y = 50;
		game.clip.tilebar[tile_frames].gotoAndStop(tile_frames);
		
		game.clip.tilebar[tile_frames].onPress = function() {
			this.startDrag();
		};
		game.clip.tilebar[tile_frames].onRelease = function() {
			this.stopDrag();
			
			f_size = parseInt(_root.X_text.text) * parseInt(_root.Y_text.text);
			check_x = 0;
			check_y = 0;
			
			while (f_size != 0) {
				var check_pos = "t_"+check_x+"_"+check_y;
				if (game.clip.tilebar[tile_frames].hitTest(game.clip[check_pos])) {
					trace(check_pos);  // AUSGABE DES TREFFERS
					game.clip.tilebar[tile_frames]._y = game.clip[check_pos]._y;
					game.clip.tilebar[tile_frames]._x = game.clip[check_pos]._x;
					game.clip.tilebar[tile_frames].stopDrag();
					break;					
				}
				check_x++;
				if (check_x>parseInt(_root.X_text.text)-1) {
					check_x = 0;
					check_y++;
					if (check_y>parseInt(_root.Y_text.text)-1) {
						break;
					}
				}
				f_size--;
			}
		};
	}
}
// Generator
_root.gen.onRelease = function() {
	ykord = parseInt(_root.Y_text.text);
	xkord = parseInt(_root.X_text.text);
	meinArray = new Array();
	for (i=0; i<ykord; i++) {
		meinArray[i] = new Array();
		for (o=0; o<xkord; o++) {
			meinArray[i][o] = 0;
		}
	}
	buildMap(meinArray);
};
 
Hi,

dazu müsste ich die .fla vorliegen haben, um das Ding testen zu können (einen Codeausschnitt dieser Länge kann und will ich nicht "freihändig" debuggen ;)).

Mir ist zudem nicht klar, was Du in diesem Zusammenhang mit "Dimension" meinst - diesen Begriff gibt es in Flash eigentlich nicht ...

Gruß
.
 
Zurück