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

Geheim

Treue Seele

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

11

01.06.2012, 16:33

So das ist eine Möglichkeit es zu prüfen: Man übergibt die Werte 2er Objekte als Parameter und erhält dann true wenn es kollidiert und false wenn es nicht kollidiert. Wenn die rechts Seite vom ersten Objekt kleiner ist als die Linke Seite des zwieten Objekts und Die Linke Seite vom ersten größer ist als die rechte Seite vom zweiten und Oben1 kleiner ist als Unten2 und Oben2 kleiner ist als Unten1, dann kollidiert es ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
bool Klasse::Collision(float xPos1, float yPos1, float width1, float height1, 
                            float xPos2, float yPos2, float width2, float height2)
{
    //Gibt true zurück, wenn das erste Objekt mit dem zweiten Objekt kollidiert
    return (xPos1 < xPos2 + width2  && xPos2 < xPos1 + width1  &&
            yPos1 < yPos2 + height2 && yPos2 < yPos1 + height1);
}

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

12

02.06.2012, 20:11

Ich denke ich muss diesen Thread nochmal wiederbeleben ^^

Also die Funktion funktioniert klasse, danke dafür! Jetzt wollte ich einen Schritt weiter gehen und habe eine Klasse für meine Objekte geschrieben, mit denen der Spieler kollidieren kann. Ich habe mich nämlich gefragt, wie es aussieht, wenn man nun ganz viele Sprites hat. Es würde sehr schnell unübersichtlich werden, wenn man für jedes einzelne Sprite eine eigene while() Schleife schreiben würde. Daher die Klasse. Nun habe ich eine Funktion geschrieben, mit der ich einem Klassenobjekt X und Y Pos. zuordnen kann. klappt auch wunderbar. Nur ist jetzt mein Problem, dass ich nicht weiß, wie ich die Kollision von einer 'Klasse' machen soll. Sprich: Ich habe 5 Wände auf meiner map. Jede leitet sich aus der Klasse Wand ab und jede Wand hat andere Koordinaten.

Wie sieht meine Kollisionsabfrage dann aus?

C-/C++-Quelltext

1
2
3
4
while (Collision (playerX, playerY, 32, 32, wall01.getPosition().x, wall01.getPosition().y, 16, 16))
        {
            playerX += 1*windowElapsed;
        }


so kann ich es ja nicht machen, weil ich ja dann nur die xPos und yPos der wall01 bekäme, aber ich will ja überprüfen, ob generell der Spieler mit einem Objekt der Klasse Wand kollidiert.

Ich hoffe meine Fragestellung ist halbwegs klar geworden ^^
Gruß,
Luca

FreezingEngine

Treue Seele

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

13

02.06.2012, 23:04

Ich hätt direkt auchmal ne Frage wenn wir schon bei dem Thema Kollision sind:

Ich mache ein Topdown-shooter in 2D und es sollen auch gebäude da sein in die man reingehen kann.
Wie soll ich eine kollisionserkennung mit jeder Wand realisieren?
Vorallem wird es nicht nur 1 gebäude geben und schüsse dürfen auch nicht durch die Wände fliegen.

Wäre dankbar für jeden tipp!!

MfG Marcel
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Geheim

Treue Seele

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

14

03.06.2012, 02:11

@Luca:
Benutz doch einen std::vector oder eine std::list, wo dann alle deine Wände drinnen sind? Dann brauchst du nur alle Wände in einer Schleife auf eine Kollision prüfen...

@FreezingEngine:
Dito :)

15

03.06.2012, 13:48

std::vector reicht vollkommen, die Vorzüge der std::list wird man nicht benötigen. :thumbup:

MfG
Check

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

16

04.06.2012, 19:24

Okay, habe gerade mal einen Vector geschrieben (danke für den Tipp). Ich möchte am Anfang 3 Instanzen einer Klasse erzeugen, das mache ich in dem ich den Vector 3 mal durchlaufe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    for(int i=0; i<3; ++i)
    {
        // Neues Objekt erstellen
        cCoin Coin;
        Coin.setPos((i+1)*100; (i+1)*100);

        // Neues Objekt ans Ende der Kette setzen
        v.push_back(Coin);
        ++v[i];
    }


Die cCoin Klasse hat unter anderem die Funktionen: getPosX(); und getPosY();
Jetzt will ich in der while Schleife, die oben bereits gezeigt wurde, meinen Vector so durchlaufen, dass er jedesmal die X bzw. Y Pos. zurückgibt.

Leider bin ich da etwas überfragt. Zurzeit sieht meine Kollisionsfunktion wenn ich sie aufrufe noch so aus:

C-/C++-Quelltext

1
while (Collision (playerX, playerY, 32, 32, Coin01.getPosX(), Coin01.getPosY(), 16, 16))


Nur möchte ich ja wie gesagt, dass ALLE Insatnzen meiner Klasse cCoin abgefragt werden.

Erst einmal wollte ich jedoch fragen, ob mein grundlegender Denkansatz richtig ist?

Gruß,
Luca

Geheim

Treue Seele

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

17

04.06.2012, 20:34

Hey Luca,

Wenn du einen Iterator hast, kannst du so jede Instanz durchlaufen:

C-/C++-Quelltext

1
2
3
4
for(Iterator=Vektor.begin(); Iterator!=Vektor.end(); ++Iterator)
{
        (*Iterator).Funktion();
}

Werbeanzeige