Also den Vergleich über den Alphakanal zu machen ist grob fahrlässig da man erstens Perfomanceprobleme kriegt, wenn man das z.B. jeden Frame macht mit mehreren Panels und zweitens wirds frickelig, wenn du das Panel skalierst und/oder rotierst.

Eine einfache Möglichkeit bietet sich an zu testen ob sich zwei triangles überlappen. Dann kannst du nämlich die beiden notwendigen triangles der gedrehten und skalierten Boundingbox eines Panels nehmen, die eines anderen Panels nehmen und schnell vergleichen.

Für genauere Kollisionsshapes bieten sich nun folgende Alternativen an:

1.) Ein konvexes polygonales shape
2.) Ein konkaves polygonales shape
3.) Eine pixelgenaue Beschreibung des Kantenzugs des Objektes

Zu 1 und 2: dies ist nur eine Annäherung aber deshalb auch schnell. Das konkave shape muss eventuell trianguliert werden. In beiden Fällen sollte das Shape extern gespecihert und zur Laufzeit geladen werden. Es gibt diverse Algorithmen (papers, ausformuliert, demos, sourcecode), die solche Kollisionen berechnen. Wahrscheinlich ist 1. schneller und einfacher zu realisieren.

Zu 3: Man kann pixelgenau Kantenzüge relativ kostengünstig mithilfe des chain codes speichern, wobei man die Alternativen Manhattan Distanz und Euklid hat. Euklid erlaubt auch diagonale Züge, speichert also wesentlich weniger Daten und erlaubt eine genauere Approximation des Kantenzuges. Man könnte in ein Array dann die chaincodes (eventuell abgebildet, bedingt durch Rotation/Skalierung/Projektion) eintragen. Sobald eine Kollision stattfindet, wird dann ein solcher Pixel mehrfach belegt und schon kannste prima Events triggern.

(Binäre-)Alphamasken zu durchlaufen ist echt schrecklich, da die Betrachtung aller Pixel bei zunehmender Fläche wächst - und zwar quadratisch! Wäh...

Zusätzlich dazu möchte ich anmerken, dass bei der Betrachtung von Kollisionen man evtl. auch darauf achten muss, ob sich ein Objekt bewegt und zwar in diesem und letztem Frame eventuell keine Kollision feuert, "aber auf dem Weg" ein gefeuert hätte (Beispiel: Pistolenkugel durchstößt Wand, weil sich die Kugel zu schnell bewegt).

Last edited by HeelX; 07/22/08 13:29.