Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

1

28.07.2008, 11:53

2D Kollision von Objecten?

Huhu,

Nun also es geht um die Kollision in 2D. Vorhanden sind zwei Sprites jedes von ihnen wird durch einen Ortsvector beschrieben. Nun will ich testen wann die Sprites sich berühren. Jedoch reicht es da ja nicht die beiden OrtsVectoren zu vergleichen, denn es soll ja das Gesamte Sprite getestet werden. Meine Frage ist nun wie kann ich testen ob sich die Beiden Sprites Berühren? Spontan würde mir da Bounding Circle einfallen, jedoch hab ich keine Ahnung wie ich das Verfahren auf mein Problem anwende oder das ganze Funktioniert.. (HGE Engine liegt zur Grundlage);


MFG Toa

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

28.07.2008, 11:58

Du könntest das in zwei Stufen machen. Erst testest du welche Objekte theoretisch kollidieren würden, z.B. per Kollisionsrechteck. Danach kannst du dann die gefundenen Kandidaten pixelgenau testen.
@D13_Dreinig

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

3

28.07.2008, 12:24

Frage: Die Sprites befinden sich irgendwo auf dem Screen und ich hab nur den Ortsvector aber um ein Rechteck darauf zu bekommen brauch ich die obere linke Ecke und untere Rechte .. wie bekomm ich die?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

28.07.2008, 12:28

Weiß ich nicht. Ich kenn schließlich die Technik nicht die du verwendest. Aber mal geraten: Das Sprite sollte ja noch einige weitere Eigenschaften besitzen (Breite, Höhe, Rotation, ...) außerdem hast du ja einen festen Punkt im Sprite.
@D13_Dreinig

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

5

28.07.2008, 12:29

Naja ich geh mal die Funktionen der Sprites durch mal schaun ob sich was findet danke . . . Hge ist irgendwie nicht so doll..

6

28.07.2008, 13:48

Sind denn beide Sprites parallel zur Karte angeordnet, also ist keines gedreht? Falls nicht, kann man wie gesagt eine einfache Rechteckskollisionsabfrage durchführen, ansonsten wirds ziemlich kompliziert...

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

7

28.07.2008, 13:58

Ne die sind gedreht .. also Rotation ist im Spiel

C-/C++-Quelltext

1
2
3
4
5
6
7
if(m_pHge->Input_GetKeyState(m_ilinks))fRotation -=0.01f;
    if(m_pHge->Input_GetKeyState(m_irechts))fRotation += 0.01f;
    if(m_pHge->Input_GetKeyState(m_ioben))vPos += vDir*speed; 
    if(m_pHge->Input_GetKeyState(m_iunten)) vPos -= vDir*speed;

    vDir.x = cosf(fRotation-3.1415); 
    vDir.y = sinf(fRotation-3.1415);

8

28.07.2008, 14:33

ich würde Bounding-Circles empfehlen, die reichen eig. fürs erste. (und sind recht schnell)
wenn das nicht genau genug ist, kannst du danach ja immer noch pixelgenau testen.

Pseudocode für Bounding-Circles:

Quellcode

1
2
3
4
5
6
RadiusObjekt1=1/2* sqrt(Objekt1.Höhe*Objekt1.Höhe+Objekt1.Breite*Objekt1.Breite)

RadiusObjekt2=1/2* sqrt(Objekt2.Höhe*Objekt2.Höhe+Objekt2.Breite*Objekt2.Breite)

Wenn Länge(Objekt1.Position-Objekt2.Position) < RadiusObjekt1+Radius
Kollision

9

28.07.2008, 15:03

Wobei es hierbei effizienter ist, die Quadrate zu vergleichen (sqrt() ist relativ langsam).

10

28.07.2008, 15:03

Um die Wurzel zu sparen, kann auch mit den Quadraten der Abstaende gerechnet werden.

Werbeanzeige