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

11

16.08.2012, 11:13

Ja, so wollte ich das ja machen. Die Kollisionsabfrage in der Game-Klasse.
Vielen Dank für eure Hilfe, ich werde mich demnächst dransetzen und berichten.

12

17.08.2012, 13:08

Ich habe jetzt die Kollisionsabfrage in die Game-Klasse verlagert.
Jetzt habe ich aber das Problem, dass wenn man sich schräg bewegen möchte (z.B. W+D) die Kollisionsfunktion nicht richtig funktioniert.
Dazu ein kleiner Ausschnitt:

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
37
// CheckMovement
//
void CPlayer::CheckMovement()
{
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
    {
        
        Move(0, -10);
        cout << "w" << endl;

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
        {
            Move(-10, 0);
            cout << "wa" << endl;
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
        {
            Move(10, 0);
            cout << "wd" << endl;
        }
    }
    else if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
    {
        Move(-10, 0);
        cout << "a" << endl;
    }   
    else if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
    {
        Move(10, 0);
        cout << "d" << endl;
    }
    else if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
    {
        Move(0, 10);
        cout << "s" << endl;
    }
} // CheckMovement


Es wird im Falle einer schrägen Bewegung zwei Mal die Move-Methode ausgeführt,
die Kollisionsabfrage allerdings nicht nach jeder der beiden, sondern erst nach der zweiten Move.
So wird zwar festgestellt, dass eine Kollision stattfindet, allerdings kann ich diese nicht beheben, da das Zurücksetzen auf die alten Koordinaten ja nicht richtig funktioniert,
weil die Koordinaten vor dem ersten Move beim zweiten Aufruf von Move überschrieben werden.
Wie soll ich dieses Problem beheben.

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

13

17.08.2012, 13:22

Die einfache aber weniger schöne Lösung ist, jede Möglichkeit exklusiv zu überprüfen, d.h. du musst das schauen ob D gedrückt ist aber gleichzeitig W nicht und dann eine andere überprüfung um zu sehen ob D und W gedrückt sind, somit hättest du für jede Richtung einen Aufruf von Move(...).
Eine etwas bessere Lösung ist, die alte Position zu speichern, bevor die CheckMovement Funktion aufgerufen wird, somit kannst du zur alten Position zurückkehren wann immer du willst.
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

14

17.08.2012, 13:48

Ok, danke, das Problem wäre gelöst,
allerdings kann man wenn man z.B. oben kollidiert nicht mehr nach l. und r. während man W drückt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Nathax« (17.08.2012, 14:00)


Werbeanzeige