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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

21

29.10.2015, 17:41

Hat es damit was zu tun? Wenn nicht, weiß ich leider auch nicht weiter ):


SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

22

29.10.2015, 17:47

Probier mal dT.asSeconds() ;)
(Wie hast dT denn in deinem alten Code verwendet!?)

Edit:
Was ist r und was ist v in deinem Code?
Du solltest v erst clampen und danach damit arbeiten, wird beides funktionieren, so aktuell ist es aber eigentlich nicht ganz korrekt.
Auch kann ich empfehlen Variablennamen auszuschreiben, so könnte man statt a, das ganze "acceleration" nennen und statt v eventuell "velocity" oder "speed" und was r ist, ist mir nicht ganz klar.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SlinDev« (29.10.2015, 17:54)


cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

23

29.10.2015, 17:54

Probier mal dT.asSeconds() ;)
Ah, danke. Jetzt bekomme ich wenigstens keine Fehler vom Kompiler...

(Wie hast dT denn in deinem alten Code verwendet!?)
Ich hatte aus einem Buch eine Funktion gelernt, die das multiplizieren mit der deltaTime überflüssig macht. Wenn du den Code sehen willst, dann "sag" bescheid.

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

24

29.10.2015, 17:57

Ich hatte aus einem Buch eine Funktion gelernt, die das multiplizieren mit der deltaTime überflüssig macht. Wenn du den Code sehen willst, dann "sag" bescheid.

Dann zeig mal :) Vermutlich könntest du das dann auch wieder verwenden und auf dT verzichten.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

25

29.10.2015, 18:00

Ich hatte aus einem Buch eine Funktion gelernt, die das multiplizieren mit der deltaTime überflüssig macht. Wenn du den Code sehen willst, dann "sag" bescheid.

Dann zeig mal :) Vermutlich könntest du das dann auch wieder verwenden und auf dT verzichten.

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// ...

/*
    sf::Text mStatisticsText;
    sf::Time mStatisticsUpdateTime;
    std::size_t mStatisticsNumFrame;
*/

void Game::UpdateStatistics(sf::Time elapsedTime)
{
    mStatisticsUpdateTime += elapsedTime;
    mStatisticsNumFrame += 1;

    // Ist eine Sekunde vergangen?
    if (mStatisticsUpdateTime >= sf::seconds(1.0f))
    {
        mStatisticsText.setString(
            "Frames / Second = " + std::to_string(mStatisticsNumFrame) + "\n" +
            "Time / Update = " + std::to_string(mStatisticsUpdateTime.asMicroseconds() / mStatisticsNumFrame) + "us");

        mStatisticsUpdateTime -= sf::seconds(1.0f);
        mStatisticsNumFrame = 0;
    }
}

// ...

void Game::Run()
{
    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;

    while (App.isOpen())
    {
        ProcessEvents();
        Update(timeSinceLastUpdate);

        timeSinceLastUpdate += clock.restart();

        // Statisics updaten
        while (timeSinceLastUpdate > TimePerFrame)
        {
            timeSinceLastUpdate -= TimePerFrame;

            UpdateStatistics(timeSinceLastUpdate);
            ProcessEvents();
            Update(timeSinceLastUpdate);
        }

        UpdateStatistics(timeSinceLastUpdate);

        // Alles darstellen
        Render();
    }
}

// ...

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

26

29.10.2015, 18:12

Mir ist das Update da am Anfang nicht ganz klar und das UpdateStatistics am Ende, ansonsten kann man das durchaus so machen. Gut an dem Vorgehen ist, dass du immer genau weißt wie groß der Update step ist, wodurch es sehr schön deterministisch wird unabhängig vom System. Nachteil ist, dass je schwächer das System, desto mehr gibt es pro Frame zu tun, so dass man in dem Fall eventuell frühzeitig die Updateschleife abbrechen sollte oder so...

Wenn du das immernoch so verwendest, solltest du das dT aus dem Playercode rausschmeißen und mit TimePerFrame arbeiten, von wo auch immer die kommt (und eventuell auch das gleiche ist!?) (Mir ist klar dass das ein von dir festgelegter Wert ist, vielleicht könnte man einen globalen Define daraus machen oder so, aber ob das schön ist ist auch fraglich).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

27

29.10.2015, 18:21

vielleicht könnte man einen globalen Define daraus machen oder so, aber ob das schön ist ist auch fraglich
Nein, ist es nicht. Eine ordentliche Konstante hingegen macht durchaus Sinn.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

28

29.10.2015, 18:33

Schon mal danke für die Antworten :). Ich versuche es morgen mal (ich glaube, dass ich heute nichzt mehr in der Lage bin wirklich nachzudenken :dash: )

@zimmer

Alter Hase

Beiträge: 1 135

Wohnort: NRW Germany

  • Private Nachricht senden

29

29.10.2015, 20:59

kenn ich =) hab letztens das gleiche gesagt, als ich mir eine sehr komplizierte Rechnung ausgedacht habe, dann schlag ich dir vor eine Runde Video Games zu spielen :)

gruß @zimmer

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

30

31.10.2015, 15:51

dann schlag ich dir vor eine Runde Video Games zu spielen :)

Danke, das hilft ech Wunder :)

Aber zurück zum Problem. Bis jetzt sieht der Code so aus:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
    float accel = 0.1f;

    // Tastenabfrge
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
    {
        a.x = -accel;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
    {
        a.x = accel;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
    {
        a.y = -accel;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
    {
        a.y = accel;
    }

    v.x = v.x + (a.x * dT.asSeconds());  // Beschleunigung  ist die Änderung der Geschwindigkeit
    r.x = r.x + (v.x * dT.asSeconds());  // Geschwindigkeit ist die Änderung der Position

    v.y = v.y + (a.y * dT.asSeconds()); // Beschleunigung  ist die Änderung der Geschwindigkeit
    r.y = r.y + (v.y * dT.asSeconds());  // Geschwindigkeit ist die Änderung der Position

    // Bis jetzt würde das Schiff einfach weiter gleiten,
    // deshalb muss die Geschwindigkeit in jedem Frame reduziert werden.
    const float k = 0.55f;
    v.x *= k;
    v.y *= k;

    // Außerdem sollte man noch eine Maximalgeschwindigkeit angeben,
    // da die Geschwindigkeit sonst zu groß werden kann.
    const float maxvel = 100;
    if (v.x > maxvel)
    {
        v.x = maxvel;
    }
    if (v.x < -maxvel)
    {
        v.x = -maxvel;
    }

    // Sprite bewegen
    mSprite.move(v.x, v.y);

    dT.Zero;    // Zeit zurücksetzten
    a.x = 0;    // Beschleunigung auf NULL setzen, falls nichts gedrückt wird.
    a.y = 0;    // Beschleunigung auf NULL setzen, falls nichts gedrückt wird.


Aber anstatt eine flüssige Beschleunigung bzw. Entschleunigen, spüre ich keinen Unterschied zu vorher, auch wenn ich mit den Werten spiele. Außerdem wird der Spieler mit der Zeit immer schneller, obwohl ich doch am Ende dT auf 0 setzte. Wo ist schon wieder der Wurm drin? :pillepalle:

Werbeanzeige