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

1

29.05.2015, 20:09

SFML Kollision

Hallo liebe Spieleprogrammierer

Ich programmiere gerade ein kleines Spiel in der SFML und komme bei der Kollision nicht draus.
Ich will das der Spieler mit einer Wand kollidieren kann und zwar auf allen 4 Seiten.

Habt ihr da Ideen wie ich das abfragen könnte?

Freundlich Grüsst
SlyGamer72HD

ERROR

Alter Hase

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

2

29.05.2015, 20:58

Separating Axis Theorem wäre ein guter Stichpunkt, nach dem du suchen könntest ;)
Ich mochte z.B. diese ziemlich interaktive Seite gerne.1

3

29.05.2015, 21:06

Du kannst Box2d verwenden oder wenn du Custom gehst, so würde ich wenn es simple Kollisionen sein sollen, Rectangles verwenden.
Am Besten du versuchst es erst garnicht dazu kommen, dass ein Objekt in einen Kollsionsbereich kommt.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                                float x = object.x;
                float y = object.y;
                float width = object.getWidth();
                float height = object.getHeight();
            
                float cullLeft = otherObject.x;
                float cullRight = cullLeft + otherObject.width;
                float cullBottom = otherObject.y;
                float cullTop = cullBottom + otherObject.height;
                
                //
                if((x <= cullRight && 
                    y <= cullTop && 
                    (x + width) >= cullLeft && 
                    (y + height) >= cullBottom)) 
                {
                    //is in collsion

                }


So kannst du ganz fix AABB Kollisionen testen von zwei Rectangles.

Am Besten du arbeitest mit einem Geschwindigkeitsvektor, mit dem du deinen Spieler bewegst. So kannst du dann schnell gucken ob er im nächsten Move dich in einer Wand landen lassen wird. Wenn ja, führe die Bewegung nicht aus. Wenn nein, führe Bewegung aus.

Man kann das alles noch optimieren. Dass man die Differenz misst noch dazwischen, um ihn dann direkt an der Wand zu plazieren. Aber das wichtigste ist, dass man es garnicht erst dazu kommen lässt, dass dein Objekt in der Wand landet.

Wenn du schnelle Objekte hast, kannst du den Geschwindigkeitsvektor in Stücke zerteilen und für jedes einzeln vom Spieler aus, prüfen ob eine Kollision statt finden wird. Ansonsten kann es passieren, dass dein Spieler durch eine Wand geht. Bei dünnen Wänden oder schnellen Bewegungen sollte man auf jeden Fall den Geschwindigkeitsvektor zerteilen.

4

29.05.2015, 21:10

Danke viel mals für die Antworten.
Ich werde mir alles mal anschauen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

30.05.2015, 07:09

SFML kennt übrigens auch die Methoden "getGlobalBounds()" und "intersects()". Das ist sicherlich sinnvoller als einen Test selbst zu implementieren.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

30.05.2015, 09:35

Wie würde das ganze den funktionieren mit getGlobalBounds oder intersects() wenn ich jetzt abfragen möchte ob er die linke Seite berührt oder die obere?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

7

30.05.2015, 11:38

Wie würde das ganze den funktionieren mit getGlobalBounds oder intersects() wenn ich jetzt abfragen möchte ob er die linke Seite berührt oder die obere?


Indem du überprüfst aus welcher Richtung die Objekte kommen, oder eher gesagt in welche sie sich bewegen. Grundsätzlich musst du ja nicht jedes Tile mit jedem anderen Tile überprüfen. Du musst einfach nur überprüfen, ob ein Tile in seiner aktuellen Bewegung mit irgendetwas kollidiert.

Du kannst dir ja dann Hilfslinien ziehen mit denen du besser nachvollziehen kannst, welche Richtungen die einzelnen Bewegungen haben. Und dann fällt der Punkt, die "Richtung/Position der Kollision" herauszufinden, auch nicht mehr schwer.
WIP Website: kevinheese.de

ERROR

Alter Hase

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

8

30.05.2015, 11:53

Genau deswegen habe ich die Seite verlinkt. Dort wird die Collision per SAT für die verschiedensten Objekte genau erklärt. Ausserdem kann man auf die Bilder klicken und die ganzen Formen bewegen und so sieht man genau welcher Strich wann und wo kolliediert. Die Seite ist von der Firma, die für das Game "N+" verantwortlich ist.

Den Source Code würde ich mir nicht mal unbedingt runterladen. Dort wird praktisch der Pseudocode in Textform skaliert und mit diesen Erklärungen sollte man dann in der Lage sein schöne Kollisionen zu bauen. Wenn man dann seinen Algorithmus fertig hat, kann man ja immer noch mal vergleichen ;)

Selbstverständlich kann man in seinen Code auch die SFML funktionen einbauen ;)

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

9

30.05.2015, 22:16

Wie würde das ganze den funktionieren mit getGlobalBounds oder intersects() wenn ich jetzt abfragen möchte ob er die linke Seite berührt oder die obere?


http://www.sfml-dev.org/documentation/2.…ssf_1_1Rect.php
http://www.sfml-dev.org/documentation/2.…f_1_1Sprite.php

C-/C++-Quelltext

1
2
3
4
5
6
7
sf::Sprite sprite1 ;
sf::Sprite sprite2 ;

// ...

if ( sprite1.getGlobalBounds ( ).intersects ( sprite2.getGlobalBounds ( ) ) )
    // Kollision


Anschließend würde ich berechnen in welchem Winkel die beiden Mittelpunkte zueinander stehen. Du kannst aber glaube ich auch bool intersects (const Rect< T > &rectangle, Rect< T > &intersection) const ( http://www.sfml-dev.org/documentation/2.…1bb786b31f5836e) benutzen mit der Du herausfinden kannst in wie fern sich beide überschneiden.

10

31.05.2015, 09:42

Danke viel mals für die ganzen Antworten.
Ich werde mir alles mal anschauen.

Werbeanzeige