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

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

1

27.02.2011, 01:05

2D - Kollisionsabfrage? >.<

hi @ all,

ich weiß, diese Frage ist vielleicht ein wenig dumm, da ich das Thema eig. schon bei meinem Pong Clone hatte, aber irgendwie will das ganze nicht so funktionieren, wie ich will.
Hier erstmal das, was ich vor habe:

Man soll einfach ein Viereck bewegen in dem Fenster bewegen können... bei den Koordinaten x=100, y=200 ist ein anderes Viereck ... dafür wollte ich eine Kollisionsabfrage erstellen, aber mir kommt einfach keine Idee, wie ich das machen kann...

Beim Pong war es ja einfach, da nicht jede Seite des Vierecks blocken musste, aber jetzt schon, deswegen weiß ich nicht, wie ich das ganze machen soll =(


Ich hoffe, dass ihr mir helfen könnt.



MfG Jawaiica'
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

27.02.2011, 01:13

Also wenn du jeweils 2 nicht gedrehte Vierecke hast, dann ist das ganz einfach indem du schaust ob die absolute Differenz der x, respektive y Koordinaten der beiden Vierecke jeweils kleiner ist als die Summe der Breiten/Längen.

Hier ist das z.B beschrieben:
http://www.flashmove.com/forum/showthread.php?t=15513

Ansonsten würde ich zu Polygon Kollisionserkennung greifen:
http://www.codeproject.com/KB/GDI-plus/PolygonCollision.aspx
http://wiki.delphigl.com/index.php/Tutor…isionserkennung
http://www.gamedev.net/page/resources/_/…-detection-r736

sind ein paar Beispiele.

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

3

27.02.2011, 01:42

Ok, ich glaub das liegt jetzt an der Uhrzeit aber was soll ich jetzt vergleichen?!^^
Achso und es handelt sich um nicht gedrehte Vierecke also sollte es ja "einfach" sein.
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

27.02.2011, 01:59

Achso und es handelt sich um nicht gedrehte Vierecke also sollte es ja "einfach" sein.

Dann ist es sogar sehr einfach. Die kollidieren genau dann wenn sowohl für x als auch für y die kleinere Koordinate des Ersten hinter der größeren Koordinate des Zweiten und die größere Koordinate des Ersten vor der kleineren Koordinate des Zweiten liegt. Mals dir einfach mal auf und denks dir durch, dann wirst du sehen dass das so sein muss ;)

Ich hoff nur ich bin noch nicht so müde dass ich grad was verdreht hab...

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

5

27.02.2011, 02:12

Das mit dem Aufzeichnen habe ich gemacht, nur ich wusste nicht, wie ich das in den Code bringen soll... ich kann ja nicht für jede Bedingung eine if-Abfrage machen oder? Und wenn ich die in eine if-Abfrage bringe, dann weiß ich nicht, wie ich das mit der Position des beweglichen Vierecks machen soll...

Ich hatte das auch schon so versucht, indem ich die Seiten benannt habe mit z.B. ObenA UntenA etc. und ObenB UntenB etc. ( soweit war ich schon einmal aber ich kam nicht weiter ). Aber irgendwie hab ich das dann mit der if-Abfrage nicht hinbekommen...
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

27.02.2011, 02:14

[...] ich kann ja nicht für jede Bedingung eine if-Abfrage machen oder?

Warum nicht!? Was genau hast du für ein Problem mit dem "beweglichen Viereck"!?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

27.02.2011, 02:25

Schau dir doch einfach mal den ersten Link an. Das ist genau diese Technik. Oder zumindest so ähnlich, wie sie dot meint.

Ich persönlich finde noch die Variante mit den addierten Längen/Breiten elegant.

Nimm einfach mal 2 vierecke (z.B 2 Bücher). Du wirst feststellen, dass im Falle einer Kollision die Differenz der beiden "gegenüber liegenden" Seiten jeweils kleiner ist als die Summe der beiden Breiten (resp. Längen). Nur genau dann, wenn das für x und y der Fall ist, dann findet eine Kollision statt ansonsten nicht.

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

8

27.02.2011, 02:28

Also ich habe das mit einer Bedingung gemacht und da wurde das Viereck auf einer ganzen Achse geblockt, dann hab ich das mit zwei Bedingungen gemacht und da hab ich so eine art Glaskasten gebaut, wo das Viereck sich bewegen konnte, aber halt nicht raus kam... ich weiß nicht, ich glaub ich denk zu kompliziert oder keine Ahnung, aber ich kann das einfach nicht umsetzen...

ich hab das so in der Art gemacht:

ObenA = yRect1
UntenA = yRect1 + hRect1
RechtsA = xRect1 + wRect1
LinksA = xRect1

und das selbe halt für das andere Viereck, dann habe ich das so verglichen ( weiß nicht, ob das jetzt richtig rum war mit >= oder <= ) :

if( ObenA <= UntenB )
{
yRect1 = yRect2 - hRect1; // so oder so ähnlich, weiß ich auch grade nicht ganz genau ^^
}

Aber das kann ich doch nicht für jede Seite machen... Hast du vielleicht einen kleinen Beispielcode für mich da, weil so komm ich glaub ich net weiter =(
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

27.02.2011, 02:37

Nimm einfach mal 2 vierecke (z.B 2 Bücher). Du wirst feststellen, dass im Falle einer Kollision die Differenz der beiden "gegenüber liegenden" Seiten jeweils kleiner ist als die Summe der beiden Breiten (resp. Längen).

Gut so kann mans auch machen, die selbe Überlegung anders aufgeschrieben :P

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

10

27.02.2011, 02:43

Aber wie bringe ich das in eine if-Abfrage? Muss ich dann nicht vier If-Abfragen machen, in denen jedesmal die neue Position des beweglichen Viereck erstellt wird, wenn es gegen eine Seite kommt ( also damit es geblockt wird ).
Aus deinem ersten Link werde ich leider nicht schlau =(
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Werbeanzeige