Womit macht ihr die Kollisionserkennung?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Womit macht ihr die Kollisionserkennung?

Beitrag von Drago »

Ich programmiere seit Anfang des Jahres mit PB unter anderem an dem Spiel Dragonoid,n einem Asteroidremake. Jetzt frage ich mich, wie ihr die Kollsionserkennung programmiert. Habe viel gelesen (oft nur die Hälfte verstanden... :-)) und bin mir jetzt etwas unsicher, da ja bekanntlich viele Wege nach Rom führen.
Die genaueste Prüfung wäre ja eine Pixel-Pixel Kollisionserkennung. Diese gibt es ja in PB nur für 2D Sprites. Eine Routine für 3D Sprites gibt es nicht (korrigiert mich, wenn ich falsch liege..) und da ich
kein C kann, kommt das für mich sowieso nicht in Frage.So, jetzt zu meinem eigentlichen Anliegen....
In meinem Spiel benutze ich, inspiriert durch verschiedene Informationen, eine normale BoundingBox-Kollisionserkennung z.B. für mein Raumschiff. Da nun mein Raumschiff nicht quadratisch,praktisch und gut ist, sondern Ecken und Kanten hat, brauche ich mehrere Kollisionspunkte an meinem Spriteobjekt. In meinem Programm habe ich die Daten aller Kollisionspunkte für das Raumschiff in einen Datablock gepackt.Per Hand....Heul...(Schweißarbeit..)
Nun bin ich einen Shapegenerator am Proggen, worin man das zu prüfende Sprite laden kann und soviele Kollisionspunkte anbringen kann, wie man eben möchte. Die Daten sollen nacher in einer (.pref) Datei hinterlegt werden. Diese Kollisionsdaten soll man dann später für jedes zu prüfende Objekt im Spiel laden können und kann dann die Objekte anhand der vorliegenden Daten einfach auf Kollision prüfen.Ach ja, diese Routine funktioniert auch bei gedrehten und gezoomten Sprites, darüber braucht man sich keine Gedanken machen, da die Kollisionspunkte automatisch an das gezoomte und/oder gedrehte Sprite angepasst werden.
Nun zu meiner Fragen:
A.) Gibt es so etwas eventuell schon?
B.) Was haltet ihr von der Idee
C.) Oder gibet schon was besseres?

Hier mal ein vorläufiger Screenshot:
Bild

Lg Klaus
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: Womit macht ihr die Kollisionserkennung?

Beitrag von gnasen »

sowas habe ich vor einiger zeit mal geschrieben:
http://www.purebasic.fr/german/viewtopi ... =kollision
Du kannst aus einem Sprite ein Kollisionsobjekt erstellen (siehe Beispiel example_auto.pb). Diese Objekte können dann einfach auf die Position des Sprites verschoben und rotiert werden. Mir fällt auf, es fehlt noch das zoomen, aber das könnte ich heute vllt noch nachliefen. (wenn sich dieser dreckige Kater mal davon machen würde.... :D )
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Womit macht ihr die Kollisionserkennung?

Beitrag von STARGÅTE »

Kollisionspunkte (in Form von Kreisen) auf ein Sprite zu legen ist keine schlechte Idee...
Jedoch bei ehr kantigen Schiffen ehr ungeeignet.
Klar sieht dein Schiff aus wie ein Schneemann, ideal ^^

Spaß bei Seite. Ich verwende - ähnlich wie gnasen vorgeschlagen - für solche Spiele auch eine Polygon Kollision.
Bild

zB wie hier im Bild zu sehen, erstelle ich für ein Raumschiffstypen ein Schild-Polygon.
Im Screenshot mal durch graue Linien angedeutet (die sind im echten Spiel natürlich nciht da).
Auch hier können die Polygone sich der Orientierung des Sprites3D anpassen...

Allerdings prüfe ich nur diese genaue Kollision nur wenn sich Objekte wirklich berühren könnten,
dass heißt jedes Objekt wird erst mal auf Abstand getestet, und erst bei unterschreitung wird die geneue Kollision angeschmissen.
____

