Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 29-11-2003, 09:06   #1 (permalink)
Neuer User
 
Registriert seit: Aug 2003
Beiträge: 16
Alternative zu HitTest

Ich habe gehört dass

if(this.hitTest(_root.objekt)){};

ziemlich rechenaufwändig sein soll,
und dass es da eiene bessere Methode gibt.

Weiss jemand was davon ???

Ausserdem möchte ich was über globale Variablen wissen???
(was bringen sie, wie wendet man sie an....)

Danke
a_christian ist offline   Mit Zitat antworten
Alt 29-11-2003, 10:20   #2 (permalink)
jungflasher
 
Benutzerbild von sesamstrassenbe
 
Registriert seit: Oct 2002
Ort: Dortmund
Beiträge: 132
Hi!

Wenn Du etwas über globale Variablen wissen möchtest, nimmst Du Dir am besten erstmal ein Flash-Buch vor

Grüße! Daniel
__________________
sesamstrassenbert. so viel platz muss sein ;-)

www.digisurf.de
sesamstrassenbe ist offline   Mit Zitat antworten
Alt 29-11-2003, 15:32   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.321
ich vermute einmal, ich bin der urheber dieser fragen.


hitTest hat zwei varianten:
- bei der einfachen wird das umgebende rechteck getestet
- bei der anderen wird konturgenau ermittelt. dazu wird gewissermassen eine "schwarz/ weis gesamtfläche" von dem objekt erstellt um dann zu testen ob der testpunkt "schwarz oder weis" ist. besseres ergebnis == mehr rechenaufwand

solange dein mc in zufriedenstellender geschwindigkeit läuft ist's ja ok. und nur programmierer regen sich über das "schlechte" handwerk auf ;-)

interessant wirds erst, wenn man mit sehr vielen objekten eine kollision testen muss. der rechenaufwand steigt quatratisch zur testanzahl an. da gibt es aber keine festen regeln, sondern jetzt ist "raffinierte" programmierung gefragt um trotz der menge noch zu brauchbaren reaktionszeiten zu kommen.


flash5 unterscheidet keine variablenarten:
im gegensatz zu "richtigen" programmiersprachen unterscheidet flash5 nicht. um "sauber" zu programmieren sollte man sich aber an allgemein gültige standard halten. z.b. (da hat jeder sein eigenes system)
cVariablenname - für konstante werte, die sich niemals ändern (wie gesagt, flash5 kennt sowas nicht wirklich)
gVariablenname - für globale, die z.b. in einer ebene liegen, die über alle frames geht und damit wärend dem gesamten programmlauf einmalig zur verfügung stehen. diese dürfen niemals innerhalb einer funktion mit var gVariablenname neu definiert werden.
vVariablenname - lokale variable des mc's bzw. innerhalb der funktion.

wer sich von anfang an eine "saubere" programmierung angewöhnt, der hats bei einem wechsel (z.b. actionscript 2.0) leichter. und eine saubere namensgebung verringert die fehlerrate.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (29-11-2003 um 15:45 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 30-11-2003, 20:10   #4 (permalink)
Der Alte
 
Registriert seit: Nov 2003
Ort: Potsdam
Beiträge: 208
Lightbulb

Ich weis nicht ob es besonders geschickt ist, aber ich mache es so:
Der Code ist Objekt 1 zugeordnet. Die Koordinaten des anderen Objektes verstecken sich in den Variablen "vx" und "vy", die ich aus der Root hole.
Mit den Zahlen kann ich dann variieren welchen Bereich ich noch als getroffen gelten lasse.
Wichtig ist noch das die Objekte auch wirklich das gleiche Koordinatensystem verwenden.

// Treffer
if ((_x<(_root.vx+20)) && (_x>(_root.vx-20)) && (_y<(_root.vy+10)) && (_y>(_root.vy-15))) {
...
}

In Funktion siehst Du den Code bei www.f-schleicher.de/Ufo.htm
__________________
mfG

http://www.1ststeps.de
Billi_I ist offline   Mit Zitat antworten
Alt 30-11-2003, 21:32   #5 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.321
sorry, ist extrem schlecht ;-) weil erst 4 endscheidungen getroffen werden müssen, bevor die äussere klammer ausgewertet werden kann. schneller gehts so:
nicht testen ob der punkt drinnen ist, sondern draussen und durch die einzeltests wird abgebrochen, sobald eine endscheidung zutrifft.
Code:
function fPunktInRechteck1 (vP, vR) {
	if (vP._x<(vR._x+20)) {
		if (vP._x>(vR._x-20)) {
			if (vP._y<(vR._y+10)) {
				if (vP._y>(vR._y-15)) {
					return true;
				}
			}
		}
	}
	return false;
}
function fPunktInRechteck2 (vP, vR) {
	if ((vP._x<(vR._x+20)) && (vP._x>(vR._x-20)) && (vP._y<(vR._y+10)) && (vP._y>(vR._y-15))) {
		return true;
	}
	return false;
}
// 
function fTeste_den_Test (vP, vR) {
	trace (fPunktInRechteck1(vP, vR));
	trace (fPunktInRechteck2(vP, vR));
	vDauer = getTimer();
	for (v=1; v<=1000; v++) {
		fPunktInRechteck1(vP, vR);
	}
	trace ("dauer1 "+(getTimer()-vDauer));
	vDauer = getTimer();
	for (v=1; v<=1000; v++) {
		fPunktInRechteck2(vP, vR);
	}
	trace ("dauer2 "+(getTimer()-vDauer));
}
// 
var vP = new object();
var vR = new object();
vR._x = 50;
vR._y = 50;
// 
// 
vP._x = 50;
vP._y = 50;
fTeste_den_Test(vP, vR);
// 
vP._x = 50;
vP._y = 150;
fTeste_den_Test(vP, vR);
// 
vP._x = 350;
vP._y = -250;
fTeste_den_Test(vP, vR);
/*
ergebnis auf meinem rechner:
true
true
dauer1 283.333333328366
dauer2 316.666666671634
false
false
dauer1 250
dauer2 366.666666656733
false
false
dauer1 166.666666671634
dauer2 200
*/
nachtrag:
jetzt wollte ich es wissen und habe den test noch für hitTest erweitert. allerdings kommen ständig andere messzahlen dabei heraus, so das man die zeitmessung mit getTimer nicht gelten lassen kann :-(
soll halt jeder machen, was er für das beste hällt ;-)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (30-11-2003 um 22:51 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 01-12-2003, 19:14   #6 (permalink)
Der Alte
 
Registriert seit: Nov 2003
Ort: Potsdam
Beiträge: 208
Thumbs up

ja, bei Dir sieht das profimäßiger aus. Sicher bist Du schneller, solange Du nicht triffst (was ja meißtens der Fall ist) ansonsten brauchst Du natürlich auch vier Vergleiche.

Wie arbeitet eigentlich der Befehl "hittest". Ist er wirklich so grottenschlecht, das man ihn meiden soll?

Meine Variante habe ich "erfunden" als ich den Befehl noch garnicht kannte (noch nicht lange her).
__________________
mfG

http://www.1ststeps.de
Billi_I ist offline   Mit Zitat antworten
Alt 02-12-2003, 21:44   #7 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.321
das können wir jetzt ewig weiter diskutieren ;-)

