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

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

1

24.05.2007, 16:10

Frage zu Kollisionsabfrage

Ich bin gerade dabei, einen kleinen Mario-Klon zu machen.

Das Level wird schon per XML eingelesen und ausgegeben.
Das Männchen kann sich bewegen, aber noch nicht springen.

Jetzt bin ich bei der Kollisionsabfrage, denn das Männchen soll natürlich nicht durch alle Tiles durchlaufen können.

Jetzt hab ich das volgender Maßen gelöst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    if(g_pLevel->getTileAt(m_fXPos, m_fYPos+33)->canStepOn() == false || g_pLevel->getTileAt(m_fXPos+32, m_fYPos+33)->canStepOn() == false)
    {
        m_canGoDown = false;

        int up = (m_fYPos+32) - g_pLevel->getTileAt(m_fXPos, m_fYPos+33)->getSprite()->getRect().y;
        moveUp(up);
    }
    else
        m_canGoDown = true;

    //Oben

    if(g_pLevel->getTileAt(m_fXPos, m_fYPos-1)->canStepOn() == false || g_pLevel->getTileAt(m_fXPos+32, m_fYPos-1)->canStepOn() == false)
    {
        m_canGoUp = false;
        int down = (m_fYPos-1) - ((g_pLevel->getTileAt(m_fXPos, m_fYPos-1)->getSprite()->getRect().y) + (g_pLevel->getTileAt(m_fXPos, m_fYPos-1)->getSprite()->getRect().h));
        moveDown(down);
    }
    else
        m_canGoUp = true;

Ich prüfe hier, ob das untere oder obere Tile des Players ein unbegehbares ist und wenn ja, dann lasse ich ihn einfach nichtmehr weiterlaufen. Da man pro Durchlauf leider mehr als einen Pixel zurück legt, muss ich natürlich auch darauf reagieren, weenn der Spieler tatsächlich _in_ einem nichtbegehbaren Tile steht. Mache ich ja auch.

Jetzt ist aber das Problem, dass, wenn ich mit dem Männchen seitlich an ein unbegehbares Tile ran gehe, ich einfach (je nach Ecke) nach oben oder unten versetzt werde.

Und genau das ist mein Problem. Ich weiß wirklich nicht, wie ich das lösen soll, da ich die hoch- und runter-Setz Anweisungen ja eigentlich auch brauche.

Ich hoffe einfach mal, dass irgendjemand was parat weiß.


MfG

2

24.05.2007, 19:20

Eine Lösung wäre: Erst die X kollision testen, dann die y Kollision.
D.h. du hast ja wahrshcienlich einen Bewegungsvektor. Erst benutzt du davon nur die X Koordinate, prüfst auf Kollision und setzt den Spieler entsprechend nach links oder rechts. Dann kommt die Y Koordinate. Da genau das gleiche. Damit sollte das Problem behoben sein.

Könnte aber durchaus noch bessere Methoden geben, aber für einen Marioclon wird das wohl kaum ins Gewicht fallen.
Lieber dumm fragen, als dumm bleiben!

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

3

24.05.2007, 19:35

Bewegungsvektor? - Ne^^

Aber ich probier einfach mal den Rest des Posts aus ;)


EDIT: Ok, das geht nicht wirklich, da ich ja bis jetzt eigentlich nur die Y-Koordinate prüfe.

4

25.05.2007, 16:38

Ja, du musst shcon auch X prüfen. Sonst kannst du ja durch jede Wand durchlaufen...
Lieber dumm fragen, als dumm bleiben!

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

5

25.05.2007, 17:06

Nein. Sobald ich irgendwie mir der Linken oberen Ecke in ein unbegehbares Tile hineinlaufe, werde ich direkt nach unten gesetzt.
Es würde natülich nichts ändern, wenn ich unterhalb noch die X-Achse prüfen würde, da ja alles schon von diesen 2 Abfragen abgefangen wird.

Bei Bedarf kann ich auch ein Beispiel des Programms hochladen, obwohl es im Mom. nur aus der Entwicklungsumgebung gestartet werden kann.

Werbeanzeige