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

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

11

27.04.2012, 21:52

Ja, nach so etwas in der Art habe ich auch schon gesucht. Habe aber nur Window.setFramerateLimit() gefunden, welches jedoch nur die Maximale Framerate setzt... Kennt sich jemand mit sfml 2 aus?

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

12

27.04.2012, 23:06

Meines Wissens nach gibt es das in SFML 2.0 so nicht mehr.
Ich hab das einfach folgendermaßen gelöst:

Vor der Spielschleife:

C-/C++-Quelltext

1
2
3
sf::Clock Clock;
Clock.restart ();
sf::Time ElapsedTime;


In der Spielschleife:

C-/C++-Quelltext

1
ElapsedTime = Clock.restart ();


Jetzt hast du dann das Objekt ElapsedTime und kannst dir die vergangene Zeit nach jedem Frame als Sekunde, Millisekunde oder was auch immer zurückgeben lassen (wenn du Geschwindigkeit in Sekunden angibst, verwendest du das einfach auch in Sekunden).

Ich hoffe, ich konnte dir helfen.

13

27.04.2012, 23:10

sf::RenderWindow::GetFrameTime() tuts auch. ;)

MfG
Check

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

14

27.04.2012, 23:13

sf::RenderWindow::GetFrameTime()

Nicht bei SFML 2.0, da gibts das nicht mehr. ;)

15

27.04.2012, 23:27

Ich benutze SFML 2 selbst. :crazy:
Wenn es halt fehlt dann so wie du es erklärt hast. *g*
Jedoch: Meines Wissens wurde GetElapsedTime nur zu GetFrameTime umbenannt.

MfG
Check

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

16

27.04.2012, 23:44

Seltsam. Dann hast du wohl eine andere Version als ich, bei der neuersten version sind nämlich auch alle Anfangsbuchstaben von Funktionen in Kleinbuchstaben gehalten. Und da gibts das eben nicht mehr.

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

17

29.04.2012, 16:29

Okay, danke für die ganzen Antworten. Bewegung klappt nun super. Allerdings habe ich jetzt noch ein kleines Problem mit der Tastenabfrage: Ich habe eine while-Schleife eingebaut in der die Events abgefragt werden. Außerdem habe ich außerhalb dieser while-Schleife (noch vor der Window.display(); Funktion folgende weitere Schleife:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
while(skippedTime > 0.01)
        {
            if (Event.key.code == sf::Keyboard::Down)
            {
                Sprite.setPosition(vec.x, vec.y+=Yspeed);
            }

            skippedTime -= 0.01;
        }


Diese ist für das Update da, welches jedes Bild pro Sekunde ausgeführt wird. Habe, um das ganze mal zu testen, diese if () Funktion mit eingebaut. Funktioniert prima. Allerdings habe ich nun das Problem, dass ich in die Update-Schleife keine switch case - Abfrage für die Bewegungstasten einbauen will... Andersherum geht es ebenfalls nicht, ich kann die Update-Schleife nicht in die switch case Schleife einbauen, weil sich dann mein Sprite nur noch total verkrüppelt bewegt -.-*

Um das ganze mal etwas klarer zu machen, hier mein gesamter Quellcode. In Zeile 63 soll nun die Abfrage für die gedrückte Richtungstaste hineinkommen...

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
// Erstes Projekt mit sfml 2.0
// Ein Image bewegen
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <SFML\System.hpp>
#include <SFML\System\Vector2.hpp>
#include <iostream>

using namespace std;

// FPS initialisieren
sf::Clock timer;

double skippedTime = 0;

// Hauptprogramm
//
int main()
{
    // Videomode
    sf::VideoMode VMode(800, 600, 32);
    sf::RenderWindow Window(VMode, "sfml 2.0 - moving image");
    
    // Texture Laden
    sf::Texture Texture;
    if(!Texture.loadFromFile("player.png"))
    {
        return 1;
    }

    // Sprite initialisieren
    sf::Sprite Sprite;
    Sprite.setTexture(Texture);

    sf::Vector2f vec = Sprite.getPosition();
    vec.x;
    vec.y;

    // Geschwindigkeit initialisieren
    float Yspeed = 1.0f;
    float Xspeed = 1.0f;
        
    Window.setFramerateLimit(30);

    // Gameloop
    while(Window.isOpen())
    {
        const double elapsedTime = timer.restart().asSeconds();
        skippedTime += elapsedTime;

        sf::Event Event;
        while(Window.pollEvent(Event))
        {
            switch(Event.type)
            {
                case sf::Event::Closed:
                    std::cout << "The window was closed." << std::endl;
                    Window.close();
                    break;

                case sf::Event::KeyPressed:
                    //
                    // Bewegung
                    //
                    break;

                default:
                    break;
            }
        }

        while(skippedTime > 0.01)
        {
            if (Event.key.code == sf::Keyboard::Down)
            {
                Sprite.setPosition(vec.x, vec.y+=Yspeed);
            }

            skippedTime -= 0.01;
        }

        // running fps
        Window.clear(sf::Color(255, 255, 255));
        Window.draw(Sprite);
        Window.display();
    }

    return 0;
}

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

18

29.04.2012, 19:43

Erzeug dir einfach eine Instanz von sf::Keyboard und frag mit der Funktion isKeyDown (Key) bei jedem Schleifendurchlauf ab, ob die Taste gedrückt ist. So kannst du deine Bewegung dann ganz einfach realisieren.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

29.04.2012, 20:16

Mal so als kleiner Denkanstoß für Luca:

0.01+0.01+0.01+0.01+0.01+0.01 = 6 * 0.01

Stabiler, kürzer, schneller.
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]

Werbeanzeige