in der praxis sieht alles ganz anders aus! aber der kern ist genau das: "solange Du nicht triffst (was ja meißtens der Fall ist)"

kann man mit geschickter programmierung prüfungen vorzeitig entscheiden? das ist die kernfrage, die in der praxis über "geht oder geht nicht" eines programmes entscheiden kann. und nicht, ob variante a ein paar millisekunden schneller ist als variante b.

was bei 10 objekten noch problemlos geht mag bei 100 objekten versagen. solche steigerungen kommen besonders oft bei spielen vor.

eine pauschale antwort gibt es nicht. jedes problem hat seine eigene lösung. (es sprach salomon der weisliche :-)


-----
hier ging es ja ursprünglich mal um dieses "bombenleger" spiel ;-) im versuch, das einmal konkreter zu benennen:

variante a)
auf der bühne liegen 100 klötzchen, es wird in einer schleife getestet: kollision spielstein gegen 100 klötzchen.
ungeschickt: weil der zeitbedarf im quadrat der klötzchenanzahl steigt.

variante b)
da das speilfeld letztendes wie ein schachbrett in kleine quader aufgeteilt ist wäre eine lageplan-map sinnvoll.
var vPlan=new Array()
var vPlan[1]=new Array(0,1,1,0,1,0)
var vPlan[1]=new Array(0,1,1,0,1,0)
.. usw
per modulo wird die koordinate des spielsteins ermittelt. jetzt kann direkt aus dem plan gelesen werden, ob ein feld frei oder belegt ist.
if (vPlan[x][y]==1)
besser: weil der zeitbedarf immer der gleiche ist. egal ob der spieleplan 10x10 oder 1000x1000 felder gross ist. und egal, wieviele klötzchen im weg liegen. hitTest steht hierbei überhaupt nicht zur diskussion.

variante c)
wenn gegen unregelmässige oder sich bewegende objekte getestet werden soll. dann kann man diese in arrays verwalten.
z.b. das gesammte spielfeld in 4 teile aufteilen. zuerst erfolgt ein test, in welchem quadranten sich der spielstein befindet. danach erfolgt der kollisionstest aller objekte dieses quadranten.
rafiniert: weil 3/4 der testzeit eingespahrt wird.

variante d)
es soll getestet werden, ob sich der spielstein innerhalb einer komplexen fläche befindet (z.b. auf einer schrift oder alle quader- klötzchen befinden sich in einem mc, das jetzt als ein objekt getestet werden kann). na, hier gibt es überhaupt keine alternative zu hitTest ;-)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 03-12-2003, 11:04   #8 (permalink)
nobody is perfect
 
Benutzerbild von Decrone
 
Registriert seit: Apr 2002
Ort: Bremen
Beiträge: 3.049
Thumbs up

saubär, saubär Junx

hier kann man ja noch richtig was lernen

bye
__________________
FF Unterstützen! Erste Hilfe! häufig gestellten Fragen
...................... ............... ................................
Decrone 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 08:11 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele