Flashhilfe.de - Flash Community

Polygonale rotierbare hitBox [Flash 5]

 


AntwortenRegistrieren Seite1  

MoD#1
Benutzerbild von MoD
Beiträge: 170
Wohnort: Bei Karlsruhe
Registriert: Nov 2002

15.11.2004, 22:11

Angeregt von Carsten Müller (http://www.flashhilfe.de/forumanfaenger_0_000_0_128947_128947.html#128947) habe ich ein Skript entwickelt, dass eine drehbare polygonale (mehreckige) hitBox erstellt und mit zwei Instanzen einen genauen hitTest durchführen kann.
Es ist eigentlich die zweite Version, allerdings komplett neu gestaltet (alte Version: http://www.flashhilfe.de/forumanfaenger_0_000_0_128947_129634.html#129634).

Die neue Fassung ist, wie die alte, für Flash 5 geschrieben, aber mit allen neueren Versionen kompatibel.
Wenn jemand Lust hat, kann er/sie das ganze mal in AS 2.0 umsetzten (ist bestimmt eine tolle Übung).

Soweit ich weiß einthält die erste Version auch noch einen kleinen Fehler, der auftritt, wenn einer der getesteten MCs horizontal oder vertikal steht. Dieser Bug ist jedoch in dieser Version behoben worden.

Vor der Gebrauchsanleitung möchte ich noch darauf hinweisen, dass diese Version der hitBox KEINE GRÖSSENÄNDERUNGEN UNTERSTÜTZT. Eventuell überarbeite ich das ganze und poste demnächst noch eine Version die auch das kann.

Ich habe bemerkt, dass der Film (bei Flash-Vorschau) im 5er-Player ziemlich stark ruckelt (erzeugt viel CPU-Belastung).
Im 7er - Browser Plug-In läuft er aber einwandfrei.
Trotzdem Empfehlung: Vor dem hitTesten mit hitBox.extHitBox noch die Flash-Variante MC.hitTest() ausführen, um unnötige Berechnungen zu vermeiden.


Noch ein Punkt: Ich habe versucht, im ganzen Skript den OOP-Gedanken (recycling) beizubehalten. Daher sind die benutzen Klassen sehr allgemein gehalten und die verschiedenen Aktionen des Skriptes weit über viele Methoden verteilt und nicht in einer einzigen Funktion untergebracht. Diese Klassen sind (meiner Meinung nach) recht nützlich und können auch gut für andere Zwecke benutzt werden.



Hier der Link zum Skript (es ist über 300 Zeilen lang, daher etwas zu lang zum posten):
http://home.arcor.de/themod/hitBox(.extHitTest)%20dyn%20FINAL%201.0.as


Ein Beispiel:
FLA:  http://home.arcor.de/themod/hitBox(.extHitTest)%20dyn%20FINAL%201.0%20usageExample.fla
SWF:  http://home.arcor.de/themod/hitBox(.extHitTest)%20dyn%20FINAL%201.0%20usageExample.swf
HTML: http://home.arcor.de/themod/hitBox(.extHitTest)%20dyn%20FINAL%201.0%20usageExample.html


Eine Gebrauchsanleitung steht im 1.Re, wer eine genaue Dokumentation will (Wie funktioniert das ganze?) soll sich bitte bei mir melden (them.o.d[a - t]web.de): Selbst allgemein gefasst ist sie noch ziemlich lang.


P.S.: Mich würde mal interessieren, wie bei den Autorennen, die ich bisher gesehen habe (von Carsten Müller und Funnyprinter) der "hitTest" für die Grasfläche realisiert ist (das Auto wird auf Gras langsamer). Hat das etwas mit Masken zu tun?

Geändert von MoD am 15.11.04 um 22:47 Uhr
MoD#2
Benutzerbild von MoD
Beiträge: 170
Wohnort: Bei Karlsruhe
Registriert: Nov 2002

Themenautor/in

15.11.2004, 22:12

Gebrauchsanleitung
Alles was man benötigt ist:
- Die aktuelle Position (globale Koordinaten) der gewünschten Ecken
- Einen MC, auf den sich die hitBox beziehen soll
- Für einen hitTest muss die Methode .extHitTest aufgerufen werden


Beim Erstellen eines hitBox-Objektes müssen die gewünschten Ecken in Form einer Instanz der beigelegten Coordinate-Klasse übergeben werden:
ActionScript:
1
2
3
4
xKoordinate=50;
yKoordinate=200;

gesKoordinate=new Coordinate(xKoordinate, yKoordinate);

(Diese Klasse ist ein "Relikt" aus Java: Point-class)

Die Ecken müssen in ein Array eingefügt werden; dabei gelten folgende Verbindungs-Bedingungen:
- Alle aufeinanderfolgenden Ecken müssen verbunden sein
- Die Ecke im ersten Array-Feld muss mit der Ecke im letzten verbunden sein

D.h. für ein Viereck:
Anfangsecke ist z.B. rechts oben, dann ist die nächste entweder links oben oder rechts unten. Je nach Wahl ist (in diesem Beispiel) die letzte Ecke die nicht gewählte von diesen beiden.
z.B.: rechts oben -> rechts unten -> links unten -> links oben


Wo die Koordinaten für die hitBox herkommen, ist völlig egal.

Beispiel
ActionScript:
1
2
eckenArray=[new Coordinate(50, 100), new Coordinate(75, 0), new Coordinate(100, 100)];
testHitBox=new hitBox(dreiecksMC, eckenArray);





Dazu muss für einen hitTest die Method "extHitTest" der hitBox-Klasse immer dann aufgerufen werden, wenn ein hitTest erfolgen soll.
Sie liefert ein Objekt zurück, dass 3 Attribute enthält:
(this bezieht sich auf die hitBox-Instanz, von der aus die Methode aufgerufen wurde; other auf die übergebene zweite
hB1.extHitTest(hB2)
hB1=this, hb2=other)

   .hits
   Eine Bool'sche Variable, ob die hitBoxen sich überschneiden.

   .thisHittingSideArray
   Ein Array, das die sich überlappenden Seiten enthält.
   Es ist nach den eigenen Seiten nach Seiten-IN (s.u.) geordnet und enthält die jeweils treffenden Seiten-INs der anderen, übergebenen hitBox

   .otherHittingSideArray
   Genau wie .thisHittingSideArray, nur nach den Seiten der übergebenen hitBox geordnet

   .bothHittingSideArray
   Nicht geordnet; enthält Objekte mit den Attributen thisSideIN und otherSideIN, die die jeweiligen Seiten-INs enthalten.

Die Seiten-INs:
Jeder Seite wird eine IN (identification number) zugewiesen.
Sie entspricht dem Index der Startecke der Seite (Startpunkt) im durch den Benutzer übergebenen Ecken-Array.
z.B.:
Bestand der Ecken-Array (s.o.) aus [eckeLinksOben, eckeRechtsOben, eckeRechtsUnten, eckeLinksUnten], ist die Seiten-IN für die Seite eckeRechtsOben->eckeRechtsUnten gleich "1", was dem Index der Startecke der Seite (eckeRechtsOben) entspricht.




Ein ganzes (funktionierendes) Beispiel (4-eckige hitBox, "extHitTest"-Aufruf über onClipEvent), benötigt 2MCs - auto und baum:
   HZL
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
stop();


#include "hitBox(.extHitTest) dyn FINAL 1.0.as"

//Koordinaten erstellen: LB=LeftBottom etc.
LB=new Coordinate(auto.getBounds(_root).xMin, auto.getBounds(_root).yMax);
LT=new Coordinate(auto.getBounds(_root).xMin, auto.getBounds(_root).yMin);
RT=new Coordinate(auto.getBounds(_root).xMax, auto.getBounds(_root).yMin);
RB=new Coordinate(auto.getBounds(_root).xMax, auto.getBounds(_root).yMax);

//Koordinaten in einen Array aufnehmen
vTArray=[LB, LT, RT, RB];
//hitBox-Instanziieren
autoHB=new hitBox(_root.auto, vTArray);


//Das ganze nochmal fuer zweite hitBox
LB2=new Coordinate(baum.getBounds(_root).xMin, baum.getBounds(_root).yMax);
LT2=new Coordinate(baum.getBounds(_root).xMin, baum.getBounds(_root).yMin);
RT2=new Coordinate(baum.getBounds(_root).xMax, baum.getBounds(_root).yMin);
RB2=new Coordinate(baum.getBounds(_root).xMax, baum.getBounds(_root).yMax);
vTArray2=[LB2, LT2, RT2, RB2];
baumHB=new hitBox(_root.baum, vTArray2);

//Auto&Baum-Idee by Carsten Mueller ;)



   MC (für hitTest-Schleife)
ActionScript:
1
2
3
4
5
6
7
8
onClipEvent(enterFrame)
{
   this._rotation++;
   if(_root.autoHB.extHitTest(_root.baumHB).hits==true)
   {
      trace("HitBoxen überschneiden sich");
   }
}


Geändert von MoD am 16.11.04 um 16:49 Uhr

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2021 Sebastian Wichmann - Flashhilfe.de