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

10.12.2016, 23:25

SFML kreis bewegt sich in lichtgeschwindigkeit

Hallo ich habe seit gefühlt ne ewigkeit das eine problem bei SFML wenn ich mein quellcode compilliere
das dann mein kreis sich in lichtgeschwindigkeit bewegt obwohl ich 60fps als limit genommen hab





hier die run() funktion

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Game::run()
{
    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    while (Window.isOpen())
    {
        ProcessEvents();
        timeSinceLastUpdate += clock.restart();
        while (timeSinceLastUpdate > TimePerFrame)
        {
            timeSinceLastUpdate -= TimePerFrame;
            ProcessEvents();
            update(TimePerFrame);

        }
        render();

    }
}


hier die update() funktion

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Game::update(sf::Time deltaTime)
{
    sf::Vector2f movement(0.f, 0.f);
    if (IsMovingUp)
        movement.y -= PlayerSpeed;
    if (IsMovingDown)
        movement.y -= PlayerSpeed;
    if (IsMovingLeft)
        movement.x -= PlayerSpeed;
    if (IsMovingRight)
        movement.x += PlayerSpeed;

    Shape.move(movement * deltaTime.asSeconds());
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

11.12.2016, 09:01

Und welchen Wert genau hat nun "PlayerSpeed" überhaupt? Könnte ja wichtig sein das mitzuteilen.
Die FPS sind bei dieser Art der Berechnung übrigens total unerheblich. Genau deswegen benutzt du ja deltaTime. Aber das muss ich dir vermutlich gar nicht erklären, du wirst ja wissen, was dein Code macht. Richtig? Die Sinnhaftigkeit des ProcessEvents in Zeile 12 zweifle ich allerdings mal an.
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (11.12.2016, 09:07)


3

11.12.2016, 11:00

Und welchen Wert genau hat nun "PlayerSpeed" überhaupt?

Eigentlich hat PlayerSpeed 1.f als wert und nicht mehr ich hab auch versucht denn wert zu verringern was aber nichts brachhte

Die Sinnhaftigkeit des ProcessEvents in Zeile 12 zweifle ich allerdings mal an.

Das es dort vlt. sinnlos steht hab ich auch gedacht aber so wurde es im buch als beispiel gezeigt

Genau deswegen benutzt du ja deltaTime. Aber das muss ich dir vermutlich gar nicht erklären/quote]
eigentlich hab ich deltatime noch nicht so richtig verstanden ich dachte wenn ich mir denn beispiel kompiliere
und mir mehrmals angucke und darüber nachdenke würde ich es langsam verstehn was sich aber in diesen beispiel nicht zeigen lässt

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

11.12.2016, 11:20

Ohne deinen restlichen Code kommen wir dann hier wohl nicht weiter, denn allein mit dem, was da oben steht und dem Wert 1.f lässt sich das Verhalten (welches auch immer das genau ist) jedenfalls nicht erklären.

TimePerFrame hat welchen Wert?
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]

5

11.12.2016, 11:33

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "game.h"

Game::Game() : Window(sf::VideoMode(640, 480), "SFML"), Shape()
{
    TimePerFrame = sf::seconds(1.f / 60.f);

    Window.setFramerateLimit(60);
    float PlayerSpeed = 1.f;
    Shape.setRadius(40.f);
    Shape.setPosition(100.f, 100.f);
    Shape.setFillColor(sf::Color::Cyan);
}

void Game::run()
{
    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    while (Window.isOpen())
    {
        ProcessEvents();
        timeSinceLastUpdate += clock.restart();
        while (timeSinceLastUpdate > TimePerFrame)
        {
            timeSinceLastUpdate -= TimePerFrame;
            ProcessEvents();
            update(TimePerFrame);

        }
        render();

    }
}

void Game::ProcessEvents()
{
    sf::Event Event;
    while (Window.pollEvent(Event))
    {
        switch (Event.type)
        {
        case sf::Event::KeyPressed:
            handlePlayerInput(Event.key.code, true);
            break;
        case sf::Event::KeyReleased:
            handlePlayerInput(Event.key.code, false);
            break;
        case sf::Event::Closed:
            Window.close();
            break;
        }
    }
    
}

void Game::update(sf::Time deltaTime)
{
    sf::Vector2f movement(0.f, 0.f);
    if (IsMovingUp)
        movement.y -= PlayerSpeed;
    if (IsMovingDown)
        movement.y -= PlayerSpeed;
    if (IsMovingLeft)
        movement.x -= PlayerSpeed;
    if (IsMovingRight)
        movement.x += PlayerSpeed;

    Shape.move(movement * deltaTime.asSeconds());
}

void Game::render()
{
    Window.clear();
    Window.draw(Shape);
    Window.display();
}

void Game::handlePlayerInput(sf::Keyboard::Key key, bool isPressed)
{
    if (key == sf::Keyboard::W)
        IsMovingUp = isPressed;
    else if (key == sf::Keyboard::S)
        IsMovingDown = isPressed;
    else if (key == sf::Keyboard::S)
        IsMovingLeft == isPressed;
    else if (key == sf::Keyboard::D)
        IsMovingRight == isPressed;

hier ist der rest des codes keine ahnung warum ich nur abschnitte poste :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

11.12.2016, 12:08

In Zeile 8 machst du einen ganz bösen Fehler. Vielleicht kommst du ja drauf welchen.
Der Fehler hätte dir übrigens auffallen können, wenn du deinen Debugger kennen und nutzen würdest (F9, F5, F10, F11).
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]

7

11.12.2016, 12:56

Ich glaub der fehler ist das ich dort float stehen habe was dann eigentlich eine variable deklariert

8

11.12.2016, 13:41

Ok ich hab das problem irgend wie gelöst weiss selber nicht mal wie ich es gelösst habe es hat sich nicht viel verändert

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "game.h"
#include <iostream>

Game::Game() : Window(sf::VideoMode(640, 480), "SFML"), Shape()
{
    TimePerFrame = sf::seconds(1.f / 240.f);

    Shape.setRadius(40.f);
    Shape.setPosition(100.f, 100.f);
    Shape.setFillColor(sf::Color::Cyan);
}

Game::~Game()
{

}

void Game::run()
{
    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    while (Window.isOpen())
    {
        ProcessEvents();
        timeSinceLastUpdate += clock.restart();
        while (timeSinceLastUpdate > TimePerFrame)
        {
            std::cout << 1.0f / timeSinceLastUpdate.asSeconds() << std::endl;
            timeSinceLastUpdate -= TimePerFrame;
            ProcessEvents();
            update(TimePerFrame);

        }
        render();

    }
}

void Game::ProcessEvents()
{
    sf::Event Event;
    while (Window.pollEvent(Event))
    {
        switch (Event.type)
        {
        case sf::Event::KeyPressed:
            handlePlayerInput(Event.key.code, true);
            break;
        case sf::Event::KeyReleased:
            handlePlayerInput(Event.key.code, false);
            break;
        case sf::Event::Closed:
            Window.close();
            break;
        }
    }
    
}

void Game::update(sf::Time deltaTime)
{
    float PlayerSpeed = 50.f;
    sf::Vector2f movement(0.f, 0.f);
    if (IsMovingUp)
        movement.y -= PlayerSpeed;
    if (IsMovingDown)
        movement.y += PlayerSpeed;
    if (IsMovingLeft)
        movement.x -= PlayerSpeed;
    if (IsMovingRight)
        movement.x += PlayerSpeed;

    Shape.move(movement * deltaTime.asSeconds());
}

void Game::render()
{
    Window.clear();
    Window.draw(Shape);
    Window.display();
}

void Game::handlePlayerInput(sf::Keyboard::Key key, bool isPressed)
{
    if(key == sf::Keyboard::W)
        IsMovingUp = isPressed;
    else if (key == sf::Keyboard::S)
        IsMovingDown = isPressed;
    else if (key == sf::Keyboard::A)
        IsMovingLeft = isPressed;
    else if (key == sf::Keyboard::D)
        IsMovingRight = isPressed;

}

ich hab nur den PlayerSpeed in der update funktion deklariert

Tobiking

1x Rätselkönig

  • Private Nachricht senden

9

11.12.2016, 14:12

ich hab nur den PlayerSpeed in der update funktion deklariert

Das was du da tust ist Variable Shadowing. Du kannst in einem inneren Scope (bei dir die Funktion) eine Variable mit den gleichen Namen deklarieren wie eine in einem äußeren Scope (bei dir vermutlich in der Klasse). Die Variable ist wie sonst auch nur in dem Scope gültig und überdeckt die in dem äußeren Scope. Deine Wertzuweisung im Konstruktor setzt also den Wert der neue Variable, während du in der Update Funktion den Wert aus der Klasse nimmst, der vermutlich gar nicht gesetzt ist.

Die richtige Lösung wäre also deinen ersten Code zu nehmen und einfach das float vor der Zuweisung zu entfernen. Damit weist du den Wert der Variable zu, statt eine neue Variable zu erzeugen.

10

11.12.2016, 16:43

okay danke für die schnelle hilfe aber jetzt hab ich ein anderes problem jetzt bewegt sich der kreis in die falsche richtung ohne pause

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "game.h"
#include <iostream>

Game::Game() : Window(sf::VideoMode(640, 480), "SFML"), Shape()
{
    TimePerFrame = sf::seconds(1.f / 1000.f);
    PlayerSpeed = 50.f;
    Shape.setRadius(40.f);
    Shape.setPosition(100.f, 100.f);
    Shape.setFillColor(sf::Color::Cyan);
}

Game::~Game()
{

}

void Game::run()
{
    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    while (Window.isOpen())
    {
        ProcessEvents();
        timeSinceLastUpdate += clock.restart();
        while (timeSinceLastUpdate > TimePerFrame)
        {
            std::cout << 1.0f / timeSinceLastUpdate.asSeconds() << std::endl;
            timeSinceLastUpdate -= TimePerFrame;
            ProcessEvents();
            update(TimePerFrame);

        }
        render();

    }
}

void Game::ProcessEvents()
{
    sf::Event Event;
    while (Window.pollEvent(Event))
    {
        switch (Event.type)
        {
        case sf::Event::KeyPressed:
            handlePlayerInput(Event.key.code, true);
            break;
        case sf::Event::KeyReleased:
            handlePlayerInput(Event.key.code, false);
            break;
        case sf::Event::Closed:
            Window.close();
            break;
        }
    }

}

void Game::update(sf::Time deltaTime)
{

    sf::Vector2f movement(0.f, 0.f);
    if (IsMovingUp)
    {
        movement.y -= PlayerSpeed;
    }
    if (IsMovingDown)
    {
        movement.y += PlayerSpeed;
    }
    if (IsMovingLeft)
    {
        movement.x -= PlayerSpeed;
    }
    if (IsMovingRight)
    {
        movement.x += PlayerSpeed;
    }
    Shape.move(movement * deltaTime.asSeconds());
}

void Game::render()
{
    Window.clear();
    Window.draw(Shape);
    Window.display();
}

void Game::handlePlayerInput(sf::Keyboard::Key key, bool isPressed)
{
    if (key == sf::Keyboard::W)
        IsMovingUp = isPressed;
    else if (key == sf::Keyboard::S)
        IsMovingDown = isPressed;
    else if (key == sf::Keyboard::A)
        IsMovingLeft = isPressed;
    else if (key == sf::Keyboard::D)
        IsMovingRight = isPressed;

}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CrazylLoLipop33« (11.12.2016, 17:07)


Werbeanzeige