Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 09-12-2004, 13:53   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 13
wo ist der denkfehler? (hitTest)

Hallo,

programmiere gerade ein kleines Spielchen.
Ein Raumschiff fliegt durch die Gegend und feuert Laser ab, die durch attachMovie erzeugt werden und mit der Variable LCounter hochgezählt werden.

_root.attachMovie("laser", "Laser"+this.LCounter, Ebene);

Das gleiche mache ich mit den Jägern (die das Raumschiff jagen)

_root.attachMovie("jäger", "Jäger"+this.jCounter, Ebene);

Jetzt ist das Programm noch ziemlich am Anfang und letztendlich will ich nur, das ein Kollisionstest zwischen den abgefeuerten Lasern und allen vorhandenen Jägern durchgeführt wird.

Dafür habe ich eine Klasse Kollisionsmanager gemacht, die on enterFrame ständig folgendes macht:

for (z=1; z<ObjektErzeuger.jCounter; z++) {
for (l=1; l<mc_raumschiff.LCounter; l++) {
if (["Jäger"+z].hitTest(["Laser"+l])) {
trace("treffer");
}
}
}

Das ist jetzt noch sehr einfach. Und soll nachher auch verfeinert werden. Mir geht es jetzt erstmal darum, das die Kollision überhaupt erkannt wird. Das wird sie aber nicht. Ich habe auch schon jeweils ein _root["Jäger"+z] bzw. auch _root["Laser"+l] davorgesetzt.

Aber ich glaube ich mache einen generellen Denkfehler. Kann man Instanzen von Objekten überhaupt auf die Art und Weise miteinander abfragen?

Danke für eure Antworten
maksimo ist offline   Mit Zitat antworten
Alt 09-12-2004, 14:03   #2 (permalink)
mentally ill
 
Registriert seit: Aug 2004
Beiträge: 172
PHP-Code:
 if (_root["Jäger"+z].hitTest(_root["Laser"+l])) {
trace("treffer");

würde ich jetzt mal behaupten, denn wenn du später die klass von wo anders aufrufst, dann weiss die natürlich nicht wo die instanzen deiner objekte liegen....
__________________
there is no place like 127.0.0.1
--------------------------------------------------
[STUFF] E-Mail Liste für Newsletter o.ä.
[STUFF] MySQLConnector Klasse
menty ist offline   Mit Zitat antworten
Alt 09-12-2004, 14:10   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 13
danke menty,

das habe ich schon fast vermutet.
entscheidender ist aber, wie kann ich es machen, das es die objekte erkennt?
maksimo ist offline   Mit Zitat antworten
Alt 09-12-2004, 14:19   #4 (permalink)
mentally ill
 
Registriert seit: Aug 2004
Beiträge: 172
laut der flashhilfe ist die syntax für hittest
PHP-Code:
if (_root.ballhittest(_root.quadrat)){
        
trace("ball überschneidet sich mit quadrat");

du hast geschrieben
PHP-Code:
 if (["Jäger"+z].hitTest(["Laser"+l])) {
trace("treffer");

evt. liegts ja an dem komma statt punkt....
__________________
there is no place like 127.0.0.1
--------------------------------------------------
[STUFF] E-Mail Liste für Newsletter o.ä.
[STUFF] MySQLConnector Klasse
menty ist offline   Mit Zitat antworten
Alt 09-12-2004, 14:22   #5 (permalink)
Neuer User
 
Benutzerbild von Lise
 
Registriert seit: Feb 2003
Ort: Hannover
Beiträge: 24
Ich benutze in einem solchen Fall immer eval.
Code:
var mc1:MovieClip;
var mc2:MovieClip;
for (......){
mc1=eval("jaeger"+counter);
for(....)}
mc2=eval("opfer"+counter);
if (mc1.hitTest(mc2)){}}}
Wenn es sehr viele Objekte sind, kann es sein, dass die Schleifen zu lange dauern.
Wenn du die Kollisionsabfrage in eine eigene Funktion legst, die du mit setInterval aufrufst, hast du die Zeit besser im Griff.
__________________
Genieße den Tag.
Lise ist offline   Mit Zitat antworten
Alt 09-12-2004, 14:43   #6 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 13
auch dir danke lise,

habe das so gemacht. funktioniert leider trotzdem nicht.
hab mir mal die variablen tracen lassen.
das prob liegt glaub darin, das die immer alle auf _level0 liegen.
das tun sie ja aber gar nicht.
die liegen auf aufsteigenden leveln.
ist das das prob?
gibt es trotzdem eine möglichkeit ein kollisionsabfrage zu machen ohne mich um die level zu scheren?
maksimo ist offline   Mit Zitat antworten
Alt 09-12-2004, 19:40   #7 (permalink)
Neuer User
 
Benutzerbild von Lise
 
Registriert seit: Feb 2003
Ort: Hannover
Beiträge: 24
Ich schick dir mal ein fla und eine Klasse. Du kannst die Quadrate anfassen. Wenn sie sich berühren erkennen sie es.
Gruss
Die fla:

Code:

//hitTest für viele Objekte
//viele mit vielen
//Achtung: Aktualisierung des Anzeigetextes ist evtl. problematisch wegen der 
//ständigen Abfragen
var meinBroadcaster:Object = new Object();
AsBroadcaster.initialize(meinBroadcaster);
var mc:MovieClip;
var z:Number = 5;
var QuadratArray:Array = new Array();
for (var i = 0; i<z; i++) {
	var quadrat = new Quadrat(i, 60);
	QuadratArray.push(quadrat);
	quadrat.positionieren(100, 20+i*80);
	meinBroadcaster.addListener(quadrat);
}
setInterval(allePruefen, 100);

function allePruefen() {
	//Kollisionsobjekt wird als Parameter an die Methode übergeben
	for (var i = 0; i<z; i++) {
		mc = QuadratArray[i].leinwand;
		meinBroadcaster.broadcastMessage("kollisionPruefen", mc);
	}
}
die externe Quadrat.as
Code:
class Quadrat extends MovieClip {
	private var startX:Number = 0;
	private var startY:Number = 0;
	private var breite:Number = 200;
	private var tiefe:Number = 1;
	private var hoehe:Number = 200;
	private var leinwand:MovieClip;
	private var rotationId:Number = 0;
	private var bewegungId:Number = 0;
	function Quadrat(tiefe:Number, breite:Number) {
		this.tiefe = tiefe;
		this.breite = breite;
		this.leinwand = _root.createEmptyMovieClip("quadrat"+tiefe, tiefe);
		this.leinwand.onPress = ziehen;
		this.leinwand.onRelease = loslassen;
		this.zeichnen();
	}
	public function zeichnen():Void {
		//trace("ich zeichne");
		var breite:Number = this.breite;
		//bezugspunkt zum drehen in die mitte setzen
		var x:Number = this.startX-(breite/2);
		var y:Number = this.startY-(breite/2);
		with (this.leinwand) {
			lineStyle(5, 0x00cc33, 50);
			beginFill(0x00cc33, 30);
			moveTo(x, y);
			lineTo(x+breite, y);
			lineTo(x+breite, y+breite);
			lineTo(x, y+breite);
			lineTo(x, y);
			endFill();
		}
	}
	public function positionieren(x:Number, y:Number):Void {
		with (this.leinwand) {
			_x = x;
			_y = y;
			updateAfterEvent();
		}
	}
		//
	public function ziehen(Void):Void {
		//trace("gedrückt");
		this.startDrag();
	}
	
	public function loslassen(Void):Void {
		//trace("loslassen");
		stopDrag();
	}
	
	public function kollisionPruefen(mc:MovieClip):Void {
		//trace("hier ist kollisionPruefen"+mc);
		//jedes Objekt trifft sich selbst
		//deshalb abfragen
		
		if(mc!=this.leinwand)
		{
		if (mc.hitTest(this.leinwand)) {
			_root.TF_info.text = "Nr "+this.tiefe+" trifft "+mc;
		}
		}
	}
}
__________________
Genieße den Tag.
Lise ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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



Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele