Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 15-12-2004, 10:16   #1 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
hittest formkennzeichen?

Hallo!

Ich hab zwar massig Beiträge gefunden, aber in jedem zitiert irgendwer als Antwort die Flash-Hilfe für hittest und dann scheint es offenbar zu funktionieren.

Ich raff leider in der Hilfe aber gar nichts

Ich will meinen Blubberblasen Dinge in den Weg stellen, die sie erkennen und umgehen sollen. Dazu dieses einfache Script (Erst mal ohne Formkennzeichen):

PHP-Code:
while (thishittest(_root.stein)) {
            
this._x += 2;
            if (
thishittest(_root.stein)) {
                
this._x -= 4;
            }
        } 
Das sieht dann so aus.

Jetzt hab ich's mal mit Formmarken probiert.
Und zwar so wie's in der Hilfe steht:
PHP-Code:
(thishittest(_root.stein._x_root.stein._ytrue)) 
Und so wie ich's in einigen Beiträgen fand
PHP-Code:
(this.hittest(_root.stein._x_root.stein._ytrue)) 
Beides noch mal umgekehrt (Also, _root.stein mit this vertauscht).

Und noch ein paar ganz phantasievolle Varianten.
Klappt alles nicht. Einmal ist immerhin der Rechner dabei abgestürzt.

Was mach ich falsch?

Ich versteh auch überhaupt nicht, warum man, wenn man Formkennzeichen einsetzen will, nicht einfach die Instanz des MCs benutzen kann und statt dessen seine Koordinaten angeben muss?
Irgendjemand hier, der mal ganz idiotensicher erklären kann, was Flash da in etwa tut, wenn man Formkennzeichen benutzt?
__________________
we will stop enhancing the truth in 3, 2, ...

Geändert von SpecOps-12 (15-12-2004 um 10:18 Uhr)
SpecOps-12 ist offline   Mit Zitat antworten
Alt 15-12-2004, 11:56   #2 (permalink)
Neuer User
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 6.415
die animation sieht doch garnich so schlecht aus-warum diese aufmunterung weil du sooo einfach nicht ans ziel kommst.
außer tweens brauchst du hier weit mehr aufwand als du dir vorstellst.
mit tweens funktioniert die sache nicht du mußt die blasen per AS(Actionscript) bewegen und damit auch die bevorstehende kollision verhindern.
erstmal definitiv

hitTest
_________
1. einObjekt.hitTest(zweitesObjekt) //2 Flächen auf Überschneidung testen
2. einObjekt.hitTest(x,y,true(od false)) //ein Punkt(x,y) mit einer Fläche testen. true um exakte form zu testen, false wenn rechteck umbeschrieben werden soll

die 1. methode zieht um ein beliebiges objekt ein rechteck/quadrat, die fläche wird also umschrieben und testet diese fläche mit der anderen umschriebenen fläche.
testest du also ein rechtwinkliges dreieck so denk dir die andere hälfte daran-dieses objekt wird intern zum testen verwendet.
Für genaue Vergleiche also nicht zu gebrauchen
(es gibt viele möglichkeiten, die aber etwas kompliziert sind um diesen sachverhalt zu umgehen)
die zweite möglichkeit kann diesen sachverhalt ausbügeln, aber du kannst damit auch nur eine einzige koordinate testen(zB mauszeiger) oder ganz kleine partikel.

bei dir müsste man wie gesagt die blasen animieren, da sie zu groß sind
wären sie wie "quadrate", das dreieck wäre auch ein "quadrat" bzw eher "rechteck".
sehr ungenau und die momentane animation erspart dir viel arbeit und sieht ganz gut aus


deluxe
Deluxe ist offline   Mit Zitat antworten
Alt 15-12-2004, 12:46   #3 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Hi, danke für die Antwort.

Zitat:
einObjekt.hitTest(x,y,true(od false)) ein Punkt(x,y) mit einer Fläche testen.
Ich halt mich doch an diesen Syntax. Warum funktioniert es nicht?
Wenn ich den benutz, ignorieren die Blasen das Hindernis vollständig.
Hier nochmal das Beispiel mit Formkennzeichen.

Die Blubberblasen sind übrigens vollständig über AS gesteuert.
Da bin ich auch sehr stolz drauf

Ich wollt das ganze Script nicht posten, weil's mir für meine Frage nicht wichtig erschien.

Ich weiß auch, dass der "Ausweichalgorhythmus" noch sehr plump ist, aber zum probieren würde es ja schon mal langen.
Ich steh nicht unter Zeitdruck, deshalb kann ich ruhig etwas grübeln auf meinem Weg zum perfekten Aquarium

Hier das gesamte Script für eine einzelne Blase:

PHP-Code:
speed = (Math.random()*2)+1;
maxspeed 10;
kurvenr Math.ceil((Math.random()*4)+2);
maxkurvenr Math.ceil((Math.random()*20)+20);
// trace(maxkurvenr);
sinus Math.ceil((Math.random()*20)+20);
skal Math.ceil((Math.random()*30)+35);
maxskal Math.ceil((Math.random()*50)+60);
this._xscale skal;
this._yscale skal;
hoehe this._y;
startwert Math.ceil(Math.random()*10);
if (
startwert>5) {
    
startwert = -1;
} else {
    
startwert 1;
}
// trace("startwert "+startwert);
addskal = (maxskal-skal)/10;
// trace("speed "+speed);
// trace("maxkurvenr "+maxkurvenr);
// trace("skal "+skal);
// trace("maxskal "+maxskal);
// trace("startwert "+startwert);
this.onEnterFrame = function() {
    if (
speed<=maxspeed) {
        
speed speed*(6/5);
    }
    
this._y -= speed;
    if (
kurvenr<=maxkurvenr) {
        
kurvenr kurvenr*(13/12);
    }
    
// trace ("test ist "+test);
    
this._x = ((Math.sin((hoehe-this._y/sinus)))*kurvenr)*startwert;
    
// trace("this._x = "+this._x);
    
if (this._xscale<=maxskal) {
        
this._xscale += addskal;
        
this._yscale += addskal;
    }
    if ((
this._y)<=-20) {
    }
    
//Kollisionstest
    
while (this.hitTest((_root.stein._x+(_root.stein._width/2)), (_root.stein._y+(_root.stein._height/2)), true)) {
        
merk speed;
        
speed 1;
        
this._x += 2;
        if (
this.hitTest((_root.stein._x+(_root.stein._width/2)), (_root.stein._y+(_root.stein._height/2)), true)) {
            
this._x -= 4;
        }
        
speed merk;
    }
}; 
Diese gewagte Konstruktion am Schluss ist der Versuch, den Mittelpunkt des Ziel-MCs auszumachen.

Wie muss der eigentlich aussehen? Ich hab eine einfache Form innerhalb eines MCs. Ich mein, wenn es so funktionieren würde wie in diesem Flash-Hilfe-Beispiel mit dem Auto bei "Kollision", wär ich ja schon glücklich.
__________________
we will stop enhancing the truth in 3, 2, ...

Geändert von SpecOps-12 (15-12-2004 um 12:51 Uhr)
SpecOps-12 ist offline   Mit Zitat antworten
Alt 15-12-2004, 13:59   #4 (permalink)
Neuer User
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 6.415
ich denke mal das ding soll nicht hochgenau und physikalisch agieren.
würde sagen du machst das wie folgt

du nimmst diesen hitTest
mcA.hitTest(mcb) //mcA=blase mcB=dreieck

wenn ne blase nun das dreieck hitted dann setzt du die blase per AS an eine von beiden ecken und laßt sie dort weiter sinuskurven beschreiben.
bei vielen blasen merkt das keiner und du ersparst dir viel arbeit.

deine idee is nich schlecht aber bei sovielen blasen soviele while schleifen-das mag flash nich.
da die blasen nach oben fliegen mußt du garnicht per punkte testen sondern kannst schon o.g. form des hitTest verwenden.
bei nem hit mußte dich für ne richtung entscheiden am anfang mal eifnach nur für rechts.
machst als hitTest. falls hit rechts verschieben um 2.
wieder hitTest wieder verschiebung um 2 bis kein hit mehr kommt.
also genau das was du machst.
aber mach es nicht per schleife.
sondern per interval
oder ganz einfach innerhalb deines enterFrame events
ne while schleife desshalb auch nicht weil sie innerhalb eines frames komplett durchläuft ein
ActionScript:
  1. while(n<100)
  2. n++
  3. }
in einem enterFrame ist vor dem frame 0 und nach dem frame schon 100
wenn du dir das auf deine blasen übeträgst dann is blase A vor dem frame unterhalb des dreiecks und nach dem frame viel weiter rechts davon-->unnatürlich

viel spaß
deluxe
deluxe
Deluxe ist offline   Mit Zitat antworten
Alt 15-12-2004, 14:52   #5 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Ich hab's so probiert.

das script dazu ist dann

PHP-Code:
    if (this.hitTest(_root.stein)) {
        
speed 0;
        
kollision 1;
        if (
this._x>=0) {  /*Hier müsste später eine cleverere Variable hin, die den Mittelpunkt
von Blase und Hindernis in ein Verhältnis setzt) */
            
this._x += 2;
        } else {
            
this._x -= 4;
        }
    } else {
        
speed merk;
        
kollision 0;
    } 
