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

07.03.2010, 17:00

2d kollisionserkennung

hallo,
ich hab ein kleines Problem in meine 2D Jump&Run. Ich habe eine Spielfigur, mit den Eigenschaften x, y, width, height, Speed, VerticalSpeed und InAir. Jetzt möchte ich überprüfen ob die Figur auf einem Objekt steht, wenn ja, dann soll VerticalSpeed auf 0, damit er oben stehen bleibt und nicht durchfällt. Das sieht im Moment so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void CPlayer::CheckCollision(CObject* pObject)
{
    int ox, oy, owidth, oheight;
    pObject->GetPosition(&ox, &oy);
    pObject->GetSize(&owidth, &oheight);

    //Top

    if(y+height > oy)
    {
        if(x+width > ox && x < ox+owidth)
        {
            InAir = false;
            VerticalSpeed = 0;
            y = oy-height;
        }
    }
    
}


Das Problem ist jetzt, dass wenn ich auf einem Objekt stehe, und runter laufe, ich auf Höhe des Objekts bleibe, anstatt zu fallen.
Ach ja, so bewegt sich der Spieler:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CPlayer::ProcessInput(CKeyboard* pKeyboard, double pSecondsPassed)
{
    if(pKeyboard->IsDown(DIK_LEFT)) x-=Speed;
    if(pKeyboard->IsDown(DIK_RIGHT)) x+=Speed;
    if(pKeyboard->IsDown(DIK_SPACE) && !InAir)
    {
        InAir = true;
        VerticalSpeed = -15;
    }
    if(InAir)
    {
        y += static_cast<int>(VerticalSpeed);
        VerticalSpeed += 20*pSecondsPassed;
    }
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

07.03.2010, 17:11

du musst in jedem frame etwas zum VerticalSpeed hinzurechnen.
eine art schwerkraft. das hast du ja im grunde schon.
deine "InAir" variable verhindert das. denkt dir ne alternative dafür aus.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

3

07.03.2010, 17:51

Aah ich hasse solche Variablennamen XD.


Und um ehrlich zu sein verstehe ich dein Problem nicht.
"Ich bleibe auf Höhe des Objekts stehen" - will man das nicht bei der Kollision oben erreichen? Du sagtest doch vorher, du möchtest NICHT fallen, funktioniert doch dann alles?
WIP Website: kevinheese.de

4

07.03.2010, 19:29

ja schon, aber ich habe gesagt, wenn ich von Objekt runterlaufe, bleibe ich auf höhe, dass heißst, ich stehe eigentlich nicht mehr auf dem objekt. Macht aber auch nichts, ich hab das problem nämlich gelöst, musste die reihenfolge der funktionsaufrufe ein bisschen ändern.

Werbeanzeige