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

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

28.10.2012, 21:12

[Gelöst]SFML 2 Eingabe

N'abend,

Da ich von C# und XNA auf C++ und die SFML umgestiegen bin, wollte ich einfach etwas einfaches programmieren um mich zu Anfang mit der Syntax und funktionsweise etwas auseinander zu setzen.

Leider ist mir beim einfachen Pong schon etwas komisches aufgefallen.

Ich verwende "W" und "S" um das Spieler Paddle zu bewegen. Wenn man W nun gedrückt hält damit sich das Paddle nach oben bewegt, macht dieses zunächst eine Bewegung(also einmal -=10) und nach einer kurzen Verzögerung fängt dann erst die "fliessende" Bewegung an. Bei "S" ist es das gleiche nur halt nach unten.

Ist das etwa normal in SFML, muss man etwas berücksichtigen oder habe ich einen Fehler gemacht?

Hier der Code :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
            case sf::Event::KeyPressed:
                switch(Event.key.code)
                {
                case sf::Keyboard::W:
                    playerPosition.y -= 10;
                    break;
                case sf::Keyboard::S:
                    playerPosition.y += 10;
                    break;
                default: break;
                }


Ich setze einfach mal voraus dass ihr Pong kennt :D
mfg,
ERROR

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ERROR« (29.10.2012, 17:37)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

28.10.2012, 21:42

Da ich Einzeilenantworten liebe:
http://www.sfml-dev.org/tutorials/2.0/window-inputs.php

ansonsten: Bist du dir sicher, dass du das Paddle 10 Pixel pro Frame bewegen willst?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Durza

Treue Seele

Beiträge: 104

Beruf: Student (MSc Cyber Security)

  • Private Nachricht senden

3

28.10.2012, 21:50

Ich würde eine Verschiebung des Spielers nie ohne Timer implementieren...

Durza

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

4

28.10.2012, 22:15

Kleine Erklärung, wieso bei dir dieses Phänomen auftaucht:

Du benutzt für das Movement die Event-Abfrage des Renderwindows, dieses bekommt seine Events von Windows zugespielt. Windows schickt aber auch nur die Tastendrücke ab, die es auch erkennen soll und macht zwischendurch Pausen (zu sehen in der Systemsteuerung unter Tastatur/Geschwindigkeit/Zeichenwiederholung).

Daher sollte man für den Input, wenn er die Bewegungen steuern soll, lieber die Möglichkeit nehmen, die NachoMan bereits geposted hat if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)).

Ansonsten wiederhole ich auch nochmal den Vorschlag von Durza, das ganze nicht mittels fester Werte, sondern mit dem Timer als Parameter zu steuern.

Nim
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

5

28.10.2012, 23:20

z.B. so (hatte ich grad rumliegen ;) )

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
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "Resize");
    window.setFramerateLimit(60);

    sf::RectangleShape rect(sf::Vector2f(50.f, 50.f));
    rect.setFillColor(sf::Color::Blue);

    sf::Clock clock;

    float dt = 0.f; // Deltatime/Frametime
    float speed = 10.f; // 10 pixel pro Sekunde

    while(window.isOpen())
    {
        dt = clock.restart().asSeconds();

        sf::Event event;
        while(window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
                window.close();
        }

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
        {
            rect.move(0.f, dt*speed);
        }

        window.clear();
        window.draw(rect);
        window.display();
    }
}
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/

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »eXpl0it3r« (29.10.2012, 09:40)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

29.10.2012, 08:59

Hat sf::RectangleShape keine Movemethode mehr?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

7

29.10.2012, 09:41

Hat sf::RectangleShape keine Movemethode mehr?
Ah doch, doch, geht somit natürlich viel einfacher. *fixed* :D
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/

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

8

29.10.2012, 17:36

Vielen Dank Leute, habe es umgebaut und jetzt geht alles einwandfrei ;)

Danke und grüsse
ERROR

Werbeanzeige