So geht es im Grunde. Das Problem ist jetzt, dass die Funktion, die die Sinuswelle berechnet, die Blase nach erreichen der "Kollisionsfreiheit" sofort in die Kurve zurückpresst und mitten im Gegenstand "aussetzt".

Und - sorry, aber ich bin manchmal etwas langsam - ich versteh immer noch nicht ganz, warum das mit den Formkennzeichen nicht funktioniert.
__________________
we will stop enhancing the truth in 3, 2, ...
SpecOps-12 ist offline   Mit Zitat antworten
Alt 15-12-2004, 15:12   #6 (permalink)
Neuer User
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 6.415
wegen dem sinusproblem mußte doch nur nen xoffset einführen
ActionScript:
  1. this._x = ((Math.sin((hoehe-this._y/sinus)))*kurvenr)*startwert+xoffset
am anfang 0 und wenn dus um 100px nach rechts verschieben willst xoffset=100

und natürlich mußte auch beachten dass bei einem hit die blase nicht weitersteigen darf.
ActionScript:
  1. if(hittTest...){
  2. //hier hit
  3. }else{
  4. //wenn kein hitt
  5. //nur dann y erhöhen
  6. }

deluxe
Deluxe ist offline   Mit Zitat antworten
Alt 15-12-2004, 15:41   #7 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Sei dir versichert, mein persönlicher Held des Tages zu sein

Hier nochmal zum angucken.
Morgen mach ich dann die Feinheiten.
Obwohl mich ja doch interessiert hätte, wie das mit den Formkennzeichen wäre

Das Script dazu in seiner ganzen ähh naja Pracht (?) nochmal:

PHP-Code:
stop();
xoffset 0;
kollision 0;
speed = (Math.random()*2)+2;
merk speed;
maxspeed 20;
kurvenr Math.ceil((Math.random()*4)+2);
kurvenmerk kurvenr;
maxkurvenr Math.ceil((Math.random()*20)+20);
sinus Math.ceil((Math.random()*20)+20);
skal Math.ceil((Math.random()*30)+35);
maxskal Math.ceil((Math.random()*50)+60);
this._xscale skal;
this._yscale skal;
hoehe this._y;
startwert Math.ceil(Math.random()*10);
if (
startwert>5) {
    
startwert = -1;
} else {
    
startwert 1;
}
addskal = (maxskal-skal)/10;
this.onEnterFrame = function() {
    if (
speed<=maxspeed) {
        
speed speed*(6/5);
    }
    
this._y -= speed;
    if (
kurvenr<=maxkurvenr) {
        
kurvenr kurvenr*(13/12);
    }
    if (
kollision == 0) {
        
this._x = (((Math.sin((hoehe-this._y/sinus)))*kurvenr)*startwert)+xoffset;
        if (
this._xscale<=maxskal) {
            
this._xscale += addskal;
            
this._yscale += addskal;
        }
        if ((
this._y)<=-560) {
            
this._y = -560;
            
gotoAndStop(2);
            
// (Dort sind die halben Blasen für die Oberfläche)
        
}
    } else {
    }
    
//Kollisionstest
    
if (this.hitTest(_root.stein)) {
        
speed 0;
        
kollision 1;
        if (
this._x>=0) {
            
this._x += 2;
            
xoffset += 5/2;
        } else {
            
this._x -= 4;
            
xoffset -= 9/2;
        }
    } else {
        if (
kollision == 1) {
            
speed merk;
            
kurvenr kurvenmerk;
        }
        
kollision 0;
    }
}; 
__________________
we will stop enhancing the truth in 3, 2, ...
SpecOps-12 ist offline   Mit Zitat antworten
Alt 17-12-2004, 18:58   #8 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Falls irgendwann in ferner Zukunft noch mal jemand nach "Formkennzeichen" sucht und hier reinguckt

Habs jetzt.
Der Punkt war, dass ich nicht gebacken hatte, dass das Movieclip immer von seinen eigenen Koordinaten und nicht von der objektiven Lage auf der Bühne ausgeht, und die Koordinaten entsprechend korrigiert werden müssen.

Also, der entscheidende Punkt war quasi:

PHP-Code:
xblase this._x _root.xkorrektur;
    
yblase this._y _root.ykorrektur;
    if (
_root.stein.hitTest(xblaseyblasetrue)) { 
Oben am Beispiel sieht man's.
__________________
we will stop enhancing the truth in 3, 2, ...
SpecOps-12 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 16:20 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele