Kollision ständig testen



  • Hallo,

    ich möchte gerne ein kleines 2D Jump and run machen. so weit klappt das auch, ich hab nur noch Probleme mit Kollision. bis jetzt hab ich das immer so gemacht:

    bei jeder Tastatureingabe wird getestet ob der Spieler (Ein 10*10 großes Viereck) mit der Umgebung (Alles nur 10*10 große Vierecke) Kollidiert. wen ja, dann wird der Spieler 0,1 von der Seite mit der er kollidiert ist entfernt(entgegengesetzt zur Tastatureingabe). das Problem ist nur, wenn der Spieler nicht durch Tastatureingabe bewegt wird (Schwerkraft oder Beschleunigung) fliegt er natürlich durch.

    Wie könnte ich da ne Funktion schreiben die immer Überprüft ob der Spieler mit irgendwas Kollidiert und ihn dann von der Kollisionsseite der Umgebung wechsetzt?

    bzw. hat zufällig jemand so eine Funktion?^^



  • du speicherst einfach irgendwo, wie weit dein spieler sich pro frame (durch fallen etc.) bewegt und testest anstatt bei den eingaben einfach vor dem rendern allgemein ob es kollisionen gibt. falls es die gibt, bewegste den spieler einfach zurück.



  • Gut aber leider kann sich der spieler dann nicht bewegen wenn er gegen ein Objekt gedrückt wird.
    Dann ist die Kollision immer True und die Bewegung die ich vorher gemacht hab wird zurückgesetzt^^.



  • Du solltest die Bewegung nicht einfach rückgängig machen, sondern an das Hindernis anpassen. Sprich, die Position so einstellen, dass sich die Kante des Spieler-Objekts gerade bündig an der Kante des Hindernisses befindet.

    Wenn ich mich nur einen Meter aufs Mal bewegen kann, 90cm vor einer Wand stehe und auf sie zulaufe, stehe ich anschliessend auch nicht wieder 90cm von der Wand entfernt.



  • ja das könnte man machen aber bei mir bewegt sich der spieler so fein das das keinen unterschied macht.
    Aber trotzdem stehe ich dann immer noch vor dem problem, das wenn die schwerkraft den spieler nach unten drückt, kann er sich nicht bewegen da er ja dann an die Umgebung "angepasst" wird.



  • Ich hatte das Problem schon mal:

    bool ErstesMalKollision; 
    
    X Koords speichern; 
    Y Koords speichern; 
    
    BewegeSpriteNachSchwerkraftEtc.();
    
    BerechneKollision; 
    
    if (Kollision == TRUE) 
    {  
    KoordinatenZurücksetzen; // auf den vorher gespeicherten Wert 
    Bewegungsvektor_Zurücksetzen; 
    }
    

    Code nicht getestet



  • Zerod schrieb:

    Aber trotzdem stehe ich dann immer noch vor dem problem, das wenn die schwerkraft den spieler nach unten drückt, kann er sich nicht bewegen da er ja dann an die Umgebung "angepasst" wird.

    Du musst auch nicht seine gesamte Bewegung anpassen, sondern im Falle der Gravitation zum Beispiel nur die vertikale Komponente (Y).

    Sinngemäss etwa so:

    -> Benutzereingaben abfragen
    -> Spieler entsprechend den Eingaben bewegen
    -> Kollision anwenden, Spielerbewegung und -position korrigieren
    

Anmelden zum Antworten