Ich könnte mir aber vorstellen das eine Kollision mit Kreis-Sammlungen durch aus an einigen Stellen schneller sein könnte.
In meinem Fall würden ja auch 4 Kreise reichen: Rumpf, 2 Flügen, Front.

Wäre gut wenn du daran weiter arbeitest und uns dann deine Erfahrung mitteilst.
Tip: Falls du es nicht sowieso schon machst, nutze bei Kreiskollision bitte kein "Wurzelziehen" sonden nutze die Quadratischen Radien:
Sqr(x*x+y*y) < r
->
x*x+y*y < R ; mit R = r*r
Das ist sehr viel schneller, worauf es ja ankommt wenn man es sehr oft macht :allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: Womit macht ihr die Kollisionserkennung?

Beitrag von Drago »

Ersteinmal vielen Dank für euere Antworten.
@Gnasen:
Hui, habe mir mal deine Version mit den Polygonen angeschaut. Nun muß ich zugeben, das ich
a.) "erst" seit einem dreiviertel Jahr programmiere und vorher nur aus der Jugend etwas mit Basic zu tun hatte (Commodore C64..,lang,lang ist es her :-))
b.) deinen Routine schon sehr komplex ist
c.) meine Mathekenntnisse über den Hausgebrauch nicht unbedingt rausragen
und ich dadurch nicht wirklich durchblicke, was du da machst. Schade eigentlich...

Aber sieht gut aus und funktioniert einwandfrei...

@Stargate:

Werde an dem Projekt weiterarbeiten....
Mit dem Schneemann, da gebe ich dir nicht ganz Recht, denn es liegt ja nur daran, wieviele Kollisionspunkte ich anlege. Oder liege ich da falsch? Anderseits denke ich mir, das die Polygonprüfung genauer ist, zumal besser geeignet für Jump&Run Spiele.
Danke für deinen Tipp mit dem Wurzelziehen, aber wie gesagt, meine Mathekenntnisse sind nicht sonderlich, ich nutze ein Macro aus dem Forum hier. Dort wird nix gezogen...lach (Glaube es ist von Kaeru Gaman odda so)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Womit macht ihr die Kollisionserkennung?

Beitrag von STARGÅTE »

Mit dem Schneemann, da gebe ich dir nicht ganz Recht, denn es liegt ja nur daran, wieviele Kollisionspunkte ich anlege. Oder liege ich da falsch?
Nein ist richtig!, Klar kannst du ein Raumschiff jeder Art fast genau durch Kreise rekonstruieren, jedoch brauchst du u.u. sehr viele um zB gerades Stücke mit vielen Kreisen zu stückeln ...

Es kommt immer auf die Form an.
Wenn ich zB n Planeten habe, nutze ich ja kein Polygon mit 360 Ecke (mal übertrieben) sonden nur ein Kreis.
Habe ich zB eine Art Rakete, nutze ich lieber ein Polygon (Spitzes Dreieck oder Rechteck), da ich mit Kreisen vermutlich mehrere brauche, damit ich nicht zu viel und nicht zu wenig abdecke ...

Es gibt immer vor und Nachteile ...

Interessant wird es, wenn du Ellipsenkollision benutzt oder gar Bézierkurve.
Allerdings sind die Berechnungen dafür "utopisch", das ist es Meiner Meinung nach dann nicht Wert.
Dann lieber mal n Schuss abbekommen der eigentlich knapp am Raumschiff vorbei ging.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Re: Womit macht ihr die Kollisionserkennung?

Beitrag von mpz »

Hi Drago,

alternativ kannst Du Dir meine MP3D Engine für Purebasic anschauen. Hier gibt es auch Pixel Pixel Prüfung für drehende 3D Sprites. Ein Spiel mit drehende Sprites liegt als Sourcecode bei. Nachteil nur DX9 und damit Windows und kein Open Source sondern eine fertige PB_lib mit 300 Befehlen

Beispiel für drehende Sprites mit Parent Kid Beziehung
Bild

Link zum MP3D
http://forums.purebasic.com/german/view ... 10&t=21483

Gruß Michael
Working on :lol: - LibSGD - MP3D Engine - 8)
Antworten