A7 - Sprite-Kollision

Posted By: garv3

A7 - Sprite-Kollision - 08/19/10 15:21

Hallo zusammen,

ich habe ein paar Probleme mit Sprite-Kollisionen.
Die Sprites sind beide parallel zur Kamera ausgerichtet.
Sie werden per c_move(... USE_POLYGON | IGNORE_PASSABLE | ACTIVATE_PUSH) nach links oder rechts bewegt.
Zum Einen funktioniert die Kollisionserkennung nicht wirklich Pixelgenau. Ich hätte gerne, dass transparente Pixel ignoriert werden und bei Berührung zweier sichtbarer Pixel das Kollisionsevent aktiviert wird.

Ein weiteres Problem ist das 'Überrennen'. Beide Entities haben das POLYGON Flag aktiviert.
Die eine Sprite-Entity ist der Spieler.
Die zweite ein Gegner.
Angenommen, sie Bewegen sich beider nach rechts, dann holt der Spieler irgendwann den Gegner ein. Doch das Kollisionsevent wird erst getriggert, wenn der Spieler halb durch den Gegner durchgelaufen ist.
Läuft der Gegner in Richtung des Spielers, wird das Event wesentlich früher ausgelöst, wenn auch nicht sofort bei der ersten sichtbaren Berührung.
Beide Entities bewegen sich mit den selben Modi per c_move.
Die Spieler-Entity enthält kein Event, die Gegner-Entity enthält das auszuführende Event. Der push Wert beider Entities wurde nicht geändert.
Eigentlich werden die Events doch bei beiden Entities ausgelöst, unabhängig davon, welche nun mit der anderen kollidiert, oder? Ich habe auch schon EVENT_IMPACT probiert.
ACTIVATE_PUSH wird in der c_move-Anweisung immer benutzt. Das ENABLE_PUSH und EVENT_PUSH werden in der Aktion bzw. dem Event des Gegner berücksichtigt!

Hat jemand eine Idee?

Dank und Gruß
derGarv
Posted By: jane

Re: A7 - Sprite-Kollision - 08/19/10 16:08

Sprites haben meines Wissens nach nur einen, für die Kollisionserkennung
nutzbaren Mittelpunkt. Versuch doch mal bei der c-move |USE_Box statt
|POLYGON zu verwenden. Dadurch sollte eine verwertbare Kollisionshülle um
die Sprites generiert werden. Wenn die Größe noch nicht stimmt, dann die
Kollisionshülle per script manuell anpassen (zu finden im Handbuch
unter Kollision & Umgebung, unter dem Punkt Hüllengrösse).
Posted By: Damocles_

Re: A7 - Sprite-Kollision - 08/19/10 16:34

Its ja auch keine dedizierte 2d Engine,
also pixelgenaue Kollisionsprüfung wäre da auch nicht
unbedingt zu erwarten.

Du könntest unsichtbare Kollisionsmodelle erstellen, die
ungefähr die Form der Figur im sprite abbilden.
Oder Du nimmst unsichtbare "subsprites" um die Kollisionshülle aus kleineren rechtecken aufzubauen.

Oder Du mußt dir halt eine eigene Kollisionsfunktion
schreiben (mittels arrays, die die transparenten beraich beschreiben.)
Posted By: garv3

Re: A7 - Sprite-Kollision - 08/19/10 16:58

Oh, das ist wirklich schade!
Ich würde sehr gern eine pixelgenaue Kollision realisieren.
Ich habe nun mal versucht, über my.min_x usw. die Hüllen anzupassen. Wenn ich sie mir zeichnen Lasse:
vec_set(vMin,my.x); vec_add(vMin,my.min_x); vec_set(vMax,my.x); vec_add(vMax,my.max_x); draw_box3d(vMin,vMax,vector(0,0,255),100);
dann werden die Hüllen entsprechend der Änderungen angezeigt. Die Kollisionen werden allerdings entsprechend der ursprünglichen hüllen ausgelöst. Wie kann ich denn die Kollisionshülle entsprechend der manuellen Werte aktualisieren?

Dank und Gruß
derGarv
Posted By: garv3

Re: A7 - Sprite-Kollision - 08/19/10 17:08

Ich plane momentan, die Methode mit unsichtbaren Kollisionsmodellen zu verfolgen.
Ich habe also einige Blocks im Level platziert. Allerdings scheinen diese bei c_move mit IGNORE_PASSABLE ignoriert zu werden. Sie sind aber laut WED nicht passable, sondern nur invisible!
Posted By: Sajeth

Re: A7 - Sprite-Kollision - 08/20/10 14:09

Invisible wird zu passable, versuchs indem du die Textur auf NONE stellst.
Ich denke, für Hüllenänderungen musst du c_updatehull verwenden.
Posted By: garv3

Re: A7 - Sprite-Kollision - 08/20/10 14:55

Das None-Flag bei der Textur erfüllt seinen Zweck. Super!

Allerdings funktioniert die Kollision noch nicht. Mit c_updatehull kann man die Kollisionshülle nur den Ausmaßen eines bestimmten Frames anpassen. Laut Doku müsste es rechen, die min_x... Werte anzupassen.
Wenn ich mir die Kollisionshülle mit
Code:
vec_set(vMin,my.x); vec_add(vMin,my.min_x); vec_set(vMax,my.x); vec_add(vMax,my.max_x); draw_box3d(vMin,vMax,vector(0,0,255),100);

anzeigen lasse, werden sie wie oben erwähnt ja auch korrekt angezeigt aber das Kollisionsevent wird früher ausgelöst. Hier mal ein Screenshot:

Die Kollision zwischen dem Ball und dem Pilz rechts neben ihm wurde in diesem Frame ausgelöst!

Ich komme nicht weiter... Hat jemand noch einen Lösungsvorschlag?
Danke!!!

derGarv
Posted By: Sajeth

Re: A7 - Sprite-Kollision - 08/20/10 15:43

unsichtbare 3d-Modelle für kollision, bewegung usw und die panels nur auf die jeweilige position setzen.
Posted By: garv3

Re: A7 - Sprite-Kollision - 08/20/10 15:45

Das wäre natürlich ein Workaround. Aber sehr umständlich!
Posted By: jane

Re: A7 - Sprite-Kollision - 08/20/10 22:48

Warum baust Du die Figuren nicht als flache Modelle und texturierst nur die
Front. Wenn die weiteren Figuren-Formen nicht wesentlich komplexer werden
sollte das eine Arbeit von zehn Minuten sein. Diese Modelle haben dann auf
jeden Fall eine 100%ige Polygonerkennung und Event-Auslösung.

etwa so:


Posted By: garv3

Re: A7 - Sprite-Kollision - 08/21/10 12:58

Im Grunde richtig. Hab ich auch schon drüber nachgedacht. Aber sie sind dann entweder verhältnismäßig eckig oder ziemlich highpoly... Hmm...
Außerdem sind sie animiert, was den Aufwand des Modellierens erhöht!
Posted By: jane

Re: A7 - Sprite-Kollision - 08/21/10 16:41

Im Prinzip reicht die grobe grundform, die verschiedenen
Animations-Sprites legst Du dann als TGA mit Alphakanal
als Texturn nacheinander in das Modell und rufst diese
je nach bedarf ab. Da reicht ein Low-Poly-Modell, da
die transparenten bereiche der TGA nicht dargestellt
werden, die Polygon-Hülle aber trotzdem erkannt wird.
© 2024 lite-C Forums