| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #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 |
| | |
| | #3 (permalink) |
| Techniker 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) |
| | |
| | #4 (permalink) |
| Der Alte Registriert seit: Nov 2003 Ort: Potsdam
Beiträge: 208
|
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 |
| | |
| | #5 (permalink) |
| Techniker 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
*/ 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) |
| | |
| | #6 (permalink) |
| Der Alte Registriert seit: Nov 2003 Ort: Potsdam
Beiträge: 208
|
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). |
| | |
| | #7 (permalink) |
| Techniker 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 |
| | |
| | #8 (permalink) |
| nobody is perfect Registriert seit: Apr 2002 Ort: Bremen
Beiträge: 3.049
|
saubär, saubär Junx hier kann man ja noch richtig was lernen bye
__________________ FF Unterstützen! Erste Hilfe! häufig gestellten Fragen ...................... ............... ................................ |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |