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

22.02.2009, 14:59

SFML-Fragen

Hallo,

nachdem ich mit SDL angefangen habe und gucken wollte wie es mit anderen Grafiklib's ist habe ich mich für SFML entschieden.
Ich habe nun folgenden Code:

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 "stdafx.h"
#include <iostream>
#include <SFML/Graphics.hpp>






int main()
{
sf::Image Image;
    // Create the main rendering window

    sf::RenderWindow App(sf::VideoMode(800, 600, 16), "Test");

         if (!Image.LoadFromFile("ZombieStehen.bmp"))
             {
                 printf("Error loading image: zombie.jpg");
             }
        // Display window contents on screen



sf::Sprite Sprite;
Sprite.SetImage(Image);

Sprite.SetX(200.f);
Sprite.SetY(100.f);
Sprite.SetPosition(200.f, 100.f);

Sprite.SetCenter(0, 0);


Sprite.Move(10, 5);
//Sprite.Rotate(110);



float Width  = Sprite.GetSize().x;
float Height = Sprite.GetSize().y;
float ElapsedTime;
//Sprite.FlipX(true);

//Sprite.FlipY(true);

sf::Clock Clock;
App.SetFramerateLimit(60);
App.UseVerticalSync(false);
    // Start game loop

    while (App.IsOpened())
    {   
        
        ElapsedTime = App.GetFrameTime();
        
        
        /*
        ElapsedTime = Clock.GetElapsedTime();
        Clock.Reset();

        float Framerate = 1.f / App.GetFrameTime();
        */
        // Process events

        sf::Event Event;
        while (App.GetEvent(Event))
        {
            // Close window : exit

            if (Event.Type == sf::Event::Closed)
                App.Close();

            if (Event.Key.Code == sf::Key::F1)
                {
                    sf::Image Screen = App.Capture();
                    Screen.SaveToFile("Screenshot.jpg");
                } 

               if (App.GetInput().IsKeyDown(sf::Key::Left))  Sprite.Move(-100 * ElapsedTime, 0);
              
               if (App.GetInput().IsKeyDown(sf::Key::Right)) Sprite.Move( 100 * ElapsedTime, 0);
              
               if (App.GetInput().IsKeyDown(sf::Key::Up))    Sprite.Move(0, -100 * ElapsedTime);
             
               if (App.GetInput().IsKeyDown(sf::Key::Down))  Sprite.Move(0,  100 * ElapsedTime);
             

                // Rotate the sprite


        }
      
        // Clear the screen (fill it with black color)

      App.Clear(sf::Color(200, 0, 0));
      App.Draw(Sprite);


      App.Display();
    }

    return EXIT_SUCCESS;
}


Von dem ganzen Kommentierten bitte nicht ablenken lassen, bin momentan am rumexperimentieren.
Meine Frage ist, gibt es eine bessere Methode die Figur auf allen Rechnern "gleichschnell" laufen zu lassen? Ich meine damit das sie sich fast gleichschnell bewegen damit es nicht
von Rechner zu Rechner zu einem völlig unterschiedlichen Spielerlebnis kommt. (Gemeint ist ElapsedTime = App.GetFrameTime();),würde mich aber über Kommentare zu dem kommentierten freuen.)

Desweiteren möchte ich Fragen warum sich die Figur mit dieser Methode:

C-/C++-Quelltext

1
ElapsedTime = App.GetFrameTime(); 


schneller bewegt wenn ich die Maus im Programm bewege als wenn ich sie still im Programm lasse?

MfG
Bloore

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

2

22.02.2009, 15:10

Re: SFML-Fragen

1. Das wäre afaik die beste Methode.

2. Das ist ganz einfach:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
        while (App.GetEvent(Event))
        {
               //[...]

               if (App.GetInput().IsKeyDown(sf::Key::Left))  Sprite.Move(-100 * ElapsedTime, 0);
             
               if (App.GetInput().IsKeyDown(sf::Key::Right)) Sprite.Move( 100 * ElapsedTime, 0);
             
               if (App.GetInput().IsKeyDown(sf::Key::Up))    Sprite.Move(0, -100 * ElapsedTime);
             
               if (App.GetInput().IsKeyDown(sf::Key::Down))  Sprite.Move(0,  100 * ElapsedTime);
        }


Was macht "while (App.GetEvent(Event))" und was "App.GetInput()"?
Wenn du das weist solltest du eigentlich erkennen wieso durch Bewegen der Maus die Objekte sich schneller bewegen als ohne.
Tip: Wann gibt App.GetEvent(Event) true zurück und wann nicht (mehr)?
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

3

22.02.2009, 16:03

Also durch weglassen der Schleife von App.GetEvent(Event); erzielt man immernoch die selbe Wirkung von ElapsedTime = App.GetFrameTime();?
Vermutlich ne dumme Frage, würde mir aber helfen :P

MfG

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

4

22.02.2009, 16:10

App.GetEvent(Event) hat nichts mit App.GetFrameTime() zu tun.

Weglassen würde ich das aber nicht da man die Schleife trotzdem benötigt um z.B. abzufragen ob die Form geschlossen wurde.

Was ich aber meinte ist das die App.GetInput().IsKeyDown() abfragen nicht in die Schleife gehören sondern danach, sonst werden die so oft ausgeführt wie Ereignisse in der Ereignisliste sind und dementsprechend die Figur auch so oft bewegt.
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

5

22.02.2009, 16:13

Achso, das erklärt einiges, also die Schleife beibehalten und Events wie Screenshot und sowas drinn lassen. Vielen dank für die Hilfe.

Werbeanzeige