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

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

1

26.03.2011, 18:37

Kollisionsabfrage klappt nicht

Hallo Leute,
versuche nun schon seit längerem eine Kollision zwischen 2 Objekten zu stande bekommen.
Ich benutze die SFML.
Habe mir überlegt, dass ich 2 Rect's mache, und dann mit Contains arbeite.

Die Mauer ist noch leicht:

C-/C++-Quelltext

1
sf::FloatRect MauerR(300,200,400,230);


aber beim Spieler wird das schon schwerer da er keine Konstanten werte hat:

C-/C++-Quelltext

1
sf::FloatRect SpielerR(Spieler.GetPosition().x,Spieler.GetPosition().y,Spieler.GetPosition().x + Spieler.GetSize().x,Spieler.GetPosition().y + Spieler.GetSize().y);)


bin mir nicht sicher ob das so richtig ist.

Und wenn ja wie mach ich das dann mit Contains??
wäre froh über ne gute Antwort.

Gruß
Devilloper

PS:Beispiel wäre net

2

26.03.2011, 20:05

Was genau willst du erreichen?
Bei zwei Objekten kannst du einfach prüfen ob sich die Seiten schneiden.
Kenne die Syntax deiner Rectklasse nicht, deshalb nenne ich x-Koordinate der rechten Seite einfach mal right und links left

C-/C++-Quelltext

1
2
3
if(MauerR.right >= SpielerR.left)
            //Kollision
// So für die anderen Seiten


Und entscheide dich für eine Sprache, am besten Englisch, dieses Mischmasch kann man ja nicht sehn ;)

MfG

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

3

26.03.2011, 21:09

joa so wollte ich des machen aber des funzt ihrgendwie net


hab des so gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(MauerR.Right <= SpielerR.Left)
        {
            Spieler.SetPosition(0,0);
        }

        if(MauerR.Top >= SpielerR.Bottom)
        {
            Spieler.SetPosition(0,0);
        }

        if(MauerR.Left >= SpielerR.Right)
        {
            Spieler.SetPosition(0,0);
        }

        if(MauerR.Bottom <= SpielerR.Top)
        {
            Spieler.SetPosition(0,0);
        }

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »moritz31« (26.03.2011, 21:14)


4

27.03.2011, 09:36

Ach,stimmt ja da fehlt noch eine Zusatzabfrage :D
Außerdem ist es bei dir falschrum
if(MauerR.Right <= SpielerR.Left)
{
Spieler.SetPosition(0,0);
}
Triift auch zu, wenn sich die Mauer einfach links vom Spieler befindet
Probiers mal so:

C-/C++-Quelltext

1
2
3
4
if(MauerR.Right >= SpielerR.Left && MauerR.left <= SpielerR.right)
        {
            Spieler.SetPosition(0,0);
        }

Sollte stimmen

Vielleicht stellt die SFML(die benutzt du,oder?) aber auch schon Kollisionsabfrage bereit. Schau einfach mal

MfG

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

5

27.03.2011, 12:31

hab es so probiert,
da wurde der Spieler Automatisch an die Position gesetzt
dann hab ich die Zeichen vertauscht

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        if(MauerR.Right <= SpielerR.Left && MauerR.Left >= SpielerR.Right)
        {
            Spieler.SetPosition(0,0);
        }

        if(MauerR.Top >= SpielerR.Bottom && MauerR.Bottom <= SpielerR.Top)
        {
            Spieler.SetPosition(0,0);
        }

        if(MauerR.Left >= SpielerR.Right && MauerR.Right <= SpielerR.Left)
        {
            Spieler.SetPosition(0,0);
        }

        if(MauerR.Bottom <= SpielerR.Top && MauerR.Top >= SpielerR.Bottom)
        {
            Spieler.SetPosition(0,0);
        }


so sah der Quellcode danach aus, jedoch wird er dann einfach übergangen

Was mach ich falsch?

Bitte um hilfe!

6

27.03.2011, 12:40

so sieht der Collisionspart in meinem aktuellen Projekt aus. Ich glaube aber der ist nicht viel anders als bei dir

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
bool CCollision::CheckCollision(D3DXVECTOR2 A,D3DXVECTOR2 B,float RectSize)
        {
             //Calculate the sides of rect A
            leftA = A.x;
            rightA = A.x + RectSize;
            topA = A.y;
            bottomA = A.y + RectSize;
        
            //Calculate the sides of rect B
            leftB = B.x;
            rightB = B.x + RectSize;
            topB = B.y;
            bottomB = B.y + RectSize;

             if( bottomA <= topB )
            {
                return false;
            }
    
            if( topA >= bottomB )
            {
                return false;
            }
    
            if( rightA <= leftB )
            {
                return false;
            }
    
            if( leftA >= rightB )
            {
                return false;
            }
  
            return true;
        }

Wenn eine Kollision gefunden wurde lieferter true zurück
Metal ist keine Musik sondern eine Religion.

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

7

27.03.2011, 12:43

Joa is ähnlich ich glaube jedoch nun das das Problem eher bei den Rects liegt.

Denn wenn ich

C-/C++-Quelltext

1
sf::FloatRect MauerR(Mauer.GetPosition().x,Mauer.GetPosition().y,Mauer.GetPosition().x + Mauer.GetSize().x,Mauer.GetPosition().y + Mauer.GetSize().y);

es so mache, wird die Kollision sofort erkannt egal wann,
und wenn ich es wie oben beschrieben mache erkennt er gar keine.

Hat jemand ne Idee???

8

27.03.2011, 12:44

schreib dir doch einfach eine eigene Funktion(oder kopier den Code von mir^^)
Metal ist keine Musik sondern eine Religion.

9

27.03.2011, 12:49

Du musst die Bedingungen umdrehen
So:

C-/C++-Quelltext

1
MauerR.Right >= SpielerR.Left

Nicht so:

C-/C++-Quelltext

1
MauerR.Right <= SpielerR.Left


Probier mal Fabians Methode die ist übersichtlicher und leichter zu verstehen :D

GameProggD3D

Frischling

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

10

27.03.2011, 12:57

Wenn die Mauer ein Sprite ist, könntest du doch für das Rechteck-Erstellen einfach die Methode "GetSubRect()" benutzen, statt:
sf::FloatRect MauerR(Mauer.GetPosition().x,Mauer.GetPosition().y,Mauer.GetPosition().x + Mauer.GetSize().x,Mauer.GetPosition().y + Mauer.GetSize().y);
Programmiere Zombie-Spiel mit nem Freund

Werbeanzeige